Java Collection体系
Collection 接口
宏观图
快速使用
import java.util.*; public class Demo { public static void main(String[] args) throws Exception{ Collection collection = new ArrayList(); // 添加 collection.add("小明"); collection.add("小红"); collection.add("小红"); // 遍历:使用增强for for (Object obj: collection) { String str = obj.toString(); System.out.println(str); } // 遍历:使用迭代器 Iterator iter = collection.iterator(); while (iter.hasNext()){ String str = iter.next().toString(); System.out.println(str); } // 删除 collection.remove("小红"); // 其它 System.out.println(collection.size()); // 2 } }
常用方法
boolean add(Object obj) | 添加一个对象 |
boolean addAll(Collection o) | 将一个集合中的所有对象添加到此集合 |
int size() | 返回该集合的长度 |
void clear() | 清空此集合的所以对象 |
boolean remove(Object obj) | 移除集合中的 obj 对象 |
boolean removeAll(c) | 移除此集合中,c中包含的元素 |
boolean retainAll(c) | 移除此集合中,c没有包含的元素(交集) |
boolean contains(Object obj) | 该集合是否存再 obj 这个对象 |
boolean equals(Object obj) | 该集合是否与obj集合相等 |
boolean isEmpty() | 该集合是否为空 |
Object[] toArray() | 将此集合转换成数组 |
Iterator iterator() | 迭代器 |
List 接口
List 接口继承了 Collection 接口。
有序,有索引,可重复。
快速使用
import java.util.*; public class Demo { public static void main(String[] args) throws Exception{ List list= new ArrayList(); // 可根据索引添加 list.add("two"); list.add(0,"one"); list.add("three"); // 可根据索引删除 list.remove(2); // 根据取值 System.out.println(list.get(0)); // one System.out.println(list.get(1)); // two // 重新赋值 list.set(0, "first"); list.set(1, "second"); // 生成子列表 List subList = list.subList(0, list.size()); System.out.println(subList); // [first, second] // 遍历: 因为列表有索引,可以使用普通的for for (int i = 0; i < list.size(); i++) { String arg = list.get(i).toString(); } // 遍历: 使用列表迭代器 ListIterator iter = list.listIterator(); while (iter.hasNext()){ String arg = iter.next().toString(); } } }
常用方法
继承方法,请看 Collection。
add(int index, Object e) | 根据索引添加元素 |
get(int index) | 根据索引取元素 |
set(int index, Object e) | 根据索引重新赋值 |
remove(int index) | 根据索引删除元素 |
indexOf(Object e) | 获取该元素的索引 |
subList(int fromIndex, int toIndex) | 根据范围,取该列表的元素,重新生成的新的列表 |
listIterator() | 列表生成器 |
List 实现类
下面三个类,都采用 List 接口实现。Vector 开发中在基本不再使用。
Set 接口
Set 接口继承了 Collection 接口。并没有添加的新的方法。
无序,无索引,自动去重。
快速使用
package com.demo.study3; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class Demo { public static void main(String[] args){ // 由于接口,只能调用实现类 Set<String> student = new HashSet<>(); // 添加元素 student.add("小明"); student.add("小红"); student.add("小明"); student.add("小军"); System.out.println(student); // [小明, 小军, 小红] // 删除元素 student.remove("小军"); // 遍历 1. 增强for for (String name: student) { System.out.println(name); } // 遍历 2. 生成器 Iterator iterator = student.iterator(); while (iterator.hasNext()){ System.out.println("iter: " + iterator.next()); } // 其它 System.out.println(student.size()); // 数量 System.out.println(student.contains("小明")); // 是否存在 student.clear(); // 清空 } }
Set 实现类
HashSet 存储过程
过程
- 根据 hasCode 计算保存位置,如果此位置为空直接保存,不为空看步骤2
- 再执行 equals 方法,如果 equals 方法为 true 则去重,否则形成链表并保存
实例
我们添加了三个Person对象,两个是相同的数据,结果没有去重。
package com.demo.study4; import java.util.HashSet; import java.util.Objects; public class Demo { public static void main(String[] args) { HashSet set = new HashSet(); // 实例化对象 Person p1 = new Person("小明", 18); Person p2 = new Person("小智", 35); Person p3 = new Person("小智", 35); // 添加对象 set.add(p1); set.add(p2); set.add(p3); // 输出个数 System.out.println(set.size()); // 3 } }
那如果去重呢,那就是 Person 类进行重写 hasCode,equals 方法。
package com.demo.study4; import java.util.HashSet; import java.util.Objects; public class Demo { public static void main(String[] args) { HashSet set = new HashSet(); // 实例化对象 Person p1 = new Person("小明", 18); Person p2 = new Person("小智", 35); Person p3 = new Person("小智", 35); // 添加对象 set.add(p1); set.add(p2); set.add(p3); // 输出个数 System.out.println(set.size()); // 3 } } class Person{ String name; int age; // 构造方法 Person(String name, int age){ this.name = name; this.age = age; } // 重写 equals 方法 @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } // 重写 hasCode 方法 @Override public int hashCode() { return Objects.hash(name, age); } }
TreeSet
快速使用
你需要使用接口(comparable)进行定义比较规则,也可以先定义这样就不需要使用借口了。String 内部已实现无需使用接口。
import java.util.TreeSet; public class Demo { public static void main(String[] args) { // 创建 TreeSet 对象 TreeSet<Student> treeSet = new TreeSet<>(); // 创建 Student 对象 Student student1 = new Student("kidd", 16); Student student2 = new Student("tom", 20); Student student3 = new Student("kidd", 18); Student student4 = new Student("kidd", 18); // 将 Student 对象添加到 TreeSet 集合当中 treeSet.add(student1); treeSet.add(student2); treeSet.add(student3); treeSet.add(student4); System.out.println(treeSet.toString()); // [Student{name='kidd', age=16}, Student{name='kidd', age=18}, Student{name='tom', age=20}] } } class Student implements Comparable<Student>{ // 定义属性 String name; int age; // 构造方法 public Student(String name, int age){ this.name = name; this.age = age; } // Object 的 toString 方法重写 @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } // 使用Comparable接口的compareTo进行该如何比较。 @Override public int compareTo(Student o) { int i1 = this.name.compareTo(o.name); int i2 = this.age - o.age; return i1==0 ? i2:i1; } }