1、List、Set和Map的区别
- List:存储的顺序是有序的、可重复的
- Set:存储的顺序是无序的、不可重复的
- Map:使用键值对存储,Key和Value都是无序的,其中Key不可重复,而Value可重复
2、ArrayList和LinkedList的区别
- ArrayList底层使用Object数组实现,可使用随机访问
- LinkedList底层使用双向链表实现,不可使用随机访问
3、HashMap和HashSet的区别
- HashMap存储键值对,通过put()添加元素,而HashSet仅存储对象,通过add()添加元素
- HashMap通过Key计算hashcode值,而HashSet通过成员对象计算hashcode值
- HashSet底层就是基于HashMap实现的
- HashMap的默认初始长度为16,后续每次扩充都为原来的2倍
4、HashMap和ConcurrentHashMap的区别
- HashMap是线程不安全的,当出现多线程操作时,会出现安全隐患;而ConcurrentHashMap是线程安全的。
- HashMap不支持并发操作,没有同步方法,ConcurrentHashMap支持并发操作,通进行加锁(分段锁),每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全
5、HashSet、LinkedHashSet和TreeSet的区别
- HashSet就是正常的无序、不可重复
- LinkedHashSet能够按照添加的顺序遍历,使用链表实现
- TreeSet能够按照添加元素的顺序进行遍历,并对元素进行排序,自平衡的排序二叉树
PS:还有一种LinkedHashMap和LinkedHashSet类似,可以保持键值对的插入顺序,使用双向链表实现
6、Java集合框架中的继承关系
7、集合和数组的相互转换
1、数组转集合
list.toArray(new String[0]);
//new String[0]就只是起一个模板作用,用来指定返回的类型
2、集合转数组
List<String> myList = Arrays.asList("Apple","Banana", "Orange");
使用上述方法请注意:
- Arrays.asList()是泛型方法,传递的数组必须是对象数组,而不是基本类型。即不能是int,而应该是Integer。
- 使用集合的修改方法: add()、remove()、clear()会抛出异常。即不能对转变后的集合进行操作。
可以用另外一种简便的方法:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));