Collection
集合的特点:提供一种存储空间可变的存储类型,存储的数据容量可以随时发生改变。
蓝色是接口 红色是实现类
1.3 Collection 集合概述和使用
Collection集合概述
- 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
- JDK不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现
创建Collection集合的对象
- 多态的方式
- 具体的实现类Array List
Collection< String > c = new ArrayList < String >();
Iterator:迭代器,集合的专用遍历方式
Iterator < String > it=c.iterator();
import java.util.ArrayList;
import java.util.Iterator;
public class RunoobTest {
public static void main(String[] args) {
// 创建集合
ArrayList<String> sites = new ArrayList<String>();
sites.add("Google");
sites.add("Runoob");
sites.add("Taobao");
sites.add("Zhihu");
// 获取迭代器
Iterator<String> it = sites.iterator();
// 输出集合中的第一个元素
System.out.println(it.next());
}
}
while(it.hasNext()) { //输出所有元素
System.out.println(it.next());
}
List集合概述和特点
List集合概述
- 有序集合,用户可以精确控制每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
- 与Set集合不同,列表通常允许重复的元素
List集合特点
- 有序:存储和取出的元素顺序一致
- 可重复:存储的元素可以重复
List集合子类集合特点
List 集合常用子类:ArrayList,LinkedList
- ArrayList:底层数据结构是数组,查询快,增删慢
- LinkedList:底层数据结构是链表,查询慢,增删快
两个用法和方法一模一样 根据需求进行选择,如果不知道就用ArraryList
Set集合
Set集合特点
- 不包含重复元素的集合
- 没有带索引的方法,所以不能使用普通for遍历循环
哈希值:是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
object类中有一个方法可以获取对象的哈希值
- public int hashCode();
HashSet集合概述和特点
HashSet集合特点
- 底层数据是哈希表
- 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
- 没有带索引的方法,所以不能使用普通for循环遍历
- 由于是Set集合,所以是不包含重复元素的集合
用HashSet集合添加学生类 要重写 equals()和hashCode();方法
TreeSet集合概述和特点
TreeSet集合的特点
-
元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法
- TreeSet();根据其元素的自然排序进行排序
- TreeSet(Comparator comparator):根据指定的比较器进行排序
-
没有带索引的方法,所以不能使用普通循环遍历
-
由于是Set集合,所以不包含重复元素的集合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJRddvUl-1628671055342)(https://i.loli.net/2021/08/06/nmoUGFbeYIKlauP.png)]
removeAll(List.of(“sdfdsf”,“sdfds”)); 批量删除
removeIf(e - > e.toString().startsWith(“java”)); //删除含有java的
list.contains(“java”); //判断是否有java
学生按照成绩排序示例
public class StudentDemo1 {
public static void main(String[] args) {
Student s1=new Student("zhang",50);
Student s2=new Student("yang",30);
Student s3=new Student("wang",40);
List<Student> list=new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getPrice()- o2.getPrice();
//return o1.getName().compareTo(o2.getName());
//根据年龄排序
}
});
for (Student l:list){
System.out.println("学生名字"+l.getName()+"成绩"+l.getPrice());
}
}
}
当学生类有姓名和成绩相同时 hashset 集合也会同时存进去 需要在学生类重写equals()和hashCode()方法 idea上面有快捷生成方式alt+insert
public class Student {
private String name;
private int price;
public Student() {
}
public Student(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return price == student.price && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, price);
}
}
测试类
public class StudentDemo2 {
public static void main(String[] args) {
Student s1=new Student("zhang",50);
Student s2=new Student("yang",30);
Student s3=new Student("wang",40);
Student s4=new Student("zhang",50);
Set<Student> set=new HashSet<Student>();
set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
//System.out.println(set);
for (Student s:set){
System.out.println("学生名字"+s.getName()+"成绩"+s.getPrice());
}
}
}