集合介绍
集合是Java中的一种容器,可以保存多个数据。
集合和数组的区别:
a、集合长度是可变的,数组长度是固定的
b、数组中的元素必须数据类型一致,而集合中元素数据类型可以不一致
c、集合想要保存基本类型,必须是其对应包装类型
集合框架如下图:
List接口
特点:
a、有序的(指的不是自然顺序,是指存入2,1,3,取出还是2,1,3)
b、有索引
c、元素可以重复
常见的实现类:
ArrayList:底层采用数组结构,特点:查找快,增删慢,线程不安全。
LinkedList:底层采用链表结构,特点:查询慢,增删快,线程不安全。
Vector:底层采用数组结构,特点:查找慢,增删慢,线程安全。
ArrayList和Vector的唯一区别就是线程安全,Vector的大部分方法上都带有关键字synchronized。单一线程时,建议使用ArrayList,效率会高很多。
Set接口
特点:
a、无序的(指存入顺序和取出的顺序不一致),但是有一个实现类除外LinkedHashSet
b、无下标
c、元素唯一
常见的实现类:
HashSet:底层采用哈希表结构,特点:查询快,增删也快。
哈希表的结构
可以使用对象.hashCode()获取哈希值。
哈希表结构如何保证元素的唯一性?
哈希表通过哈希值和equals俩个条件判断元素是否重复,也就是说,如果对象1和对象2相同,那么必须保证 hashcode一样,并且equals返回true。为了保证哈希表中元素的唯一性,我们必须重写hashCode()和equals方 法。
Map接口
特点:
a、Map是双列集合,由键值对组成。
b、Map中规定键不能重复,值可以重复,所有通过键能找到唯一对应的值。
常见实现类:
HashMap:
底层采用数组+链表+红黑树(JDK1.8):
存入对象时,会以数组的形式存入,当俩个对象的哈希值相同,equals为false时,俩个对象会以链表 的形式存入数组,当链表的个数大于8时,链表就会转成红黑树,提高查询效率。
由于我们要保证键的唯一性,必须重写键所属类的hashCode和equals方法。
HashMap的键值可以为空。
LinkedHashMap:
底层采用链式哈希表,所有是有序的。
也要重写键所属类的hashCode和equals方法。