Java集合概述——Collection接口

集合API

Collection

怎么创建集合

一些常用的方法

集合怎么转换为数组obj.toArray

数组怎么转换为集合 Arrays.asList

集合怎么迭代Iterable

什么是可选方法

创建Collection对象

  • 通过实现类创建对象

    Collection<String> c1 = new HashSet<>();
    Collection<String> c2 = new TreeSet<>();
    Collection<String> c3 = new LinkedList<>();
    Collection<String> c4 = new ArrayList<>();
    Collection<String> c5 = new Vector<>();
    
  • 通过Arrays.asList创建定长列表

    该方法创建的集合无法执行添加、删除操作

    返回的真实类型是java.util.Arrays.ArrayList extends AbstractList<E>

    对集合进行修改会影响到数组的元素,因为数组和集合元素指向同一个对象

    Collection<String> c1 = Arrays.asList("one", "two", null, null);//可以有null值
    Integer[] arr1 = {1, 2, 3};
    Collection<Integer> c2 = Arrays.asList(arr1);//只能是包装类数组
    
  • 通过副本构造方法创建可变列表

    List<String> list = new ArrayList<>(Arrays.asList("admin", "root"));
    list.add("pwd");
    list.remove("root");
    System.out.println(Arrays.toString(list.toArray()));
    
  • 通过Collections.singleton方法创建不可变集合/列表

    // 返回类型是java.util.Set
    Collection<String> c111 = Collections.singleton("three");
    // 返回类型是java.util.List
    Collection<String> c222 = Collections.singletonList("three");
    
  • java9新增的方法创建不可修改集合/列表

    Collection<String> c1111 = Set.of("one");
    Collection<String> c2222 = List.of("one", "two");//有个重载是不定长参数
    

Collection常用方法

Collection<String> c = new ArrayList<>();

c.add("aaa");//可选操作,有的实现类可能不支持,会抛出UnsupportedOperationException
c.addAll(Arrays.asList("bb", "cc"));//可选操作
System.out.println(Arrays.toString(c.toArray()));// [aaa, bb, cc]
// c.clear();//可选操作
System.out.println(c.contains("bb"));//都会实现的方法

System.out.println(c.containsAll(Arrays.asList("bb", "cc")));

Collection<String> c2 = new ArrayList<>(Arrays.asList("aaa", "bb", "cc"));

System.out.println(c.equals(c2));//如果是自定引用类型,请实现元素的equals和hashCode方法

System.out.println(c.hashCode());

System.out.println(c.isEmpty());

for (var it = c.iterator(); it.hasNext(); ) {
  System.out.println(it.next());
}
c.forEach(s -> System.out.print(s+" "));

c.remove("bb");// 可选操作
c.removeAll(Arrays.asList("cc", "dd")); // 可选操作
System.out.println(Arrays.toString(c.toArray()));// [aaa]

c.addAll(Arrays.asList("aaa", "bb", "cc"));

// 仅保留此集合中包含在指定集合中的元素
c.retainAll(Arrays.asList("aaa", "bb")); // 可选操作
System.out.println(Arrays.toString(c.toArray()));// [aaa]

System.out.println(c.size());

// 3种toArray方法
Object[] arrStr0 = c.toArray();//返回类型是Object[],而java不支持(String[]) list.toArray();
String[] arrStr1 = c.toArray(new String[c.size()]);//返回类型是String[]
String[] arrStr2 = c.toArray(String[]::new);//返回类型是String[]
System.out.println(Arrays.toString(arrStr2));

// 这里省略了removeIf、spliterator、stream、parallelStream这些有关函数式编程的方法

可以分为下面几类

  • 操作整个集合

    c.size()
    c.contains("bb")
    c.hashCode()
    c.clear();//可选操作
    System.out.println(Arrays.toString(c.toArray()));// [aaa, bb, cc]
    c.equals(c2)
    c.isEmpty()
    
    // 3种toArray方法
    // // 得到的数组是个副本,而不是内部数据结构的引用
    Object[] arrStr0 = c.toArray();//返回类型是Object[],而java不支持(String[]) list.toArray();
    String[] arrStr1 = c.toArray(new String[c.size()]);//返回类型是String[]
    String[] arrStr2 = c.toArray(new String[0]);//同上,会自动分配空间
    String[] arrStr3 = c.toArray(String[]::new);//返回类型是String[]
    
  • 操作多个元素

    c.addAll(Arrays.asList("bb", "cc"));//可选操作
    c.containsAll(Arrays.asList("bb", "cc"))
    c.removeAll(Arrays.asList("cc", "dd")); // 可选操作
    // 仅保留在参数中出现的元素
    c.retainAll(Arrays.asList("aaa", "bb")); // 可选操作
    
  • 操作单个元素

    c.add("aaa");//可选操作
    c.contains("bb")
    c.remove("bb");// 可选操作
    
  • 迭代操作(实现了Iterable接口,表明具有迭代的能力)

    for (var it = c.iterator(); it.hasNext(); ) {
      	System.out.println(it.next());
      	it.remove();//必须先next,再remove,而且不能使用该集合的修改方法
      	// c.remove("aa");//ConcurrentModificationException,并发修改异常
    }
    // ListIterator接口继承了Iterator接口,它允许程序员按照任一方向遍历列表,迭代期间修改列表,
    
    // 增强for会有jvm转成iterator语句,当不需要删除或添加集合时,建议使用增强for
    for(var x : c) {
        System.out.println(x);
    }
    
    c.forEach(s -> System.out.print(s+" "));
    c.forEach(System.out::println); // 方法引用
    

可选方法

例如 add()remove()clear()retainAll(),是可选的 API。不过,这个规则在很久以前就定下了,那时认为如果不提供这些方法,明智的做法是抛出 UnsupportedOperationException异常。因此,某些实现(尤其是只读方法)可能会抛出未检异常。

例如,使用Arrays.asList()返回的真实类型是java.util.Arrays.ArrayList extends AbstractList<E>,它没有重写add()remove()等方法,所以调用会抛出 UnsupportedOperationException异常,所以说返回的集合是定长列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值