主要内容:
List 集合 、Set 集合 、数据结构
一、List接口
List接口是Collection接口下面的一个子接口。
1).这个接口满足以下特点:
1. 有序。(有序不是顺序,有序怎么存就怎么取)
2. 有索引 (可以根据索引获取元素)
3. 可以存放重复元素。
2).List常见的实现类:
ArrayList(最常用), LinkedList, Vector(淘汰)
1.
.List接口中常见的方法:
public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
public E get(int index) :返回集合中指定位置的元素。
public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
2.
ArrayList类

ArrayLis是List接口中最常用的一个子类(没有之一),ArrayList 内部是使用一个数组去存储数据的。因为内部是数组,所以ArrayList查询快,增删慢。
1.
.LinkedList类

LinkedList是 List接口下面的另一个实现类。LinkedList内部是一个双向链表。
LinkedList的特点: 查询慢,增删快。
LinkedList里面有一些特有的方法,支持对集合的首尾进行操作。
特有方法(8个):
void addFirst(E e): 向集合首个位置添加元素
void addLast(E e): 向集合尾部添加元素
E getFirst():获取集合中首个位置的元素
E getLast():获取集合中最后一个元素
E removeFirst():删除集合中的第一个元素,并返回该元素
E removeLast():删除集合中的最后一个元素,并返回该元素
void push(E e): 压入,向集合的开头添加元素
E pop():弹出。删除集合中的第一个元素并返回。
二、Set接口
Set接口是Collection接口下面的另一个子接口。
1).Set接口有以下特点:
1. 无序(怎么存不一定怎么取)
2. 无索引
3. 不可以重复,不能存放重复元素
2).Set接口常见的实现类:
HashSet, LinkedHashSet
1.
HashSet类

HashSet类是Set接口的实现类。底层的实现其实是一个 java.util.HashMap 支持,HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCode 与 equals 方法。这个类满足Set接口的所有的特点。
这个集合是没有索引的,所以不能通过索引的方式遍历这个集合。遍历方式可以采用迭代器,也可以采用增强for。推荐增强for。
HashSet 集合存储数据的结构(哈希表)
4).什么是哈希表呢?
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现。

1.

.对象的哈希值:
对象的哈希值就是一个int数字, 可以把哈希值看成是对象的一个标识。
在Object中有一个方法,可以获取到一个对象的哈希值,这个方法叫做hashCode。
在Object中的hashCode方法,对象的哈希值计算方式是根据地址值计算的。
如果不想使用Object中hashCode的计算方式,那么可以在子类中重写hashCode方法。
对象的哈希值一般都是根据对象的属性值计算,如果对象的属性值相同那么这两个对象的哈希值也应该相同。
注意:
哈希值是对象的一个标识。 并不是一个唯一的标识。 哈希值允许重复。
哈希值是一个int数字,int取值范围是-21亿到21亿,一共是42亿个。现在有50亿个对象,哈希值肯定重复。
总结:
1. 哈希值是对象的一个标识,一个特征码。
2. 可以调用对象的hashCode获取到对象的哈希值。
3. 如果希望自己定义哈希值的生成规则,可以在子类中重写hashCode方法。

1.

HashSet存放自定义元素。

使用HashSet存放Student,如果两个Student的属性完全相同,就当成是同一个Student对象,如果要使用hashSet存放自定义对象,并且如果要保证唯一性(两个对象的属性完全相同,就当成是同一个对象),需要重写hashCode和equals。因为HashSet判断唯一性的原理是先比较哈希值,如果哈希值不同肯定是不同的对象,如果哈希值相同,不一定是同一个对象。如果哈希值相同,还要调用equals。
2.
LinkedHashSet类

在Set接口中,还有一个实现类,这个实现类叫做LinkedHashSet
LinkedHashSet 里面除了哈希表之外还有一个双向链表。链表的作用是保证有序。
所以说LinkedHashSet这个集合可以保证有序。
注意:
Set接口是无序的,但是他不能保证下面的所有实现类都是无序的。
1.
可变参数

可变参数指的是参数的个数可以发生变化。
格式:
修饰符 返回值类型 方法名(参数类型… 变量名) {
//…
}
1. 可变参数方法在调用的时候,参数可以传递任意个。(0个1个或者多个)
2. 传递的参数必须要是同一个数据类型。
3. 可变参数本质是数组,使用方式和数组一模一样
4. 可变参数本质是数组,所以调用带有可变参数的方法时也可以传递数组。
注意事项:
1. 可变参数本质是数组, 不能和数组构成重载。
2. 可变参数在一个方法中,最多只能有一个.
3. 如果有可变参数,那么可变参数只能出现在最后一个参数位置

五、Collection工具类

Collections是操作集合的工具类
Collection是单列集合的顶层接口。
1).常用方法:
public static boolean addAll(Collection c, T… elements) :往集合中添加一些元素。
public static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序。
public static void sort(List list) :将集合中元素按照默认规则排序。
public static void sort(List list ,Comparator<? super T> ) :将集合中元素按照指定规则排序。

2).Collections中的sort方法
static void sort(List list): 对集合中的内容进行排序。这种方式叫做自然排序。
自然排序指的是要排序的这个东西本身就具备排序的功能,在java中,只有实现Comparable接口,才具备自然排序的功能,才可以使用sort(List list)进行排序只有实现Comparable接口,才意味着这个对象具有比较的功能。

当我们调用Collections的sort方法的时候,系统会自动调用Comparable接口的compareTo方法进行比较。如果我们自定义了一个对象,如对象属性要进行排序,需实现Comparable接口,在该类里重写compareTo方法。
如果返回值是一个负数,表示当前对象小于参数对象
如果返回值是0,表示这两个对象相同。
如果返回值是正数,表示当前对象大于参数对象。

口诀: 升序就是我减他

*/
@Override
public int compareTo(Person o) {
return this.age - o.age;
1.
.比较器排序
static void sort(List list, Comparator c):对集合中的内容进行排序;
我们可以找一个法官,对集合中的内容进行排序,这个法官就是比较器。
两种排序:
自然排序:对象本身就具备排序的功能。当使用一个类实现Comparable接口时,那么这个类的对象就具备了排序的功能。
比较器排序:对象本身并不具备排序功能. 我们可以找一个裁判,找一个法官来帮对象进行排序,这个法官就是比较器。

当调用Collections的sort方法进行比较器排序时,系统会自动调用这个compare对两个对象进行比较。
如果这个方法返回值是负数,表示第一个对象小于第二个对象
如果这个方法返回值是0,表示这两个对象相同
如果这个方法返回值是正数,表示第一个独享大于第二个对象

升序就是一减二

*/
@Override
public int compare(Student o1, Student o2) {
int result = o1.getAge() - o2.getAge();
if(result == 0) {
return o1.getCup() - o2.getCup();
}
return result;
}
其中:comparable和comparator均为接口

10-02 20:42