《集合框架(一)》
目录
一、集合框架简介
集合框架是一个用来代表和操纵集合的统一架构。Java 集合框架提供了一套性能优良、使用方便的接口和类(位于java.util包中), 包含了动态数组、链表、树、哈希表、图等多种数据结构与算法。
集合框架体系
概念解读
- :泛型,指定元素类型(()传对象,<>传类型);
- Iterator:迭代器,用于遍历集合及遍历时的元素操作;
- List:允许重复元素存在的有序集合(添加顺序);
- Set:不允许重复元素存在的无序集合(允许null值存在);
- Map:不允许重复元素存在的键值对(k-v)集合;
- Stack:栈(先进后出,后进先出);
- Queen:队列(先进先出,后进后出);
- Comparator/Comparable:比较器(指定TreeSet、TreeMap排序规则)。
通用方法
- size():查看集合大小;
- iterator():获取集合迭代器。
Lambda 表达式
- Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
- Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
- 使用 Lambda 表达式可以使代码变的更加简洁紧凑。
二、List集合
主要实现类
- ArrayList(动态数组):连续空间,查询快,增删慢;
- LinkedList(链表):Node节点链,查询慢,增删快;
- Vector(动态数组):线程同步(多线程下效率慢)。
List测试
- 集合创建
List<String> list = new ArrayList<>();
- 添加元素(add方法)
list.add("c");
list.add("b");
list.add("a");
list.add("a");
- 查看集合大小(size方法)
System.out.println(list.size());
- 移除元素(remove方法)
list.remove(0); //通过下标移除
list.remove("c"); //指定元素移除
- List遍历
//1.下标遍历法
System.out.println("-------------------下标遍历法-------------------");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//2.for_each遍历法
System.out.println("-------------------for_each遍历法-------------------");
for (String x : list) {
System.out.println(x);
}
//3.集合lambda表达式遍历法
System.out.println("-------------------集合lambda表达式遍历法-------------------");
list.forEach(x -> System.out.println(x)); //简写:list.forEach(System.out::println);
//4.迭代器(从前往后)
System.out.println("-------------------迭代器-------------------");
Iterator<String> it1 = list.iterator();
while (it1.hasNext()) {
String x = it1.next();
System.out.println(x);
}
//5.双向迭代器(从前往后+从后往前)
System.out.println("-------------------双向迭代器-------------------");
ListIterator<String> it2 = list.listIterator(list.size());
while (it2.hasPrevious()) {
String x = it2.previous();
System.out.println(x);
}
三、Set集合
主要实现类
- HashSet:无序Set(普通)
- LinkedHashSet:有序Set(添加顺序)
- TreeSet:有序Set(自定义排序规则)
HashSet
Set<String> set = new HashSet<>();
set.add("c");
set.add("a");
set.add("b");
set.add("x");
set.add("k");
set.add(null);
set.add("a"); //重复则不添加
set.forEach(System.out::println);
执行结果
Set去重原理
Set集合添加新对象时,首先判断集合中是否存在与新对象相同的hashcode,如果不存在则添加,存在则进行equals内容比较。因此,想要自定义去重规则,就先要重写这两个方法。
- User类
package com.hpr.entity;
import java.util.Objects;
public class User {
private int id;
private String name;
private int age;
//带参构造
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id;
}
}
- 测试类
Set<User> set = new HashSet<>();
set.add(new User(1001, "Alice", 18));
set.add(new User(1002, "Bob", 20));
set.add(new User(1003, "Clover", 22));
set.add(new User(1001, "Divid", 21)); //id重复的对象
set.forEach(System.out::println);
执行结果
LinkedHashSet
Set<String> set = new LinkedHashSet<>();
set.add("c");
set.add("a");
set.add("b");
set.add("x");
set.add("k");
set.add(null);
set.forEach(System.out::println);
执行结果
TreeSet
- Comparator外部比较器
- 测试类
Comparator<User> c = (o1, o2) -> o2.hashCode() - o1.hashCode();
Set<User> set = new TreeSet<>(c);
set.add(new User(1001, "Alice", 18));
set.add(new User(1002, "Bob", 20));
set.add(new User(1003, "Clover", 22));
set.forEach(System.out::println);
执行结果
- Comparable内部比较器(自定义类实现该接口并重写compareTo方法)
...
public class User implements Comparable<User> {
...
@Override
public int compareTo(User o) {
return o.id - this.id;
}
}
- 测试类
Set<User> set = new TreeSet<>();
set.add(new User(1001, "Alice", 18));
set.add(new User(1002, "Bob", 20));
set.add(new User(1003, "Clover", 22));
set.forEach(System.out::println);
执行结果
总结
重点
- 集合框架体系及常用接口;
- List集合主要实现类及区别;
- 集合遍历方式;
- Set集合主要实现类及区别;
- Set去重原理及实现手段。
难点
- 集合遍历方式;
- Set去重原理及实现手段。