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 存储过程

过程

  1. 根据 hasCode 计算保存位置,如果此位置为空直接保存,不为空看步骤2
  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;
}
}

最新文章

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

热门文章

  1. 安卓app的签名打包
  2. 3、app自动化:使用appium定位元素的方式及元素的常用操作
  3. 请求浏览器重新加载数据/返回前端Json 数据
  4. vim重复、删除、复制、粘贴命令
  5. 渗透测试工具sqlmap基础教程 【转】
  6. 用dig或nslookup命令查询txt解析记录
  7. unity笔记001
  8. JDBC之ResultSet和元数据
  9. Python3 学习基础知识
  10. vscode个人常用插件