面试【JAVA基础】集合类


1、ArrayList的扩容机制

  1. 每次扩容是原来容量的1.5倍,通过移位的方法实现。
  2. 使用copyOf的方式进行扩容。

扩容算法是首先获取到扩容前容器的大小。然后通过oldCapacity (oldCapacity >> 1) 来计算扩容后的容器大小newCapacity。这里用到了>> 右移运算,即容量增大原来的1.5倍。还要注意的是,这里扩充容量时,用的时Arrays.copyOf方法,其内部也是使用的System.arraycopy方法。
区别:

  • arraycopy()需要目标数组,将原数组拷贝到你自己定义的数组里,而且可以选择拷贝的起点和长度以及放入新数组中的位置。
  • copyOf()是系统自动在内部新建一个数组,并返回该数组。

2、数组和ArrayList的区别

  1. 数组可以包含基本类型,ArrayList成员只能是对象。
  2. 数组大小是固定的,ArrayList可以动态扩容。

3、ArrayList和LinkedList的区别

  • 线程安全
    ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
  • 数据结构
    LinkedList 是基于双向链表实现的,ArrayList 是基于数组实现的。
  • 快速随机访问
    ArrayList 支持随机访问,所以查询速度更快,LinkedList 添加、插入、删除元素速度更快。
  • 内存空间占用
    ArrayList的空间浪费主要体现在在list列表的结尾会预留一定的容量空间,LinkedList使用Node来存储数据每个Node中不仅存储元素的值,还存储了前一个 Node 的引用和后一个 Node 的引用,占用内存更多。
  • 遍历方式选择
    实现了RandomAccess接口的list,优先选择普通for循环 ,其次foreach,
    未实现RandomAccess接口的list, 优先选择iterator遍历(foreach遍历底层也是通过iterator实现的),大size的数据,千万不要使用普通for循环。

4、如何创建同步的List

可以通过Collections.sychronizeList将list转换成同步list,或者直接使用CopyOnWriteArrayList。

5、CopyOnWriteArrayList

  1. 读时不加锁,写入时加锁,写入时创建一个新入组将老数组拷贝进入新数组,并将数据加入新数组。
  2. 只能保证最终一致性。

6、Vector

ArrayList线程安全的一个版本,底层通过synchronize加锁实现线程安全。

7、HashMap扩容机制

HashMap使用resize()方法来进行扩容,计算table数组的新容量和Node在新数组中的新位置,将旧数组中的值复制到新数组中,从而实现自动扩容。

  1. 当空的HashMap实例添加元素时,会以默认容量16为table数组的长度扩容,此时 threshold = 16 * 0.75 = 12。
  2. 当不为空的HashMap实例添加新元素数组容量不够时,会以旧容量的2倍进行扩容,当然扩容也是大小限制的,扩容后的新容量要小于等于规定的最大容量,使用新容量创建新table数组,然后就是数组元素Node的复制了,计算Node位置的方法是 index = (n-1)

原文地址:https://www.cnblogs.com/clawhub/p/12064422.html

时间: 2024-10-31 00:54:08

面试【JAVA基础】集合类的相关文章

细节!重点!易错点!--面试java基础篇(二)

今天来给大家分享一下java的重点易错点第二部分,也是各位同学面试需要准备的,欢迎大家交流指正. 1.字符串创建与存储机制:当创建一个字符串时,首先会在常量池中查找是否已经有相同的字符串被定义,其判断的依据是String类型equals的返回值,若已经定义,则直接获取对其的引用.此时不需要创建新的对象,如果没有定义,首先创建这个对象,然后把它加入到字符串池中,再将它的引用返回.(例:new String(”aaa“)可能创建了1个或者2个对象,如果常量池中原来有aaa那么之创建了一个对象,如果没

Java基础集合类总结之Collections.sort()

面试中被问到,集合类中的排序方法是怎么实现的?没有回答上来,故而总结如下:你知道么? 前提:在eclipse中对于自己的代码可以通过按住Ctrl的同时单击名称跳入相应源码中.但eclipse默认没有添加java源代码目录,比如点击Thread会提示source not found,而在开发中了解Java源代码又是技术成长必要的.jdk默认是附带源码zip包的(jdk按装目录下的src.zip文件),我们可以通过添加源码在eclipse中查看.在提示source not found界面,点击Att

细节!重点!易错点!--面试java基础篇(一)

今天来给大家分享一下java的重点易错点部分,也是各位同学面试需要准备的,欢迎大家交流指正. 1.java中的main方法是静态方法,即方法中的代码是存储在静态存储区的. 2.任何静态代码块都会在main方法之前执行. 3.java程序的初始化顺序:原则:静态优先于非静态,且只初始化一次:父类优先于子类:按照成员定义顺序初始化.例顺序:父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数. 4.

黑马程序员——Java基础——集合类

第一讲 集合 一.集合的概念: 集合时一种容器,长度可变,可以存储任意类型的对象,基本数据类型也能够装入,是因为其内部是先自动装箱包装成包装类对象,然后存入集合的: 对比数组:也是容器,长度固定,只能存储基本数据类型 二.集合的分类 主要掌握的集合: Collection List: |--ArrayList:底层的数据结构使用的是数组结构:查询快,增删慢,不同步 |-LinkedList:底层的数据结构使用的是链式结构:查询慢,增删快    |-Vector:底层数组结构:同步  Set: |

java基础集合类——ArrayList 源码略读

ArrayList是java的动态数组,底层是基于数组实现. 1. 成员变量 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { /** * The maximum size of array to allocate. * Some VMs reserve some header word

【Java基础】Java面试题目整理与解说(二)

1.Collection 和 Collections 的差别. Collection 是集合类的上级接口,继承于他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作. 2.HashMap 和 Hashtable 的差别. HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完毕了 Map 接口,HashMap是非线程安全,效率上可能高于 Hashtable.在多个线程

Android开发面试经——4.常见Java基础笔试题

关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44403041 因为Androd使用Java语言来编程的,所以我们做Android开发全面的掌握Java基础是必须的.在面试的过程中,我们发现很多公司发的笔试题有很多知识点都是Java的,搞安卓久了,Java基础的一些知识点也都快忘了,今天就让我们来一起复习一些Java基础,希望能在面试中用到: 1.Overload和Override的区别.Overloaded的方法是

【Java基础】Java面试题目整理与讲解(二)

1.Collection 和 Collections 的区别. Collection 是集合类的上级接口,继承于他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作. 2.HashMap 和 Hashtable 的区别. HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了 Map 接口,HashMap是非线程安全,效率上可能高于 Hashtable.在多个线程

JAVA面试精选【Java基础第一部分】

这个系列面试题主要目的是帮助你拿轻松到offer,同时还能开个好价钱.只要能够搞明白这个系列的绝大多数题目,在面试过程中,你就能轻轻松松的把面试官给忽悠了.对于那些正打算找工作JAVA软件开发工作的童鞋们来说,当你看到这份题目的时候,你应该感动很幸运,因为,只要你把题目中的内容都搞懂了,在笔试的时候就可以游刃有余,通过面试只有半步之遥了,笔试只能反映你的JAVA技能.不管你是面试各个级别的JAVA工程师.架构师.还是项目经理,这个系列文章都是你最宝贵的资源,里面包括整个JAVA体系的知识,总会有

Java基础面试:集合、内部类、线程

package test; import java.util.Hashtable; import java.util.Map; public class test { public static String change(String param){ param=null; return param; } public static void main(String[] args) { String param1="p1"; param1=change(param1); Map ta