Java 集合框架之 Collection 实现类

1. List 接口

  • ArrayList 基于数组结构实现,查询快、增删慢,线程不安全
  • Vector 基于数组结构实现,查询快、增删慢,线程安全
  • LinkedList 基于链表结构实现,增删快、查询慢

1.1 ArrayList

  • ArrayList 基于数组实现,是一个动态数组,其容量能自动增长
  • 拥有连续的内存空间
public class ArrayList extends AbstractList
        implements List, RandomAccess, Cloneable, java.io.Serializable {
}

Serializable 接口,支持序列化
RandomAccess 接口,支持快速随机访问
Cloneable 接口,能被克隆

2. Set 接口

特点:无序、无下标、元素不可重复

2.1 HashSet

  • 存储结构:哈希表
  • 基于 HashCode 实现元素不重复
  • 当存入元素的哈希码相同时,会调用 equals 进行确认,若结果为 true, 则拒绝后者存入

2.2 TreeSet

  • 基于排列顺序实现元素不重复

3. 集合操作

3.1 遍历

  • for 循环
  • forEach (本质是通过 Iterator 遍历的)
  • while
  • 流式遍历 (Java8)
@Test
public void iterator() {
    List list = Arrays.asList("111", "222", "333");
    ListIterator iterator = list.listIterator();
    while (iterator.hasNext()) {
        System.out.println("index:" + iterator.nextIndex() + "; element: " + iterator.next());
    }
    while (iterator.hasPrevious()) {
        System.out.println("previousIndex:" + iterator.previousIndex() + "; element:" + iterator.previous());
    }
}
@Test
public void subList() {
    List list = Arrays.asList("111", "222", "333", "444");
    List subList = list.subList(1, 3);
    // subList: [222, 333]
}

3.2 remove() VS removeAll()

@Test
public void test() {
    List all = new ArrayList();
    List little = new ArrayList();

    // List' may not contain objects of type 'List'
    all.remove(little);
  
    // 更正
    all.removeAll(little);
}

3.3 remove()

List 删除元素时,建议使用 Iterator 接口迭代删除 List 元素

@Test
public void remove() {
    List list = new ArrayList();
    list.add("111");
    list.add("222");

    // for (String str : list) {
    //     if ("222".equals(str)) {
    //         // 报错:java.util.ConcurrentModificationException
    //         list.remove(str);
    //     }
    // }

    // 更正
    Iterator iterator = list.iterator();
    while (iterator.hasNext()) {
        String item = iterator.next();
        if ("222".equals(item)) {
            iterator.remove();
        }
    }
    System.out.println(list);
}

3.4 自定义移除元素

重写 equals(..) 方法

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Parent {
    private String name;
    private Integer age;
    private String job;

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (obj instanceof Parent) {
            Parent parent = (Parent) obj;
            // 自定义逻辑
            return this.name.equals(parent.name) && this.age.equals(parent.age);
        }
        return false;
    }
}
@Test
public void customRemove() {
    List list = Lists.newArrayList(new Parent("aaa", 15, "Java"),
            new Parent("bbb", 20, "C"));
    Parent parent = new Parent("bbb", 20, "C++");
    list.add(parent);

    // 会调用equals(..)
    // Removes the first occurrence of the specified element from this list
    list.remove(parent);

    // Removes from this list all of its elements
    list.removeAll(Arrays.asList(parent));
}

【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容