常见八股文02

发布于:2025-02-11 ⋅ 阅读:(61) ⋅ 点赞:(0)
11.线程状态

新建状态、就绪状态,运行状态,死亡状态,中间还可以产生堵塞。(哪些方法可能产生堵塞,wait、sleep、IO等等)

12.实现线程方式

继承Thread类、重写Runnable接口、Callable接口、通过线程池启动多线池。

13.线程死锁原因

系统资源不足、资源分配不当、线程推进顺序不当

14.如何唤醒线程

调用此对象的notify()方法或notifyAll()方法。

等sleep结束自然醒

15.线程池常用参数

corePoolSize(核心线程数)

maximumPoolSize(最大线程数)

keepAliveTime(空闲线程存活时间)

unit(存活时间单位)

workQueue(任务队列)

threadFactory(线程工厂)

handler(任务拒绝策略)

16.list set Map区别?

从元素方面:List可重复,Set、Map不可重复

从顺序方面:List是有序的,Set可能是无序的。

从常见实现类方面:List:ArrayList、LinkedList等 Set:HashSet、LinkedHashSet Map:HashMap

17.list set map底层数据结构?

ArrayList:数组 HashSet:哈希表 TreeMap:红黑树 LinkedHashMap:链表和哈希表

LinkedList:链表 HashMap:哈希表 TreeSet:红黑树(一种自平衡的二叉搜索树) LinkedHashSet:链表和哈希表

Hashtable:哈希表

18.集合理解

首先,集合分为单列集合List、Set和双列集合Map

从元素方面:List可重复,Set、Map不可重复

从顺序方面:List是有序的,Set可能是无序的。

其次List包括Vector(实现List接口,与ArrayList相比几乎相同,但是线程安全)、ArrayList、LinkedList;Set包括HashSet(包括LinkHashSet)、TreeSet;Map包括HashMap、TreeMap

接着从底层数据结构方面看,

Vector:数组、ArrayList:数组、LinkedList:链表(ArrayList、LinkedList、Vector的区别?

相同点:二者都是有序的,父类为List

不同点:二者的底层结构不一样。

ArrayList的底层数据结构的数组结构,数组结构有个特点是查询快,因为它里面有索引,但是增加和删除慢,因为增加的时候需要考虑扩容机制。

LinkedList的底层数据结构是链表结构,链表结构增加和删除快,因为它们内部都有一个节点保存其地址值。但是查询慢,因为它们没有对应的索引操作。

Vector的底层数据结构是动态数组,线程安全,多用于多线程。)

HashSet:哈希表、TreeSet:红黑树(一种自平衡的二叉搜索树)、LinkedHashSet:链表和哈希表

HashMap:哈希表、TreeMap:红黑树

19.线程安全的集合
(1)Vector,实现List接口,与ArrayList相比几乎相同,但是是线程安全的。底层是数组。

(2)Stack,继承Vector类,先进后出。

(3)HashTable,实现Map接口,与HashMap几乎完全相同,但是是线程安全的。

(4)concurrent包下的所有集合类,需要注意的是该包下都是线程并发编程写好的一些工具类,减少咱们自己写代码造成死锁的操作,比如ConcurrentHashMap集合就是平替hashMap的,因为hashMap 是线程不安全的,所以在多线程情况下,有可能出现死循环的情况,那么这种情况,咱们就可以使用该集合平替。

20.集合扩容(ArrayList)

首先,ArrayList是基于数组实现的,因此其扩容机制与数组的大小调整有关。当ArrayList中的元素数量达到其内部数组的容量上限时,就需要进行扩容操作。

其次,扩容的具体过程是:ArrayList会创建一个新的数组,其容量通常是原数组容量的1.5倍(有时也可能是其他倍数,但1.5倍是较为常见的做法)。然后,ArrayList会使用System.arraycopy()方法将原数组中的元素复制到新数组中。这个复制过程是为了保持原有元素的顺序和值不变。

最后,扩容完成后,ArrayList会更新其内部的引用,使其指向新的数组。这样,ArrayList就可以继续添加新的元素了。需要注意的是,扩容操作是一个相对耗时的过程,因为它涉及数组的复制和引用更新。因此,在实际应用中,为了避免频繁的扩容操作带来的性能损耗,可以在创建ArrayList时通过构造函数指定一个合适的初始容量。

21.TCP的三次握手和四次挥手

三次握手

第一次握手,客户端向服务器端发送数据

第二次握手,服务端接收客户端发来的数据,接受数据后又向客户端回复一个带有确定标志的数据包

第三次握手,客户端收到服务器的数据包后,客户端会向服务器端发送带有一个确定标志的数据包

四次挥手

第一次挥手,客户端完成数据发送后,会向服务器发一个FIN段,标记为FIN=1,它表示它不在发送任何消息,但是可以接收消息。

第二次挥手,服务器收到客户端发来的FIN后,会回复一个ACK,保证确定号=客户端的系列号+1

第三次挥手,服务器发送所有数据后,会向客户端发送一个FIN段,表示数据也停止发送数据

第四次挥手,客户端回复一个ACK段,确定号=服务器的序列号+1,接受到服务器的终止请求。

22.get和post区别

从安全性方面:GET安全性低,POST安全性高

从使用场景方面:GET常用于从服务器获取数据,如读取数据库记录、查询API等。POST常用于向服务器提交数据,如创建新资源、更新数据、删除数据等。

从缓存方面:GET请求通常可以被缓存,而POST请求通常不会被缓存

从历史记录方面:GET请求的记录会留在浏览器历史记录中,而POST请求的记录通常不会留在历史记录中。

23.jQuery的选择器有哪些

1.基本选择器:

元素选择器、ID选择器、类选择器、属性选择器、组合选择器

2.层次选择器

子元素选择器、后代元素选择器、相邻兄弟元素选择器、一般兄弟元素选择器

3.过滤选择器

基本过滤选择器、内容过滤选择器、可见性过滤选择器、属性过滤选择器、状态过滤选择器

4.表单选择器

$(":input"):选择所有<input>、<textarea>、<select>和<button>元素。
$(":text"):选择所有的单行文本框(等价于$("[type=text]"),但推荐使用$("input:text")以提高效率)。
$(":password"):选择所有的密码框。
$(":radio"):选择所有的单选按钮。
$(":checkbox"):选择所有的复选框。
$(":submit"):选择所有的提交按钮。
$(":reset"):选择所有的重置按钮。
$(":button"):选择所有的按钮(包括<input type="button">和<button>...</button>)。
$(":file"):选择所有的文件域。
$(":hidden"):选择所有不可见的元素(包括<input type="hidden">)。

5.其他选择器

子元素过滤选择器、伪类选择器

24.TCP和udp区别

传输控制协议和用户数据报协议

从连接性方面,TCP是一种面向连接的协议,要求在数据传输前先要建立一个链接;UDP是一种无连接协议,不需要提前建立连接。

从速度和效率方面,TCP速度慢,UDP速度快

25.事务的四大特性及应用

四大特性:原子性、一致性、隔离性、持久性

应用:

银行转账:转账操作需要保证两个账户的资金总额不变,因此需要在一个事务中同时更新两个账户的资金余额。如果转账过程中发生任何错误,事务会回滚,确保两个账户的资金余额保持不变。

库存管理:在库存管理系统中,商品的入库、出库、盘点等操作需要在一个事务中完成。这可以确保库存数据的准确性和一致性,避免出现库存数量不一致的问题。

用户注册:在用户注册系统中,创建用户账号、分配权限、记录日志等操作需要在一个事务中完成。如果其中任何一步失败,事务会回滚,确保用户账号不会被创建成功,权限不会被分配,日志也不会被记录。

26事务的隔离级别

读未提交、读已提交、可重复读、串行化

允许一个事务读取另一个事务尚未提交的数据

一个事务只能允许读取已经提交的数据

一个事务在执行期间可以读取相同的数据且结果是一样的

通过强制事务串行来执行并发问题

27.事务的并发问题

脏读、不可重复读和幻读

事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致

系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

28.mysql优化

select语句中避免使用*

只需要一行数据的时候使用limit 1

将where中用的比较频繁的字段建立索引

减少使用join查询次数

减少子查询的次数

对大数据量的查询,使用分页查询、分区表

使用动态SQL,避免生成多余复杂的语句,防止SQL注入

29.索引的使用原则

选择唯一性索引

为常作为查询条件的字段建立索引:

限制索引的数目

考虑索引字段的长度

索引列不能参与计算

尽量扩展索引而非新建

根据查询需求优化索引

定期维护索引

30.索引类型

单列索引、复合索引、唯一索引、主键索引

只包含一个列的数据

包含多个列的数据,满足多个查询条件

要求列中数据是唯一的,不能出现重复值

要求列中数据是唯一的,且不能为空

31.索引在什么情况下会失效

数据类型不匹配

使用不支持索引的运算符

索引列上的值分布不均匀

对表进行了大量增删改操作

多表连接查询中的索引失效

查询条件中使用了IS NULL或IS NOT NULL

查询条件中使用了表达式操作

使用了OR运算

32.delete、drop、truncate区别

从影响范围方面,delete和truncate只是删除表数据;drop将表结构和表数据一起删除。

从执行速度方面,drop>truncate>delete

从事务处理和可回滚性方面,delete操作完成后,如果不想提交事务,还可以回滚;truncate和drop操作完成后,不能回滚。

33.delete和distinct区别

DELETE用于删除表中的数据,而DISTINCT用于查询不重复的数据。

DELETE是数据操作语言语句,可以回滚;而DISTINCT是SELECT语句的一部分,用于去重查询结果。

34.一对一,一对多,多对多

一个表中的一条记录与另一个表中的一条记录有且仅有一个对应关系。

一个表中的一条记录可以与另一个表中的多条记录相关联。

一个表中的多条记录可以与另一个表中的多条记录相关联。