1、List、Set和Map的区别

  1. List:存储的顺序是有序的、可重复的,这里的有序指的是按照添加顺序进行排列,但不会自动按照升序或字典序进行排列
  2. Set:存储的顺序是无序的、不可重复的,这里的无序指的是不会按照添加顺序进行排列,但它使用HashSet有可能自动按照字典序或升序进行排列
  3. Map:使用键值对存储,Key和Value都是无序的,其中Key不可重复,而Value可重复

2、ArrayList和LinkedList的区别

  1. ArrayList底层使用Object数组实现,可使用随机访问
  2. LinkedList底层使用双向链表实现,不可使用随机访问

3、HashMap和HashSet的区别

  1. HashMap存储键值对,通过put()添加元素,而HashSet仅存储对象,通过add()添加元素
  2. HashMap通过Key计算hashcode值,而HashSet通过成员对象计算hashcode值,但它们的最终顺序都是根据计算出来的HashCode值进行排列
  3. HashSet底层就是基于HashMap实现的
  4. HashMap和HashSet的默认初始长度都是16,加载因子为0.75,后续每次扩充都为原来的2倍

注意:hashSet底层是hashMap(数组 + 链表)的结构,你往hashSet里面存放的值在1-20之间,如果不想出现hash冲突,那么至少需要20个数组才能一一对应随机数可能产生的数,才能排序输出。new HashSet()在不指定容量的情况下,包含的数组默认大小是16个,那么当随机数出现16-20之间的数值时,可能会产生hash冲突,所以输出就不是排序的,为什么在第13次会排序?是因为hashMap的默认扩容因子是0.75,也就是说超过16*0.75 = 12个时,会发生扩容,然后重新hash,这个时候就不会出现hash冲突的情况了,也就是会”自动排序“输出了

4、HashMap和ConcurrentHashMap的区别

  1. HashMap是线程不安全的,当出现多线程操作时,会出现安全隐患;而ConcurrentHashMap是线程安全的。
  2. HashMap不支持并发操作,没有同步方法,ConcurrentHashMap支持并发操作,通进行加锁(分段锁),每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全

5、HashSet、LinkedHashSet和TreeSet的区别

  1. HashSet就是正常的无序、不可重复,它会根据对象计算出来的哈希值进行排列,因此它是有可能按照升序进行排列的
  2. LinkedHashSet能够按照添加的顺序遍历,使用链表实现
  3. TreeSet能够按照添加元素的顺序进行遍历,并对元素进行排序,自平衡的排序二叉树,默认升序排列

注意: 还有一种LinkedHashMap和LinkedHashSet类似,可以保持键值对的插入顺序,使用双向链表实现

6、Java集合框架中的继承关系

java map 属性值有序 java map有序还是无序_升序

7、集合和数组的相互转换

1、集合转数组

list.toArray(new String[0]);
//new String[0]就只是起一个模板作用,用来指定返回的类型

2、数组转集合

List<String> myList = Arrays.asList("Apple","Banana", "Orange");

使用上述方法请注意:

  1. Arrays.asList()是泛型方法,传递的数组必须是对象数组,而不是基本类型。即不能是int,而应该是Integer。
  2. 使用集合的修改方法: add()、remove()、clear()会抛出异常。即不能对转变后的集合进行操作。

可以用另外一种简便的方法:

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));

8、HashTable和HashMap的区别

  • 1.继承不同。
    public class Hashtable extends Dictionary implements Map
    public class HashMap extends AbstractMap implements Map
  • 2.Hashtable中的方法是同步的,而HashMap中的方法在缺省(即默认)情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了
  • 3.Hashtable 中, key 和 value 都不允许出现 null 值。 在 HashMap 中, null可以作为键,这样的键只有一个;但可以有一个或多个键所对应的值(即value)为 null 。当 get() 方法返回 null 值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为 null 。因此,在 HashMap 中不能由 get() 方法来判断 HashMap中是否存在某个键, 而应该用 containsKey() 方法来判断。
  • 4.Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

9、ArrayList和Vector的区别

  • 同步性: Vector是线程安全的,而ArrayList是线程不安全的;Vector中的方法都是同步方法(synchronized),所以ArrayList的执行效率要高于Vector
  • 数据增长:Vector默认增长为原来的两倍,而ArrayList增加为原来的1.5倍