Java基础 - Collection 集合
java.util.Collection 接口(集合框架)
Collection -> (所有集合的顶级接口)
集合 -> 用来保存一组元素的,不同的实现类实现了不同的数据结构
集合和数组一样,保存一组元素,但是操作元素的方法集合已经提供了!
常用的子接口:
- java.util.List -> 线性表(可以存放重复元素,并且有序)
- java.util.Set -> 不可以重复的集合,大部分实现类是无序,是否重复元素是根据自身equals比较的结果判定的
Collection基本操作:
// Collection集合不需要和数组一样添加新元素后需要扩容
// 输出集合与元素的toString()方法有直接关系(按照toString()方法返回值输出)
// 集合中不可以存放基本类型元素(存放会执行Java的自动装箱特性)
// 集合存放元素的引用
Collection c = new ArrayList(); // -> List
Collection c = new HashSet(); // -> Set
c.add( E e ); // 向集合中添加元素。 -> 返回boolean
c.size(); // 集合的大小。 -> 返回集合大小
c.isEmpty(); // 判断集合是否为空集。 -> 返回boolean
c.clear(); // 清空集合。
c.contains(E e); // 判断集合中是否包含e(元素) ->返回boolean
// 判断依据 -> 根据给定元素与集合每一个元素进行equals比较,
// 为true的,就认为包含,所以元素的equals()方法
// 直接影响contains的判断结果
c.remove(E e); // 删除元素
// 删除依据 -> 与元素的equals()方法有直接关系
// List集合中存在多个相同元素时,
// 只会删除前一个元素;Set集合不存在此问题
集合之间的操作:
Collection c1 = new ArrayList(); c1.add(E e);
Collection c2 = new ArrayList(); c2.add(E e);
c1.addAll(c2); // 添加所有元素(将c2中的所有元素放到c1集合中)
// List可以存在重复元素;Set无重复元素
c1.containsAll(c2); // 判断是否全部包含c2元素 ->返回boolean
c1.removeAll(c2); // 会删除当前集合中与给定集合的共有元素(交集)
遍历:
// 遍历集合
// 集合提供了统一的遍历操作
// 无论哪种数据结构实现的集合都提供了迭代器模式遍历(Iterator)方式
// Iterator -> 提供的iterator方法可以获取一个用于遍历当前集合的迭代器
// java.util.Iterator接口(迭代器接口),规定了遍历集合的相关操作,所有集合都有
// 一个用于遍历自身的迭代器实现类,我们无需关注它们的类名,以多态的角度用
// 该接口看待并调用相关遍历方法即可。
// 迭代器遍历集合的统一方式: 问->取->删(不是必须操作)
// 迭代器中不允许使用集合的方法增加和删除元素操作(否则会抛出异常)
Collection c = new ArrayList();
c.add(E e);
Iterator it = c.iterator();
while(it.hasNext()){ // 问 -> it.hasNext()通过迭代器查看是否还有元素可以遍历
String str = (String)it.next(); // 取 -> it.next()通过迭代器遍历下一个元素
System.out.print(str);
it.remove(); // 删除集合中的元素(不允许使用集合的方法删除删除元素)
}
// JDK5之后 -> for循环(增强型)新循环
// 是编译器认可,而不是虚拟机,编译器在编译源码时会将新循环遍历改为for循环遍历
String[] array = {"xxx","xxx",...};
for(String str : array){
System.out.println(str);
}
Collection c = new ArrayList();
c.add(E e);
使用新循环遍历集合会被编译器编译时改为使用迭代器遍历,
因此要遵循迭代器使用规范,遍历过程中不能通过集合的方法增删元素
for(Object o : c){
String str = (String)o;
System.out.println(str);
}
泛型:
// JDK5之后 -> 泛型(参数化类型)
// 允许我们在使用一个类时指定它的属性,方法参数和返回值类型(使用更灵活)
// 原型 -> Object(不指定时就使用它)
// 在集合中 -> 规定集合中元素类型
Collection<String> c = new ArrayList<String>(); // 只能存放String类型
List线性表:
// java.util.List(线性表)
// List集合可以存在重复集合,并且有序
// 可以通过下标操作元素
// 常用实现类:
// java.util.ArrayList -> 数组实现,查询性能好,增删元素差
// java.util.LinkedList -> 链表实现,增删元素性能好(首尾最佳),查询差
List<E> list = new ArrayList<>(); // JDK7之后,右侧<>可以不用写泛型类型
list.add(E e); // 添加元素。
list.get(int index); // 获取给定下标处对应的元素。
for(int i=0;i<list.size();i++){ // 遍历list集合内的元素
list.get(i);
}
list.set(int index,E e); // 在index位置上替换元素为e。 ->返回替换之前元素
list.add(int index,E e); // 在index位置插入元素e。
list.remove(int index); // 删除index位置上的元素 ->返回删除的元素
list.subList(int index1,int index2); // 截取index1到index2之间的元素
// ->返回截取元素集合
集合 <=> 数组
// 集合 => 数组
// Collection中定义了一个方法toArray
Collection<String> c = new ArrayList<>();
c.add("xxx");
Object[] array = c.toArray(); // JDK5之前只能这样转
String[] array = c.toArray(new String[c.size()]); // JDK5之后可以直接转为String
System.out.println(Arrays.toString(array));
// 数组 => 集合
// 数组的工具类Arrays提供了一个静态方法asList(可以将给定的数组转换为List结合)
// 对转换来的集合元素操作(增删)就是对原数组对应元素的操作(只能通过重新new集合才可以)
// 不可以改变集合中元素个数(因为数组是定长的)
String[] array = {"xxx","xxx",...};
List<String> list = Arrays.asList(array); // 将数组转换为集合
List<String> list2 = new ArrayList<>(Arrays.asList(array));
list2.add("five");
集合排序:
// 自然排序(小 - 大)
List<Integer> list = new ArrayList<>();
list.add(1);...
Collection.sort(list);
// 自定义排序(需要提供比较器)要重写方法
// 按照某个属性排序
// 新建比较器(返回0 -> 相等;返回1 -> 大于;返回-1 -> 小于)
Collections.sort(list, new Comparator<T>{
public int compare(T o1,T o2){
return (int)Math.signum(o1.属性-o2.属性);
}
});
// 字符串编码 -> 按照字符中的字符编码进行比较
// 比较两个字符串的时候:0 -> 相等、正数 -> 第一个大、负数 -> 第二个大
// 先比较前一个字符,相同再比较第二和字符编码大小以此类推
String o1 = "李";
String o2 = "王";
o1.compareTo(o2);