一,什么是集合
java集合类存放在java.util包中,是一个用来存放对象的容器。
注意:
- 集合只能存放对象。
- 集合中存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。对象本身还是存放在堆内存中。
- 集合可以存放不同的类型,不限数量的数据类型。
二,集合和数组(Array 和 ArrayList )的区别
- 数组长度是固定的,集合长度是可变的。
- 数组可以存储基本数据类型,也可以存储引用数据类型,集合只能存储引用数据类型。
- 数组存储的元素必须是同一个数据类型,集合存储的对象可以是不同数据类型的。
基本数数据类型和引用数据类型区别
八大基本类型
引用数据类型
类(class), 接口(interface),数组(array),(枚举类型、注解类型、字符串(String)类型) 。
简单来说,只要不是基本数据类型.都是引用数据类型。
三,常见的集合有哪些
Map接口和Collection接口上所有集合框架的父接口
- Collection接口的子接口包括:Set接口和List接口。
- Map接口的实现类主要有:HashMap,TreeMap,HashTable,ConcurrentHashMap,Properties等。
- Set接口的实现类主要有:HashSet,TreeSet,LinkedHashSet等。
- List接口的实现类主要有:ArrayList,LinkedList,Stack,Vector等。
四,常见的集合底层实现
- ArrayList底层是数组。
- LinkedList底层是双向链表。
- HashMap底层与HashTable原理相同,java 8版本以后如果同一位置哈希冲突大于8则链表变成红黑树。
- HashTable底层是链地址法组成的哈希表(即数组+单项链表组成)。
- HashSet底层是HashMap。
- LinkedHashMap底层修改字HashMap,包含一个维护插入顺序的双向链表。
- TreeMap底层是红黑树。
- LinkedHashSet底层是LinkedHashMap。
- TreeSet底层是TreeMap。
五,HashMap和HashTable区别
- HashMap没有考虑同步,是线程不安全的;HashTable使用了synchronized关键字,是线程安全的。
- HashMap允许键值都为null;HashTable键值不允许为null.
六,ConcurrentHashMap和HashTable的却别
ConcurrentHashMap集合了HashMap和HashTable二者的优势。HashMap没有考虑同步,HashTable考虑了同步的问题。但是HashTable在每次同步执行时都要锁住整个结构。ConcurrentHashMap锁的方式是稍微细粒度的。
七,ConcurrentHashMap实现原理
- JDK1.7 : 【数组(Segment) + 数组(HashEntry) + 链表(HashEntry节点)】
- ConcurrentHashMap(分段锁)对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。
- Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。
- JDK1.8 : Node数组+链表 / 红黑树
- 利用CAS+Synchronized来保证并发更新的安全,底层依然采用数组+链表+红黑树的存储结构。
八,ArrayList和Vector的区别
- Vector是线程安全的,ArrayList是线程不安全的。
- Vector扩容长度为原来的2倍,ArrayList扩容为原来的1.5倍。
九,ArrayList和LinkedList的区别
- LinkedList是基于链表的数据结构,ArrayList是基于动态数组的数据结构。
- LinkedList在插入和删除数据是效率更高,ArrayList查询效率更高。
十,HashMap 默认的初始化长度是多少
在JDK中默认长度是16,并且默认长度和扩容后的长度都必须是 2 的幂。