JAVA SE 面试题

 

JAVA SE

List中ArrayList和LinkedList的区别

List集合遍历的结果都是稳定的。ArrayList是容量可以改变的非线程安全的集合。内部实现使用数组进行存储,集合的扩容会从创建更大的数组空间,把原有的数组复制到新的数组中。支持对元素的快速随机访问因为是数组。

JAVA中的LinkedList是双链表结构,大量数据的查询效率会非常差,但是增删数据节点的效率更高。继承AbstractList实现Deque接口,所以有队列和栈的性质。具体的使用在Collection接口中说到过了。

ArrayList和HashMap的初始化以及不同JDK版本的区别

ArrayList是存储单个元素的顺序表结构。而HashMap是存储KV键值对的哈希式结构。

ArrayList实现了List、RandomAccess在内的一些接口。这些接口主要是定义和设计它是如何初始化的。ArrayList的源码中规定了它的默认大小是10,每当使用add方法增加元素的时候,如果容量不够就会自动调用它其中的grow()方法来扩容,具体扩容在JDK7前后的机制是不一样的,JDK7以前是 *3/2+1的方式获取新的容量,之后采用的是扩容1.5倍。具体如何扩充代码实现可以查看对应的源码。

所以在初始化ArrayList的时候应当给它赋予初始值,不然会出现这样的情况:存储1000个元素会被动的扩容13才可以完成存储。甚至这个值非常大的时候,在扩容的时候会出现内存溢出的状况,具体可以查看源码。

HashMap它在JDK1.7之前是数组和链表的形式。1.8之后结构变成了数组链表以及红黑树。红黑树的引入是为了防止并发时形成链表的回环状况。----这里红黑树以及原理实现目前也云里雾里更别说实现了,这与阿里大佬差距简直如银河,后面学会了会过来更新。它的初始化通过分析源码可有俩个重要的参数,一个是Capacity决定了存储容量的大小。另一个LoadFactor决定了填充比例是0.75。以它俩的乘积来表示HashMap中能存放的元素的个数。

HashMap默认的大小是16.容量的大小都是2n,这样的方式是的元素在存储的时候计算落槽的位置更快。log21000=9.96,在未初始化大小的下存储1000个元素需要进行7次扩容,所以尽量进行2n这样的初始容量来减少扩容带来的性能的损耗。

JVM内存模型

JAVA中内存主要分为堆栈区(Stacks)和堆区(Heap),具体在JVM加载执行类文件的时候,大致可分为以下部分,如图:JAVA SE 面试题_第1张图片

 

你可能感兴趣的:(JAVASE)