Java Collection体系
2024-09-08 17:53:32
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;
}
}
最新文章
- QML 从无到有 2 (移动适配)
- appium for iOS config
- CodeIgniter配置之config
- 项目管理办公室 PMO
- MarkFan的程序员客栈
- Leetcode:Repeated DNA Sequences详细题解
- 探讨c#中的unchecked是什么意思,起什么作用?
- 关于各种排列(dfs)
- 201521123062 《Java程序设计》第3周学习总结
- Java第十一周学习总结
- [转载] kill命令
- 中文乱码总结之JSP乱码
- windows环境在本地配nginx
- react使用create-react-app创建的项目部署
- Oracle服务器定位CPU使用率高的瓶颈(SQL)
- WPF通过附加属性控制窗口关闭
- kubernetes-PetSet
- mysql find_in_set
- JSP学习笔记(5)-Java Servlet
- RecyclerView的通用适配器