集合类的主要内容
类集
- 类集实际上就属于动态对象数组;
Collection集合接口
- java的类集里面提供了两个最为核心的接口:Collection,Map
- Collection接口的操作形式与链表的操作形式相似,每一次只能对单个对象进行处理
- Collection是单个集合保存的最大父接口
public interface Collection<E> extands Iterable<E>
- Collection接口有泛型应用,可以避免ClassCastException,里面的所有数据的保存类型应该是相同的
- 接口中的常用方法
NO | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public boolean add(E e) | 普通 | 向集合中添加数据 |
2 | public boolean addAll(Collection<? extands E>c) | 普通 | 向集合中添加一组数据 |
3 | public void clear() | 普通 | 清空集合数据 |
4 | public boolean contains(Object o) | 普通 | 查找数据是否存在,需要使用equals()方法 |
5 | public boolean remove(Object o) | 普通 | 删除数据,需要equals()方法 |
6 | public Object[] toArray() | 普通 | 将集合变为对象数组返回 |
7 | public int size() | 普通 | 取得集合长度 |
8 | public Iteratoriterator() | 普通 | 取得Iterator接口对象,用于集合输出 |
- 在实际开发应用中,我们往往使用Collection接口的子接口:List(允许数据重复),Set(不允许数据重复)
- Collection接口中有两个重要方法:add()、iterator()。子接口都有这两个方法。
子接口List接口
- List接口提供的方法
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public E get(int index) | 普通 | 根据索引取得保存数据 |
2 | public E set(int index,E element) | 普通 | 修改数据 |
- List本身是一个接口,因此要想取得接口的实例化对象,必须有子类;List接口下有三个常用子类:ArrayList,Vector,LinkedList
ArrayList子类
- 针对于List接口的数组实现
public class Collect {
public static void main(String[] args) {
//此时集合里面只保存String类型
List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("hello");
System.out.println(list);
System.out.println(list.contains("world"));
System.out.println(list.remove("hello"));
list.clear();
System.out.println(list.size());
}
}
- List存在get()方法,可以利用get()方法结合索引取得数据
for(int i = 0;i<list.size();i++){
System.out.println(list.get(i)+",");
}
- get()方法是List子接口提供的,如果现在操作的是Collection接口,那么对于此时的数据取出只能够将集合变为对象数组操作
Collection<String> list = new ArrayList<>();
list.add("hello");
list.add("hello");
list.add("world");
Object[] result = list.toArray();
System.out.println(Arrays.toString(result));
集合与简单java类
- 在以后的应用中,集合里面保存最多的数据类型是简单java类
- 向集合保存简单Java类对象
class Person1{
private String name;
private int age;
public Person1(String name,int age){
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if(this == obj){
return true;
}
if(obj == null){
return false;
}
if(!(obj instanceof Person1)){
return false;
}
//向下转型为Person1对象比较属性
Person1 per = (Person1) obj;
return this.age == per.age && name.equals(per.name);
}
@Override
public String toString() {
return "Person1{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Collect {
public static void main(String[] args) {
List<Person1> list = new ArrayList<>();
Person1 per1 = new Person1("zhang",18);
Person1 per2 = new Person1("wang",21);
Person1 per3 = new Person1("li",23);
list.add(per1);
list.add(per2);
list.add(per2);
System.out.println(list.contains(new Person1("wang",21)));
System.out.println(list.contains(per2));
}
}
子类Vector
public static void main(String[] args) {
List<String> list = new Vector<>();
list.add("hello");
list.add("hello");
list.add("world");
System.out.println(list);
list.remove("hello");
System.out.println(list);
}
ArrayList与Vector的区别
-
产生版本: Vector是JDK1.0产生; ArratList是JDK1.2产生。
-
线程安全: Vector采用在方法上添加synchronized来保证线程安全,性能较低;ArrayList采用异步处理,性能较高,线程不安全
-
初始化以及扩容策略: Vector对象产生时就初始化数组长度为10,当数组长度不够用时,扩容策略变为原来数组的2倍;ArratList使用懒加载策略,在第一次添加元素时才初始化数组大小,当数组不够用时,扩容为原数组的1.5倍
子类LinkedList
- 这个子类如果向父接口转型的话,使用形式与之前没有任何区别
- ArrayList封装的是数组;LinkedList封装的是链表。
- ArrayList时间复杂度为1,而LinkedList的复杂度为n。
Set集合接口
- 在Set子接口中有两个常用子类:HashSet(无序存储),TreeSet(有序存储)
- Set接口没有对Collection接口进行扩充,所以没有get()方法
HashSet的使用
Set<String> set = new HashSet<>();
set.add("hello");
set.add("bit");
set.add("java");
set.add("hello");
System.out.println(set);
结果无序排列;结果不包含重复元素
TreeSet的使用
- TreeSet使用的是升序排列的模式完成的
Set<String> set = new TreeSet<>();
set.add("C");
set.add("B");
set.add("C");
set.add("A");
System.out.println(set);
结果有序排列;结果不包含重复元素