关于集合先放上自己的笔记,没有时间来排版,先记录一下。
作用:类集在JAVA中最为核心的用处就是实现了动态对象数组的操作
集合是什么:
集合就是一个容器,里面存储大量对象元素。
与数组的区别是什么:
数组是固定长度的,集合的长度是动态的;
数组存储的同一类型的元素,而集合可以存储不同类型的对象。
为什么要提提供大量集合:
按照不同的存、取方式。每种集合类的存、取方式各不相同,就会导致对于“集合内的元素”的“增删改查”等操作的效率不同,
有些存储方式会导致查询慢,但增删快;有些存储方式会导致:查询快,增删慢。存储方式由数据结构决定。
常见的数据结构:
1) 数组结构----ArrayList 内部是用数组实现的。(增删元素慢,查询快)
2) 链表结构----LinkedList 查询慢,增删快
3) 哈希表结构--HashSet 查询、增删都快,但所有操作都需要产生哈希值
4) 树结构------TreeSet 对元素排序
5) 图结构------Map
6) 栈结构------Stack 后进先出,模拟现实的操作
7) 队列--------Que.. 先进先出,模拟现实排队的操作
Java 中的集合分为两大类:(宏观上)
1)Collenction集合 (单列集合)
2)Map集合 (双列集合)
一 单对象保存父接口: Collection
特点:
1)定义了 List 和 Set 集合中说应该具有的所有方法
1.说明:
1)Collenction 接口 JDK1.2 开始定义,并且所有数据用Object接收,不安全。
2)JDK1.5 使用泛型定义,并且继承了 Iterable(迭代) 接口。
3)JDK1.8 接口引入 static 和 default 定义方式,Collection中的方法得到扩充。
2.9个常用方法
注:可以按添加、删除、判断、获取分类方法。
1)public boolean add(E e) 向集合里面保存数据
对于List集合,永远返回true;
对于Set集合,当添加重复元素时返回false。
2) public boolean addAll(Collection<? extends E> c) 追加一个集合
3) public void clear() 清空结合,根元素为null
对象.clear(); 表示把集合中的元素清空
对象 = null; 表示取消这个集合的对象,输出为null,如果调用size()方法,空指针异
4)public boolean isEmpty()
判断集合是否为空,为空返回true,否则返回fals。
5) public boolean remove(Object o)
删除成功返回true;没有指定的元素返回false;
调用remove()方法,自定义类需要覆写equals()方法。
6) public int size()
返回集合中元素的个数
7) public Object[] toArray()
将集合内的所有元素转换为Object数组
8) public Iterable<E> iterable()
获取一个迭代器,用来遍历集合元素的对象
获取一个迭代器:
Collection<T> list = new ArrayList<T>();
Iterable<T> it = list.iterable();
迭代器是单向的,只能使用一次,如果想要再次使用,需要再创建一个迭代器。
迭代的时候不允许增删集合中的元素。
9) public boolean contains(Object o)
判断集合是否存在指定元素,存在返回true;否则返回false。
调用contains(),自定义类方法需要覆写equals()方法。
3.子接口
1)List
特点:
1) 以线性方式存储,有序的(取出顺序与存入顺序一致)
2) 可以存储重复元素,需要通过equals()方法来判断是否重复
3) 可以通过索引访问集合中的元素
扩充方法:
public E get(int index)
根据指定索引,获取该集合相应位置的元素。
public E set(int index, E element)
用指定元素替换集合中指定位置的元素,并返回被替换的元素
public ListIterator<E> listIterator()
List 的迭代器
public E remove(int index)
移除集合中指定索引的元素,并返回被移除的元素
子类实现:
1) ArrayList
数据存储的构为数组结构,增删慢,查找快,但是用ArrayList完成任何需求的做法是不提倡的,因为这并不严谨。
默认开辟一个十个长度的内存空间。
2) LinkedList
数据存储的结构是链表结构,LinkedList是一个双向链表,可以进行收尾操作。LinkedListye 也可以所谓堆栈和队列的结构使用。
3)常用方法
public void addFirst(E e)
public void addLast(E e)
public void getFirst()
public void getLast()
public E removeFirst()
public E removeLast()
public E pop()
从此列表说表示的堆栈处弹出一个元素,如果为空不抛出异常,比较常用。
public void push(E e)
将元素推入此列表表示的堆栈
public boolean isEmpty()
2) set
并没有再Collection接口的基础上扩充功能,知识比Collect接口更加严格
特点:
(1)无序的
(2)不能存储重复元素
子类实现:
(1)HashSet
(a)存储的元素不可重复,并且集合中元素存取顺序不一致。
(b)其底层是由HashMap支持的。
(c)根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能,
但任何操作都要先生成哈希值,快慢取决于哈希值。保证元素的唯一性依赖于 hashCode() 和 equals()方法
原理
(a)先来介绍一下哈希表:
JDK1.8 之前,哈希表底层采用数组 + 链表来实现,即使用链表处理冲突么,同一hash值的链表都存储在一个链表里
但一个桶中的元素较多,即hash值相等的元素较多时,使用key值一次查找的效率低,所以在 JDK1.8 中哈希表存储采用
数组 + 链表 + 红黑树来实现,但链表长度超过阀值(8)时,将链表转换为红黑树,这样大大降低了查找时间。
(b)图示
注:hashCode()和 equals()方法保证了HashSet集合中元素的唯一性,所以在存储自定义类对象时,自定义类需要覆写hashCode()和 equals()方法。
(2)LinkedHashSet
LinkedHashSet 是有序的
LinkedHashSet 是 链表 和 哈希表 组合的一个数据存储结构
链表保证集合的有序性
哈希表保证集合的唯一性
3.Collections
集合工具类,用来对集合进行操作
(1)常用方法
public static <T> boolean addAll(Collection<T> c, T... elements)
向指定集合中添加多个元素
public static void shuffle(List<?> list)
打乱集合中元素的顺序
public static <T> void sort(List<T> list)
将集合中的元素按照默认规则排序
public static <T> void sort(List<T> list, Comparator<? super T)
将集合中的元素按照指定规则排序
二 Map集合
映射是指事物之间一一对应的关系,而Java提供了专门的集合来存放这种映射关系的对象---Map接口
Map内部也使用了数据结构,任何的数据结构都是应用在键上,不对值进行管理
HashMap 的键是哈希表结构
优点:
1)查询速度很快
1.Map接口下的集合与Collection接口下的集合存储数据的形式不同
1)Collection 接口
(1)单列集合规范了每次存储一个元素(单个元素)
(2)元素是孤立存在的(理解为单身)
2)Map 接口
(1)规范了双列集合的规范 Map<K,V>,K 代表键的类型,V代表值的类型,每次存储一对儿元素
(2)Map中的元素时成对儿存在的(理解为夫妻),通过键可以找对应的值
(3)Map中的集合不能包含重复的键,值可以重复且每个键只能对应一个值
2.常用方法
public V put(K key, V value)
把指定的键与指定的值添加到Map集合中
注:若指定的键在集合中没有,则没有这个键所对应的值并返回null,并把指定的键值添加到集合中
若存在,则返回键对应值,并把指定键所对应的值替换为指定的新值
public V remove(Object key)
把指定的键所对应的键值对儿元素在Map集合中删除,并返回被删除元素的值
若该键不存在,则返回null
public V get(Object key)
根据指定的键,在Map集合中获取对应的值
若该值不存在,则返回null
public Set<K> keySet()
获取Map集合中所有的键,存储到Set集合中
public Set<Map.Entry<K,V>> entrySet()
获取到Map集合中所有的键值对儿对象的集合(Set集合)
3.Entry键值对对象
1)键(key)与值(value)这种在Map集合中一一对应的关系,称为Map中的一个Entry(项)
Entry将键值对的对应关系封装成了对象,即键值对对象。
2)操作方法
public K getKey()
获取Entry对象中的键
public V getValue()
获取Entry对象中的值
3)
(1)Map接口中有一个内部接口,Entry,它里面定义了上述两个方法
(2)HashMap中有一个内部类 Node 实现了Map.Entry接口
(3)当我们想HashMap中添加一个键值对时,HashMap会将这个键值对直接防撞到一个Node对象中
4.找值方式
1)集合遍历键找对应值方式
2)集合遍历键值对方式 Map集合不能直接使用迭代器或foreach进行遍历,需要转换成Set集合
注:HashMap 存储自定义对象,如自定义对象作为key存在,要保证对象唯一,必须覆写 equals()和 hashCode() 方法
若要保证map中的key存取顺序一致,可以使用 LinkedHashMap 集合来存放
5.LinkedHashMap
1)组成
LinkedHashMap 的键是由链表和哈希表组合的一个数据结构
2)特点
存取顺序一致
6.JDK1.9 对集合添加的优化
1)通常实例化集合的时候,add()方法调用使得代码重复
在 JDK1.9 中添加了几种集合工厂方法,方便创建少量元素的集合、map实例。
新的List、Set、Map的静态工厂方法可以更方便地创建集合的不可变实例。
2)操作方法
of() 方法是Map、List、Set这上个接口的静态方法,其父类接口和子类实现并没有这类方法,例如HashSet、ArrayList等。
3)返回的集合是不可变的