上期回顾:
file://D:/%E9%BB%91%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%91%98/2018Java%E5%9F%BA%E7%A1%80%E7%AC%AC%E4%BA%8C%E9%98%B6%E6%AE%B5/%E8%87%AA%E5%B7%B1%E6%80%BB%E7%BB%93/img/Collection%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6.jpg?lastModify=1533092632 数据结构数据结构就是数据的存储方式; 栈特点: 先进后出(FILO,First In Last Out) 入口和出口在同一侧 适用场景: JVM中栈中程序运行机制 反转内容(车尾变车头,进出在出来就反转了) 队列特点: 先进先出 (FIFO,first in first out) 出口入口在两侧 适用场景: 处理高并发场景 秒杀,抢购 在线售票 file://D:/%E9%BB%91%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%91%98/2018Java%E5%9F%BA%E7%A1%80%E7%AC%AC%E4%BA%8C%E9%98%B6%E6%AE%B5/%E8%87%AA%E5%B7%B1%E6%80%BB%E7%BB%93/img/%E9%AB%98%E5%B9%B6%E5%8F%91%E5%9B%BE%E7%A4%BA?lastModify=1533092632 数组特点: 查询快:地址连续,有索引 (第一个元素地址值+索引)可以快速计算出该索引元素的地址值 增删慢:长度固定,增删需要新建数组并复制数据 适用场景: 查询多,增删少 链表链表: 链表由多个 节点(Node / Entry) 组成 特点: 查询慢:地址不连续,每次查询从头开始 增删快:增删元素对链表整体机构无影响,只需要修改保存的下一个节点的地址值 适用场景: 查询少,增删多 补充 参考Map中Entry节点红黑树特点: 元素存储过程中就完成了大小排序 查询比链表快, 增删比数组快 (数组和链表的折中) 适用场景: 查询和增删都有, 需要元素自动排序的场景 List集合特点: (数组结构决定) 1. 元素存取有序 (存入和取出元素的顺序一致) 2. 元素可以重复 3.有索引 特有方法:
void add(int index,E element)
E get(int index)
E remove(int index)
E set(int index,E element)ArrayList集合ArrayList底层的数据结构: 数组ArrayList的特点: 查询快 增删慢 线程不安全, 效率高 不使用锁对象 ArrayList适用场景: 存储的数据查询多, 增删少的场景 LinkedList集合LinkedList底层的数据结构: 链表LinkedList的特点: 查询慢 增删快 线程不安全, 效率高 不使用锁对象LinkedList适用场景: 存储的数据查询少, 增删多的场景 特有方法:
void addFirst(E e)
void addLast(E e)
E getFirst(E e)
E getLast(E e)
E removeFirst()
E Pop()
void push(E e)Vector集合目前几乎无人使用 Set集合特点: 元素不能重复 重写了hashCode()和equals()方法 应用:对集合重复元素去重 无索引 哈希表结构(数组+链表结构/红黑树) 无序(TreeSet例外) 哈希表结构 HashSet集合常用方法:
boolean add(E e)自定义的JavaBean对象去重: 重写hashCode()和equals()方法 Alt+Ins 补充:
HashSet集合保证添加元素不重复的原理:
调用 add(E e) 添加元素时, 先调用 hashCode() 获取哈希值, 和当前HashSet集合中的元素比较
如果哈希值不同, 则认为元素不重复, 添加, 并返回true
如果哈希值相同, 则有可能是哈希冲突, 所以继续调用元素的 equals() 方法和所有哈希值相同的元素比较
如果 equals() 比较所有元素都没有相同的, 则认为元素不重复, 添加, 并返回true
如果 equals() 比较出有相同的元素, 则认为元素重复, 不添加, 并返回falseLinkedHashSet集合特有特点: 存取有序 哈希表+链表(数组+链表/红黑树+链表) 可变参数格式: 用在方法的参数中
修饰符 返回值类型 方法名(参数类型... 变量名) {
// 可以直接将 变量名 当作 数组名 使用
}
注意事项:
1. 可变参数可以传递的参数个数, 可以是 0个, 1个, 多个
2. 一个方法的参数列表中, 只能有一个可变参数
3. 如果方法的参数有多个, 可变参数必须写在参数列表的最后Collections集合工具类常用方法:
static <T> boolean addAll(Collection<T> c,T...elements)
static void shuffle(List<?> list)
static <T> void sort(List<T> list): 实现Comparable<E>接口,重写int CompareTo(T e)方法
static <T> void sort(List<T> list,Comparator<?super T>):比较器排序Collections集合工具类:自定义JavaBean对象sort<List<T> list>排序 第一种:
需要实现 Comparable<E> 接口, 重写 int compareTo(E e) 方法
大小的比较通过 compareTo() 方法的返回值确定:
负数: 当前元素比被比较元素小
0: 当前元素与被比较元素相等
正数: 当前元素比被比较元素大
规则:
this-参数: 升序
参数-this: 降序
@Override
public int compareTo(Person o) {
// 比较的规则:
// this.属性值 - 参数o.属性值: 升序
// 参数o.属性值 - this.属性值: 降序
return this.age - o.age; // 升序
// return o.age - this.age; // 升序
}第二种:
Comparator使用方式:
定义类作为比较器, 实现Comparator接口, 重写int compare(E o1, E o2)方法, 泛型为要比较的元素的类型
在Collections.sort(List<T> list,Comparator<? super T>)方法中传入自定义比较器对象
规则:
o1-o2: 升序
o2-o1: 降序
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
// o1 - o2: 升序
// o2 - o1: 降序
return o1.getAge() - o2.getAge();
}
});Comparable接口和Comparetor接口的区别:
Comparable: 让JavaBean自身具有可比较性 (自己和其他人比)
Comparator: 定义一个比较器类, 用比较器对象比 (让第三个人来帮两个人比较)
|