首先,集合是用来干嘛的呢?
集合和数组一样,是用来存储数据的。
我们知道Java是一门面向对象的编程语言。我们在编程时自然需要存储对象的容器。数组当然可以满足这个需求,但是数组的长度是固定的,存储的是某一类型的数据,具有局限性,而数组可以自动扩容,可以存储任何类型的数据。因此,集合就诞生了!
1.collection集合
集合父接口,有两个子接口,list集合和set集合,
Collection接口是单列集合的最顶层接口,定义了一些通用的方法。
add(E e)添加元素; clear()清空元素; remove(E e)移除元素; size()元素数量;
toArray()集合转数组; contains(E e)判断元素是否存在; isEmpty()判断集合是否为空。
2.0List集合
List集合是collection集合的子接口,其特点是存储元素数据有序可以重复。有两个子接口分别为Arraylist和Linkedlist,其常用的方法有
boolean add(int index, element);在指定的位置添加指定的数据
E remove (int index);通过索引删除指定元素
E set(int index, E element);在指定的位置添加指定的元素,并返回替换掉的元素
E get(int index);通过下标索引取出指定位置上的元素
int indexOf(object o);获取指定元素在集合中的下标
LIst<> subList(startindex, endIndex);截取集合,下标是截取开始位置,不包括结束位置。
2.1ArrayList集合特点
数据结构:数组;
特点:查询快,增删慢,主要用于查询遍历数据,为最常用集合之一;
底层分析:数组结构是有序的元素序列,在内存中开辟一段连续的空间,在空间中存放元素,每个空间都有编号,通过编号可以快速找到相应元素,因此查询快;数组初始化时长度是固定的,要想增删元素,必须创建一个新数组,把源数组的元素复制进来,随后源数组销毁,耗时长,因此增删慢。
2.2LinkedList集合
数据结构:双向链表;
特点:查询慢,增删快;
底层分析:链表分为单向和双向,就是一条链子和两条链子的区别;多出的那条链子记录了元素的顺序,因此单向链表结构无序,双向链表结构有序;链表结构没有索引,因此查询慢;链表的增删只需在原有的基础上连上链子或切断链子,因此增删快。
3.0Set集合
set集合也是collection集合的子接口,存储数据特点是无序不可重复。有两个子接口分别为hashset和TreeSet集合,其仓用的方法和list集合方法大致相同。
3.1 HashSet
内部存储机制
当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过equals方法比较true,但它们的hashCode方法返回的值不相等,HashSet将会把它们存储在不同位置,依然可以添加成功。
也就是说。HashSet集合判断两个元素的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode方法返回值也相等。
靠元素重写hashCode方法和equals方法来判断两个元素是否相等,如果相等则覆盖原来的元素,依此来确保元素的唯一性
3.2TreeSet集合
底层是依赖二叉树进行存储的,默认整形为从小到大排序
TreeSet支持两种排序方法:自然排序和定制排序,
自然排序
TreeSet会调用集合元素的compareTo(Objec obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列,这就是自然排序。
Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类必须实现该方法,实现接口的类就可以比较大小了。当调用一个一个对象调用该方法与另一个对象进行比较时,obj1.compareTo(obj2)如果返回0表示两个对象相等;如果返回正整数则表明obj1大于obj2,如果是负整数则相反。