三、List、Set、数据结构和Collections.m
一、数据结构
1.1 常见的数据结构
栈
进:123
出:321
现进后出
类似子弹弹夹
队列
进:123
出:123
先进先出
类似排队安检
数组
特点:查询快,增删慢
查询快:数组地址是连续的,可以通过数组索引快速查到某个元素
增删慢:数组长度是固定的,想增加/删除必须创建一个新数组,把源数组的数据复制过来

链表
特点:查询慢,增删快
查询慢:每次查询都必须从头开始查询
增删快:链表结构,增加或删除一个元素,对整体结构没有影响

红黑树
趋*于*衡树,查询的速度非常快,查询叶子节点最大次数和最小次数不能超过2倍

二、List集合
java.util.List接口 extends Collection接口
2.1 三大特点:
1.有序的集合,存储元素和取出元素顺序是一致的
2.有索引,包含一些有索引的方法
3.允许存放重复的元素
2.2 List接口常用的带索引的接口
public boolean add(int index,E element)将指定元素添加到指定位置
public E remove(int index)将指定位置的元素删除,返回删除的元素
public E set(int index,E element)用指定元素替换指定位置的元素,返回更新前的元素
public E get(int index)返回指定位置的元素
三、 List集合的子类
3.1 ArrayList集合
java.util.ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的是查询数据,遍历数据,所以ArrayList是最常用的集合。
3.2 LinkedList集合
java.util.LinkedList集合数据存储的结构是链表结构
特点:
-
底层是一个链表结构:查询慢,增删快
-
里面包含大量操作首尾元素的方法
注意:LinkedList集合特有的方法,不能使用多态
常用的方法:
public boolean addFirst(E e):将指定元素插入此列表的开头
public boolean addLast(E e):将指定元素插入此列表的结尾 等效于add
public boolean push(E e):将元素推入此列表所表示的堆栈 等效于addFirst
public E getFirst()获取并返回第一个元素
public E getLast()获取并返回第二个元素
public boolean isEmpty()此列表不包含元素 则返回ture
public E removeFirst()移除并返回元素
public E removeLast()移除并返回元素
3.3 Vector集合
可以实现可增长的对象数组,单线程
四、Set集合
4.1 HashSet集合及介绍
java.util.Set接口 extends Collection接口
Set接口的特点:
-
不允许存储重复元素
-
没有索引,没有带索引的方法,不能使用普通的for循环遍历
java.util.HashSet实现了implements Set接口
HashSet特点:
- 不允许存储重复元素
- 没有索引,没有带索引的方法,不能使用普通的for循环遍历
- 是一个无序的集合,存储元素和取出元素的顺序有可能不一样
- 底层是一个哈希表结构(查询速度非常快)
4.2 HashSet集合存储结构(哈希表)
哈希值
哈希值:是一个十进制整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,模拟出来得到的地址,不是数据实际存储的物理地址)
在Object类里面有一个方法可以获取对象的哈希值
public int hashCode();
toString()返回的也是哈希值,是16进制
重写hashCode方法 ,就算两个哈希值一样,物理地址也不相等(==)
哈希表

Set集合不允许创建重复元素的原理:
Set集合在调用add方法时,add会调用元素的hashCode和equals方法,判断元素是否重复

4.3 HashSet存储自定义元素

4.4 LinkedHashSet集合
java.util.LinkedHashSet
特点:
底层是哈希表(数组+链表/红黑树)+链表:多了一条链表,记录元素的存储顺序,保证元素有序。
有序,不允许重复
五、Collections集合工具
5.1 常用方法
public static
public static void suffle(List<?> list);打乱集合顺序
public static
注意:
sort(List
被排序的集合里面存储的元素必须实现Comparable,重写接口中的方法compareTo的排序规则
Comparable接口的排序规则:
自己(this)-参数:升序
参数-自己(this):降序
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,83,1,32,77,10,3);
System.out.println(list);
Collections.shuffle(list);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
ArrayList<Person> person = new ArrayList<>();
Person p1 = new Person("小红",20);
Person p2 = new Person("小明",27);
Person p3 = new Person("小黄",18);
Collections.addAll(person,p1,p2,p3);
Collections.sort(person);
System.out.println(person);
Person类
package com.dy.list;
public class Person implements Comparable<Person>{
private String name;
private Integer age;
public Person() {
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public int compareTo(Person o) {
return this.age-o.age;
}
}
public static
public static
Comparable和Comparator的区别:
Comparable:自己(this)和别人(参数)做比较,自己需要实现Comparable接口,重写比较的规则compareTo方法
Comparator:相当于找一个第三方裁判,比较两个
Comparator排序规则:
o1-o2 升序
浙公网安备 33010602011771号