JAVA集合
目录
一、为什么要学习集合?
灵魂发问:
已经学习了数组是用来存数据的,为什么还要学习集合?
回答:
Java是面向对象的语言,数组虽也能存储对象,但数组的长度固定,即使能扩容,也方式复杂。为了更简便的操作对象,Java就提供了集合。
但需要注意的是,虽然集合的长度可变,但是只能存储对象数据类型,即引用数据类型。
(前提知识)泛型
泛型可以保证一个集合的所有对象类型一致
若存储的元素不同,则编译不同
优点:
-
有利于集合遍历,将异常移至编译期
-
类型安全,通过知道使用泛型定义的变量的类型限制,编译器可以更有效地提高Java程序的类型安全;
-
消除强制类型转换,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。所有的强制转换都是自动和隐式的;
-
提高性能。
定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,这些通配符是规定的,不是一成不变的!
对于常见的泛型模式,一般规范:
K ——键,比如映射的键。
V ——值,比如 List 和 Set 的内容,或者 Map 中的值。
E ——异常类。
T ——泛型。
下列尖括号内就代表泛型
ArrayList<String> arrayString=new ArrayList<String>();
(前提知识)迭代器
迭代器(iterator)
java中提供了很多种集合,它们在存储元素时,采用的存储方式不同。所以当我们要取出这些集合中的元素时,可以通过一种通用的获取方式来完成。集合中把这种取元素的方式描述在Iterator接口中。迭代器是用来遍历集合的
重点掌握三个方法
- hasNext()
判断集合中还有没有可以被取出的元素,如果有返回true - next()
取出集合中的下一个元素 - remove()
删除元素
二、集合的介绍
集合是储存对象的一种容器,每种集合的数据结构不同,功能作用也不同。
Java的容器可分为两大类Collection和Map
下图是比较常见的集合类
Collection集合:
易搞混的点:
Collection集合要和Collections加了个s的分开
Collection:是接口
Collections:是工具类,提供方法
Collection主要又分为List,Set,Queue
List代表有序的,允许有重复元素的集合
Set代表无序的,不允许有重复元素的集合
Queue代表队列集合,这个放在数据结构单讲
List集合
ArrayList
插入、删除效率低下,查询效率高。元素可以重复,容量可以动态增加和减少,大小可变,初始容联为10。
LinkedList
LinkedList底层使用双向链表,所以增删快,查询慢,和ArrayList刚好相反,链表批量增加,是靠for循环遍历原数组,依次执行插入节点操作,元素可以为null。
Vector
Vector和ArrayList类似但线程安全,Stack 是Vector类的实现类,虽然线程安全,但效率和ArrayList相比较低
类名 | ArrayList | LinkedList | Vector |
---|---|---|---|
底层实现 | 数组 | 链表 | 数组 |
继承类 | AbstractList | AbstractSequentialList | AbstractList |
线程安全 | 线程不安全 | 线程不安全 | 线程安全 |
所以总的来说查询多用ArrayList,删减多用LinkedList
Set集合
HashSet
内部的数据结构是哈希表,无序,是线程不安全的。
TreeSet
内部的数据结构是二叉树,有序,是线程不安全的。
LinkedHashSet
底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。
类名 | HashSet | TreeSet | LinkedHashSet |
---|---|---|---|
底层实现 | 哈希表 | 红黑树 | 链表和哈希表 |
线程安全 | 线程不安全 | 线程不安全 | 线程不安全 |
存入Set的每个元素都必须是唯一的,Set不保存重复元素,并且Set接口不保证维护元素的次序。
Map集合:
Map代表具有映射关系的集合!Map里保存key和value,它们都可以使任何引用类型的数据,但key不能重复。
通过指定的key就可以取出对应的value!
HashMap
底层是用哈希表,允许null对象作为键和值,并且HashMap是不同步的,即HashMap线程不安全!
TreeMap
可以对集合中的键进行指定顺序的排序,默认是使用键的自然顺序,也可以使用比较器!
HashTable
HashTable的对象都可以作为键或值,另外,作为键的对象必须实现HashCode()和equals(),HashTable是同步的,即HashTable是线程安全的。
类名 | HashMap | HashTable | TreeMap |
---|---|---|---|
底层实现 | 哈希表 | 哈希表 | 红黑树 |
继承类 | AbstratMap | Dictionary | AbstratMap |
键是否能null | 能 | 不能 | 能 |
值是否能null | 能 | 不能 | 能 |
线程安全 | 不安全 | 安全 | 不安全 |