集合
集合就是一个容器,类似于数组,但是数组的长度创建后,是不可变的。而容器的长度是可以改变的,集合是储存对象,所以容器更适合我们对与管理和组织数据的需求;
容器相关的类和接口
Collection接口
Collection 表示一组对象,它是集中、收集的意思。Collection接口的两个子接口是List、Set接口。
Collection定义的方法:
由于List、Set是Collection的子接口,意味着所有List、Set的实现类都有上面的方法
List的特点
List是有序、可重复的容器。
有序:List中每个元素都有索引标记。可以根据元素的索引标记(在List中的位置)访问元素,从而精确控制这些元素。
可重复:List允许加入重复的元素。更确切地讲,List通常允许满足 e1.equals(e2) 的元素重复加入容器。
除了Collection接口中的方法,List多了一些跟顺序(索引)有关的方法,参见下表:
List接口常用的实现类有3个:
ArrayList、LinkedList和Vector。
ArrayList特点和底层实现
ArrayList底层是用数组实现的存储。
特点:查询效率高,增删效率低,线程不安全。我们一般使用它。
ArrayList常用方法的代码展示:
运行结果
LinkedList特点和底层实现
LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。
双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。 所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。
LinkedList的使用方法:
LinkedList使用方法和ArrayList都是实现了List接口的类,所以使用方法基本相同;
Vector向量
相关的方法都加了同步检查,因此“线程安全,效率低”。比如,indexOf方法就增加了synchronized同步标记
Vector使用方法
Vector也是实现了List接口的类,所以使用方法基本和LinkedList和ArrayList相同;
如何选用ArrayList、LinkedList、Vector?
1. 需要线程安全时,用Vector。
2. 不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)。
3. 不存在线程安全问题时,增加或删除元素较多用LinkedList。
面试题:
关于ArrayList、LinkedList、Vector的区别
1. ArrayList底层采用是数组进行实现的,实现了数组的动态扩容其查找效率较高,添加删除效率较低,非线程安全。
2.LinkedList底层采用双向链表进行实现的,查找效率较低,添加刷除效率高,非线程安全。
3. Vector与ArrayList底层实现相同,但是Vector是线程安全的,效率较低但更适合在多线程程序中使用。
Map接口
现实生活中,我们经常需要成对存储某些信息。比如,我们使用的微信,一个手机号只能对应一个微信账户。这就是一种成对存储的关系。
Map就是用来存储“键(key)-值(value) 对”的。 Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。
Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。
Map接口中常用的方法
HashMap和HashTable
HashMap和HashTable采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。也就是说使用HashMap和HashTable创建的容器,元素是唯一的,不能重复的。
HashMap和HashTable采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。也就是说使用HashMap和HashTable创建的容器,元素是唯一的,不能重复的。
HashMap和HashTable在查找、删除、修改方面都有非常高的效率。
常用代码演示
HashMap和HashTable有什么区别呢?
1. HashMap: 线程不安全,效率高。允许key或value为null。
2. HashTable: 线程安全,效率低。不允许key或value为null。