前言:本文章纯属个人手敲,并未参考任何人的笔记。因本人为自学java,写该文章的初衷为个人复习使用。有哪里不对的地方欢迎各位指出!
一、集合概念:
1、什么是集合?有什么用?
“数组”其实就是一个集合。集合实际上就是一个容器,可以来容纳其他类型的数据。
为什么说集合在开发中使用较多?
集合是一个容器,是一个载体,可以一次容纳多个对象。在实际开发中,假设连接数据库,数据库当中有10条记录,那么假设要把这10条记录查询出来,在java程序中会将这10条数据封装成10个Java对象,然后将对象的引用放到一个集合当中,将集合传递到前端,然后遍历集合,将一个数据一个数据展现出来。
2、集合不能直接存储基本数据类型,也不能存储java对象,集合当中存储的都是java对象的内存地址或者说集合当中存储的都是引用。
3、学习集合类型前,最好先找一部分比较常用的集合类和接口,然后将它们的继承关系和集合的特性背下来,能够凭记忆画出继承结构图,能够描述出每个集合接口和集合类的特性、包括底层数据结构。
4、集合主要分为两类:单个存储元素的方式和键值对存储元素的方式。
下面简单介绍一部分集合类,主要由Collection和Map两大集合接口以及所继承和实现的子类。
5、 Collection集合接口继承了Iterable集合,Iterable翻译为“可迭代”的,说明 Collection接口类下的所有子类以及子接口都是可迭代/遍历的。
Iterable接口类有一个特有方法:Iterator iterator() 返回的是一个迭代器,该迭代器是所有Collection子类及子接口“通用”的。
Collection集合接口的常用方法:
add(E e) :向集合中添加元素。
size() :返回该集合内元素的个数。
isEmpty() : 判断该集合是否为空。
contains(Object o) :判断是否包含某元素。
clear() :清空集合。
iterator() :返回一个迭代器(因该迭代器是所有Collection集合下的子接口及实现类通用的,所以较为重要,建议多练习。)
6、Collection接口的子接口有:List集合、Set集合(目前暂时学习这两个)。
List集合特性:有序可重复。
有序是指有下标,元素存储进去是什么顺序,取出时还是什么顺序。
可重复是指,例如集合内有了一个元素1,可以再次存储进去相同的另一个1.
List集合的实现类有:ArrayList、LinkedList、Vector(暂时学习这三个)。
7、 ArrayList集合特点:
ArrayList集合继承了List集合接口,所以该集合也是有序可重复的。
ArrayList集合调用无参构造默认创建的集合拥有10个长度的空列表。
ArrayList每次自动扩容后的容量为原容量的1.5倍 。
ArrayList是非线程安全的。
ArrayList底层是Object [],所以数组拥有的特点它都有:例如检索效率高,每个元素都有下标,而数组内存放的元素大小都是相同的时候可以使用数组的第一个元素内存地址快速计算出所需要的元素内存地址下标。缺点:随机增删效率较低,会造成所有元素的向前位移或向后位移 ,但向数组末尾添加元素不受效率影响。
ArrayList集合所拥有的的特有方法需要记住,(ArrayList继承了List集合,而List集合继承了Collection集合,故Collection集合的所有常用方法ArrayList集合内也拥有,这里只列出ArrayList集合的特有方法)
例:
add(int index, E element) :向指定下标上添加元素。
remove(int index) :删除指定下标上的元素。
get(int index) :返回指定下标上的元素。
set(int index, E element) :修改指定下标上的元素。
indexOf(Object o) :返回指定元素在列表中第一次出现的索引。
lastIndexOf(Object o) :返回指定元素在列表中最后一次出现的索引。
toArray() :将ArrayList转换为一个Object[] 。
7、 LinkedList集合:底层为双向链表。(数据结构这里不描述,但需要个人了解该数据该结构的特点)
该集合特点:
优点:
对于链表数据结构来说,内部存储的内存地址并不连续,所以随机增删效率较高,因为不会造成大量元素的位移。
注意:如果以后遇到随机增删集合中的元素较多时,尽量使用LinkedList集合。
缺点:
不能通过数学表达式计算被查找元素的内存地址,每一次查找都是从头节点开始遍历,直到找到为止。所以LinkedList集合检索/查找的效率比较低。
LinkedList方法:该集合的常用方法同上集合。如遇到需要特有方法时,查阅API帮助文档。
Vector集合特点:底层为数组。
是线程安全的,因为该集合内每个方法都被synchronized关键字修饰。
因效率较低,使用较少。
8、 Vector集合的常用方法同ArrayList集合。
Set集合接口:(Collection集合的子接口)
Set集合特点:无序不可重复。
该集合没有下标,存进的元素顺序和取出的元素顺序并不一定相同。
Set集合的子接口:SortedSet集合。
SrotedSet集合特点:放到SrotedSet集合内的元素会按照大小顺序自动排序,也称为排序集合。
Set集合的实现类:HashSet集合。
9、HashSet集合特点:
底层是哈希表数据结构。
集合初始化容量为16,每次自动扩容后的容量为原容量的2倍。
HashSet底层实际上是创建了一个HashMap集合,向HashSet集合内存储元素,实际上是存储到了HashMap集合的key部分。
HashSet集合常用方法:
同Collection集合内的方法相同,并没有特有方法。但需要注意,该集合是无序的,所以是没有下标的,获取迭代器后不能使用下标的方式迭代/遍历。
10、 TreeSet集合:(SortedSet集合接口的实现类)
底层为二叉树数据结构。
放到TreeSet集合内的元素,底层实际上是放到了TreeMap集合的key部分上。
放到该集合内的元素也会按照大小的顺序自动排序。(前提为SUN公司写好的数据类型,如自定义类型的话,需要实现Comparable或Comparator类型,并编写比较规则。)
11、Map集合:
Map集合的存储方式是以key和value(键值对)的方式存储的,key的部分和Set集合的特点相同,都是无序不可重复的。
key和value都只能存储java对象的内存地址/引用。
Map集合常用方法:
put(K key, V value) :向Map集合中添加元素
get(Object key): 通过key获取value的值。
remove(Object key) :通过key,删除键值对。
size() :返回集合中元素个数。
clear() :清空集合。
isEmpty() :判断集合是否为空。
containsKey(Object key) :判断是否包含某个key。
containsValue(Object value) :判断是否包含某个value。
keySet(): 获取Map集合所有的key(返回一个Set集合)
values() :获取Map集合所有的value(返回一个Collection集合)
entrySet() ;将Map集合转换为Set集合,转换后的类型为:Set<Map.Entry<K,V>> 。
可以理解为是一个Node节点,该节点内包含了Map集合的key和value,转换后可以调用node.getkey()方法和node.get()方法直接遍历Map集合的所有元素。
该方法尤为重要,建议多敲多练!!!
12、 Map集合的子接口:SrotedMap
SrotedMap与SrotedSet集合一样,都是可排序集合。
SrotedMap集合的实现类:TreeMap
TreeMap与TreeSet相同,底层都是二叉树数据结构。
13、Map集合的实现类:HashMap、Hashtable。
HashMap集合特点:
HashMap底层数据结构是哈希表。
HashMap集合中每个元素都是一个单向链表。而单向链表中存储元素的单位是节点(node)。
当一个节点中的元素超过8个时,数据结构会由单向链表转变为红黑树。
当节点中的元素低于6个时,数据结构会重新转变为单向链表。目的是为了提高检索效率。
HashMao集合初始容量为:16,默认加载因子0.75(当集合内的容量达到当前容量的百分之75时开始自动扩容)。每次扩容是原容量的2倍。(建议将初始容量设置为2的倍数,保证散列均匀。)
HashMap的key和value可以为null,但只能有一个。(因不可重复特性,当再次存储null时会覆盖value。)
14、Hahstable集合:
Hashtable集合特点:
首先Hashtable底层是哈希表数据结构。
但Hashtable是线程安全的。内部的方法都被synchronized关键字修饰。
Hashtable初始容量为11 每次扩容后的容量为原容量的2倍+1。
15、Properties集合:继承了Hashtable集合,因此Perperties集合也是线程安全的。
但Properties集合的key和value只能存储String类型。该集合也称为“属性类”。
Properties集合特有的方法:
setProperty(String key, String value) :向集合中添加元素。
getProperty(String key) :通过key获取value的值。
暂时学习以上两个方法。
总结:熟悉以上集合的继承结构,能够描述出哪些是集合接口、哪些是集合实现类、所有实现类的数据结构及特性、所有集合的继承关系。