之前已经学过了一些Java的基础知识点,今天开始总结学习Java集合的相关知识吧,如果有遗漏不足之处,还请斧正,也可以去其他网站进行更加详细的学习!!!
Iterator 和 Iterable 接口Java 集合类存放于 java.util 包中,是一个用于存放对象的容器
集合中只能存放对象,如果存入一个简单类型,实际上进行了自动转换【装箱】
集合中存放的是多个对象的引用,对象本身还是存放在堆内存
集合中可以存放不同类型、不限数量的数
Collection 接口作为集合框架的顶级接口之一,继承于 Iterable 接口。
public interface CollectionIterable 接口extends Iterable { }
Iterable 接口用于引入可遍历的功能,要求接口的具体实现类必须提供 Iterator 的实现。
Iterator 接口 Iterator 迭代器,走访器,可以理解为集合中元素的指针,用于实现集合中所有元素的遍历访问Collection接口
一般来说 Collection 接口是集合框架的顶级接口,但是事实上不是。
特征:集合中的数据无序,允许重复。
public interface Collectionextends Iterable { }
常见接口中定义的方法:
size():int 获取集合中的元素个数
add(Object obj):boolean 向集合中添加元素 obj
isEmpty():boolean 判断集合中的元素个数是否为 0
contains(Object obj):boolean 判断当前集合中是否包含对象 obj
toArray():Object[]将集合转换为数组
addAll(Collection) 将另外一个集合中的所有元素添加到当前集合中
remove(Object obj):boolean 从集合中删除指定的元素 obj
clear():void 清空集合中的所有元素
List子接口
Collection 接口的子接口。
特征:数据有序【索引编号】允许重复。在 Collection 接口的基础上添加了每个元素的索引编号,编号从 0 开始到 size-1 结束。
public interface Listextends Collection { }
实现类:(ArrayList 、LinkedList、Vector)常见接口中定义的方法:
add(Object):boolean 向集合末尾追加元素
add(int index, E element):void 向指定索引位置
index 上添加元素 element,原始数据自动后移
remove(Object):boolean 删除第一个和 object 参数相等的元素
remove(int index):Object 删除指定索引值对应的元素,并返回被删除的元素。
get(int index):E 获取指定索引号对应的元素,要求 index 应该在[0,size-1]范围内,否则异常
set(int index, E element):E 用于给指定索引位置上进行赋值操作,这个位置上必须有对应的数据,已经赋过值了,这里实际上就是修改操作,否则越界异常
indexOf(Object obj):int 从前向后查询第一个元素和 obj 相等的元素的对应索引值。如果不存在相等的时候返回-1
lastIndexOf(Object obj):int 从后向前查询最后一个元素和 obj 相等的元素的对应索引值。如果不存在相等的时候返回-1
ArrayList 底层数据结构就是数组,随机查询速度快、增删慢,线程不安全的,效率高,允许存放重复元素。
ArrayList 是实现了 List 接口的可扩容的数组【System.arrayCopy】,它的内部是基于数组实现的,相较于 Java中的数组,容量能动态增长。
ArrayList 实际上是通过数组保存数据,当构建 ArrayList 时,如果使用默认构造器,默认容积是 10,但是采用延迟构建;
当 ArrayList 容积不足以存放元素时,会自动进行 50%增容处理。新容积=原始容积*3/2;
ArrayList 克隆函数是将全局元素克隆到一个数组中。elementData 前面有 transient 修饰;
ArrayList 实现序列化时,先写出容积,再依次写出每个元素。
LinkedList 底层数据结构是双向链表,查询慢、增删快,线程不安全的,效率高,允许存放重复元素。
LinkedList 底层的数据结构是基于双向链表的结构。
Vector 底层数据结构是数组,随机查询速度快、增删慢,线程安全,效率低,允许存放重复元素。
内部实现仍旧是采用数组的方式实现,但是大部分方法上都有 synchronized 同步约束,所以当前类是一个线程安全的类。
Set子接口
Collection 接口的子接口。
特征:无序、不允许重复。
public interface Set实现类:(HashSet、LinkedHashSet、TreeSet)extends Collection { }
HashSet实现了Set接口,底层实际上是包装了一个HashMap实现的。
HashSet采用hash算法来存储集合中的元素,因此具有良好的读写性能。
调用add方法向HashSet中添加元素时,首先是针对对象的hashcode值进行比较。如果两个对象的 hashcode值相等时才会继续调用equals方法;如果两个对象的hashcode值不相等,则不会调用equals方法。
hashSet的特征
无序,不仅不能保证元素的插入顺序,而且在元素以后的顺序也可能会发生变化
如果需要访问的顺序和插入的顺序一致,则可以使用HashSet的子类LinkeHashSet
存储的元素不允许重复【equals和hashcode】
hashset中常见方法
contains(Object):boolean 判断set中是否存在指定对象,如果存在返回为true
iterator():Iterator 迭代访问元素----foreach写法要求必须实现Iterable接口
toArray():Object[] 放回包含所有元素的数组;如果需要指定返回数组的类型,可以使用toArray(类型[])
add(Object obj):boolean 如果set中不存在指定的元素obj,则向set中添加元素
remove(Object):boolean 删除指定元素
LinkedHashSet是HashSet的一个子类,LinkedHashSet也是根据hashCode值来决定元素的具体存储位置,但是同时它引入了一个链表可以维护元素的插入顺序。
底层采用链表和哈希表的算法,使用链表记录元素的添加位置,使用哈希表保证元素的唯一性。
LinkedHashSet是HashSet的子类,在HashSet的基础上添加了额外的链表,底层采用的是hash表的算法和链表的算法,既能保证元素的添加顺序,也保证了查询效率,当时整体性能要低于HashSet
判断元素相等采用的是equals方法,要求当equals为true时,hashCode值必须相等
要求存入HashSet中的元素必须覆盖定义equals()和hashCode()两个方法
TreeSet是一种排序的Set集合,数据存储采用的是NaviatableMap,底层实际上就是TreeMap实现的,本质上是一个红黑树原理。
Random r=new Random(); Listlist=new ArrayList<>(); Set set=new TreeSet<>(); while(set.size()<10){ int k=r.nextInt(20); list.add(k); set.add(k); } System.out.println("生成的数据为:"); System.out.println(list); System.out.println("插入TreeSet中的数据为:"); System.out.println(set);
Set,所以无重复。hashSet要求hashCode和equals方法,但是TreeSet不要求;
TreeSet不保证元素的添加顺序(LinkedHashSet),但是会对集合中的元素进行排序,需要 Comparable或者Comparator;
TreeSet底层采用红黑树算法(近似平衡排序二叉树),比较适合查询,但是添加的效率比较低。
今天的学习就先到这里吧,记得做好总结巩固哦!下一篇将继续学习Java集合中的Map接口的知识点!!!



