2021-02-27
为什么学习集合?
Java时面对对象的语句,对对象会经常的操作,容器可以存储对象,比较操作对象的元素增删改查
数组 存储对象 长度固定不变 增加和删除操作麻烦
StringBuilder和StringBuffer只能存储字符串对象
学习集合关注点
1、是否唯一
2、是否是可排序【存储时保持是否有序】
3、是否可以存储null元素
4、是否效率高【集合的数据结构:数组,栈,链表,队列,哈希表,二叉树等】
5、是否可以重复【顺序存储,元素是否重复】
一、集合
1、集合概念
是Java中提供的一种容器,可以用来存储多个不同类型的数据;
2、数组 & 集合 的区别
数组:长度都是固定的,存储的同一类型的元素;
集合:长度可变的,存储多个不同类型的对象(引用类型或者包装类型);
3、集合的体系结构图
二、Collection单列集合
1、概念
java.util.Collection接口
是所有单列集合的父接口(顶层父类接口)
2、Collection常用方法
Collection中定义了单列集合List和Set通用的方法,方法如下:
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo{
public static void main(String[] args) {
//使用实现类ArrayList创建集合对象(多态)
Collection<String> c = new ArrayList<>();
//增
//boolean add(E e) 向集合中添加元素
c.add("张三");
c.add("李四");
c.add("王五");
c.add("赵六");
System.out.println(c);//[张三, 李四, 王五, 赵六]
//删
//boolean remove(Object o) //移除集合中某个元素
c.remove("李四");
System.out.println(c);//[张三, 王五, 赵六]
//void clear() 移除集合中的所有元素
c.clear();//[]
//判断
//boolean isEmpty() 判断集合是否为空,空则返回 true。
System.out.println(c.isEmpty());//true
//boolean contains(Object o)判断集合中是否包含指定的元素,是则返回 true。
c.contains("李四");//false
//获取
//int size() 获取集合的长度。
System.out.println(c.size());//0
//转换
//Object[] toArray()将集合转换为数组。
Object[] arr = c.toArray();
for (int i = 0; i <arr.length ; i++) {//遍历数组
System.out.println(arr[i]);
}
}
}
3、集合元素去重复
存储是有顺序的,需要去重复,如何去重?
看代码,懂知识;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Objects;
//去重
public class Test1 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add(new Student("张三",28));
c.add(new Student("李四",28));
c.add(new Student("张三",28));
c.add(new Student("张三",18));
//新建一个新的集合
//遍历老的集合,在老的集合里面查找没有元素可以添加到新的集合里面
//新的集合里面包含有这个老的集合元素,如果老的集合在添加新的集合里面的时候
//如果没有包含集合元素 ,就说明可以添加老的集合元素
Collection newC = new ArrayList();//新的集合
//遍历老集合
for (Object obj : c) {
if(!newC.contains(obj)){//判断新集合里面的元素是否包含老集合的元素
newC.add(obj);//没有就添加进新元素
}
}
//遍历输出新集合
//foreach遍历集合,底层时迭代器
for (Object obj: newC) {//Object是迭代类型 obj是名称 : newC是需要遍历的数组或者集合
System.out.println(obj);//obj相当于arr[i]
}
}
}
class Student{
private String name;
private Integer age;
public Student() {
}
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
//需要重写equals,用于比较两个对象的内容是否相同
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(name, student.name) &&
Objects.equals(age, student.age);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
//需要重写toString方法,不然会打印地址
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}`