Java - 集合

List

List 遍历
public void listTraversal() {
    List<String> list = Arrays.asList("0", "1", "2");

    // List转数组后,遍历数组达到对List中的元素进行遍历
    String[] arr = new String[list.size()];
    arr = list.toArray(arr);
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
    }
    System.out.println();

    // 一般for循环,通过索引来遍历
    for (int i = 0; i < list.size(); i++) {
        System.out.print(list.get(i) + " ");

    }
    System.out.println();

    // 增强for循环
    for (Object obj : list) {
        System.out.print(obj + " ");
    }
    System.out.println();

    // 用迭代器遍历集合框架,它是一个对象,实现了Iterator接口或ListIterator接口
    // 采用迭代器的方法,该方法可以不用担心在遍历的过程中会超出集合的长度
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        System.out.print(iterator.next() + " ");
    }
    System.out.println();

    // JDK8新增Lambda表达式
    // JDK8之前,集合类的迭代都是外部的,即客户代码,而内部迭代意味着改由Java类库来进行迭代
    list.forEach(obj -> System.out.print(obj + " "));
}

List 雷区!!

Arrays.asList() 数组转集合
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}
/**
 * 【强制】使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方
 * 法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
 * 说明: asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。
 * Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。
 */
@Test
public void testAPIasList() {
    String[] str = new String[]{"you", "wu"};
    List list = Arrays.asList(str);

    // 编译正常,运行时报UnsupportedOperationException异常
    // list.add("ss");

    // 数组元素修改,list的元素也会随着修改!
    str[0] = "gujin";
    System.out.println(list.get(0));// gujin
}
T[] toArray(T[] a)、 T[] toArray(T[] a) 集合转数组
/**
 * 【强制】使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全
 * 一样的数组,大小就是 list.size()。
 * 说明: 使用 toArray 带参方法,入参分配的数组空间不够大时, toArray 方法内部将重新分配
 * 内存空间,并返回新数组地址; 如果数组元素个数大于实际所需,下标为 [ list.size() ]
 * 的数组元素将被置为 null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集
 * 合元素个数一致。
 * 反例: 直接使用 toArray 无参方法存在问题,此方法返回值只能是 Object[] 类型,若强转其它
 * 类型数组将出现 ClassCastException 错误。
 */
@Test
public void testAPItoArray() {
    List<String> list = new ArrayList<String>(2);
    list.add("guan");
    list.add("bao");
    String[] array = new String[list.size()];
    array = list.toArray(array);
    System.out.println(Arrays.toString(array));

    // toArray() 无参方法,返回值类型只能是 Object[]
    Object[] objArr = list.toArray();
    System.out.println(Arrays.toString(objArr));
    String[] strArr = list.toArray();// 编译错误
}
List subList(int fromIndex, int toIndex)
/**
 * 【强制】 ArrayList的 subList 结果不可强转成ArrayList,否则会抛出 ClassCastException异常!
 * 即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList.
 * 说明: subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,
 * 而是 ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。
 */
@Test
public void testAPIsubList() {
    // List<E> subList(int fromIndex, int toIndex);

    List<String> list = new ArrayList<>(2);
    list.add("1");
    list.add("2");
    list.add("3");
    list.subList(0, 1);
    System.out.println(list.toString());// [1, 2, 3]

    list.subList(0, 1).add("4");
    System.out.println(list.toString());// [1, 4, 2, 3]

    list.subList(1, 4).add("5");
    System.out.println(list.toString());// [1, 4, 2, 3, 5]

    // java.lang.IndexOutOfBoundsException: toIndex = 6
    // list.subList(1, 6).add("7");
    // System.out.println(list.toString());

    list = list.subList(1, 2);
    System.out.println(list.toString());// [4]

    list.subList(0, 1).remove(0);
    System.out.println(list.toString());// []

    // 编译错误!!
    //ArrayList<String> subList = list.subList(0, 1);
}

Map

Map 遍历
public void mapTraversal() {
    Map<String, Object> map = new HashMap<>();
    map.put("one", 1);
    map.put("two", 2);
    map.put("three", 3);

    // 增强for循环遍历key
    for (String key : map.keySet()) {
        System.out.println("key: " + key);
    }
    // 增强for循环遍历value
    for (Object value : map.values()) {
        System.out.println("value: " + value);
    }
    // 效率极低
    for (String key : map.keySet()) {
        System.out.println("key: " + key + ", value: " + map.get(key));
    }

    /**
     * Map.Entry:一个Map的内部类,描述在一个Map中的一个元素(键/值对)
     */
    // 通过Map.entrySet遍历key和value(推荐,尤其是容量大时)
    for (Map.Entry<String, Object> entry : map.entrySet()) {
        System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
    }

    // 通过Map.entrySet使用iterator遍历key和value
    Iterator<Map.Entry<String, Object>> entryIterator = map.entrySet().iterator();
    while (entryIterator.hasNext()) {
        Map.Entry<String, Object> entry = entryIterator.next();
        System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
    }

    // JDK8新增Lambda表达式
    map.forEach((key, value) -> System.out.println("key: " + key + ", value: " + value));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值