Java集合
一、什么是集合。
集合是java中提供的一种容器,可以用来存储多个数据。
1 . 集合和数组的区别
① .长度区别,数组固定,集合可变
② .数组中存储的是同一类型的元素,可以存储基本数据类型值。而集合存储的都是对象。而且对象的类型可以不一致。
2.集合框架
① .集合根据存储结构分为两大类 单列集合Collection 双列结合Map
二.Collection集合
1 .Collection介绍:
是所有单列集合的父接口,因此它定义了单列集合List和Set的通用的一些方法。方法如下
①.public boolean add(E e)把给定的对象添加到当前集合中
②.public void clear()清空集合中的所有元素
③.public boolean remove(E e)删除给定的对象
④.public boolean contains(E e)判断是否存在给定的对象。
⑤.public boolean isEmpty 判断当前集合是否为空
⑥.publuc int size()返回当前集合中的元素的个数
⑦.public Object[] toArray() 把集合中的元素。存储到数组中
2 . List集合
List接口特点:
①.它试一个元素存取有序的集合。
②.他是一个带索引的集合,通过索引就可以精确的操作集合中的元素。
③.集合中可以有重复的元素,通过元素的equals方法,来比较是否重复的元素
List的常用方法
它继承了Collection中的全部方法,还增加了元素索引来操作集合的特有方法。
①.public void add(int indext,E e)将制定的元素添加到指定的位置上。
②.public E get(int index)返回集合中的指定位置的元素
③.public E remove(int indext)移除指定位置元素并且返回这个值。
④.public E set(int index)用指定元素替代指定位置的元素
List的子类
ArrayList集合
元素增删慢。查找快。(不提倡随意使用ArrayList)
LinkedList集合、
存储的结构是链表结构,方便元素添加,删除的集合
LinledList试一个双向链表
3.Iterator迭代器
1.Iterator介绍
即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
2. 注意
在使用集合时,我们经常需要遍历所有元素,针对这种需求,JDK专门提供了一个接口,它也是Java集合中的一员,但它与Collection、Map接口有所不同,这两个接口主要用于存储元素,而它主要用于迭代访问Collection中的元素,也称为迭代器。
4.Set接口
1.介绍:
Set接口同样继承自Collection接口,他与Collention接口中的方法基本一致,没有对其进行扩充功能,只是更加严格,Set接口是无序的,并且都会以某种规则保证存入的元素不会重复。
2.HashSet:
HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的,它的底层其实试一个HashMap支持。
HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此就有良好的存取和查找性能,保证元素的唯一性的方式依赖于Hashcode和equals方法
例:
Set<Integer>set = new HashSet<>();
set.add(1);
set.add(2);
set.add(1);
//遍历循环获取Set集合中的元素
for(int i:set){
System.out.println(i);
}
遍历输出打印它只会得到两个值,1和2
3.哈希表
在jdk1.8之前哈希表底层采用数组加链表实现,即使用链表处理冲突,同一哈希值的链表都存储在一个链表中,当时位于一个桶中的元素较多,即哈希值相等的元素较多时,通过key值一次查找的效率较低,而在jdk1.8中哈希表存储采用了数组+链表+红黑树实现,当链表长度超过阈值时,江连彪转换为红黑树,这样大大减少了查找的时间。
简单说,哈希表是有数组+链表—+红黑树实现的
5.Collections
1.常用功能
它是一个集合工具类,可以用来添加元素,打乱集合顺序,将集合中元素按照默认规则排序,和按照制定规则进行排序
①.public static <T> boolean addAll(Collection<T> c,T...elements);添加元素
②.public static void shuffle(List<?> list);打乱集合
③.public static <T> sort(List<T> list);按照默认顺序排序
④.public static <T> sort(List<T> list,Comparator<? super T>);制定规则排序。
三.Map
1.介绍:
Map用于保存具有映射关系的数据,Map里保存着两组数据,一个key,一个是value,他们可以使用任何引用类型的数据,但key不能重复。所以通过Key就能取得指定的value,使用时最好不要改变Key的值。
2.组成
1.HashMap
线程不安全。HashMap中最多允许一个Key为null,但是可以有无数多个value为null,性能好,可以通过调整初始容量和负载因子提高性能,根据需求进行修改,默认值为初始容量为16,负载因子为0.75。
2.HashTable
线程安全, HashTable不可以放入空值,性能差。
3.共同点
用作key的对象必须实现hashCode和equals方法,不能保证其中的键值对的顺序,尽量不能使用可变对象作为他们的key
4.TreeMap
实现SortMap接口,有他的特殊方法
Map.Entry forstEntry();返回最小Key对应的键值对,如Map为空则返回null;
Object firstKey 返回最小值Key,若为空返回null
Map.Entry lastEtry()返回最大key对应的键值对,若map为空,则返回null
Object lastKey 返回最大key,若为空返回null。
Map.Entry heigherEntry(Object key)返回位于key后一位的键值对,若为空返回null
Map.Entry lowerEntry(Object key)返回key前一位的键值对,若为空返回null。
Object lowerKey(Object key)返回位于key前一位key值,若为空返回null
总结:
1. 线程安全性:
集合中线程安全有Vertor,HashTable,StringBuffer
线程不安全的有LinkedList、ArrayList、HashSet、HashMap、StringBuilder
2. 数据结构:
Array:底层数据结构是数组,查询快,增删慢
Linked:底层数据结构是链表,查询慢,增删快
Hash:底层数据结构是哈希表,依赖hashcode和equals;
Tree:底层数据结构是二叉树。有自然排序和比较器排序。