java基础回顾--3、集合

一、集合概览

二、基础信息

双向链表:每个结点还存放着指向前驱结点的引用

散列表:在Java中,散列表(hash table)用链表数组实现。每个列表被称为桶,要想查找表中对象的位置,就要先计算它的散列码(hash code),然后与桶的总数取余,所得到的结果就是保存这个元素的桶的索引。

1、ArrayList

     非线程安全,通过数组实现

     查询数据快(原因:直接用数组下标获得)

     插入及删除数据慢(原因:插入或删除数据时,插入或删除点后的数组会整体移动)

2、LinkedList

      非线程安全,通过双向链表实现

      查询数据慢(原因:二分法逐渐查找)

      插入及删除数据快(原因:插入或删除数据时,通过节点插入)

3、Vector

     线程安全,通过数组实现,与ArrayList类似

4、CopyOnWriteArrayList

      线程安全,没太用过,不做描述

 

5、HashSet

     基于散列表实现,查询速度快

6、TreeSet

      基于红黑树实现,自动对元素排序(自然排序与定制排序)

7、LinkedHashSet

      基于散列表实现,保持元素插入的顺序

 

8、HashMap

      基于散列表实现,查询速度快

9、TreeMap

      基于红黑树的实现 自动对键值对排序(自然排序与定制排序)

10、LinkedHashMap

        基于散列表及链表实现,保持元素插入的顺序

11、ConcurrentHashMap

       基于散列表实现,线程安全

 

三、遍历

迭代器遍历 List / Set

        Iterator<String> iterator = collection.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

迭代器遍历 Map:

        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " = " + entry.getValue());
        }

四、排序

1、List 中对象排序--方案1(对象实现 Comparable 接口,list 中有 null 时会异常)

public class DogPet extends Pet implements Comparable<DogPet>{

    public DogPet(String kind, Double price) {
        super(kind, price);
    }

    @Override
    public int compareTo(DogPet o) {
        if (this == o) {
            return 0;
        }
        if (Objects.isNull(this.getPrice())) {
            return -1;
        }
        if (Objects.isNull(o.getPrice())) {
            return 1;
        }
        if (Objects.equals(this.getPrice(), o.getPrice())) {
            return 0;
        }
        return this.getPrice() > o.getPrice() ? 1 : -1;
    }
}
    /**
     * 对象排序--list中的对象 实现Comparable接口
     *
     * <p>list不能有null,否则排序报错
     */
    @Test
    public void sort1() {
        List<DogPet> dogPetList = new ArrayList<>();
        dogPetList.add(new DogPet("金毛", 180.0));
        dogPetList.add(new DogPet("松狮", 2.0));
        dogPetList.add(new DogPet("柯基", null));
        dogPetList.add(new DogPet("藏獒", 10000.0));
        System.out.println("排序前:" + dogPetList);

        Collections.sort(dogPetList);

        System.out.println("排序后:" + dogPetList);
    }

2、List 中对象排序--方案2( lambda 表示,实时 new 匿名内部类 Comparator

    /**
     * 对象排序--list.sort--可用
     *
     * <p>list中可以有null
     */
    @Test
    public void sort2() {
        System.out.println("排序前:" + catPetList);

        catPetList.sort((o1, o2) -> {
            if (o1 == o2) {
                return 0;
            }
            if (Objects.isNull(o1) || Objects.isNull(o1.getPrice())) {
                return -1;
            }
            if (Objects.isNull(o2) || Objects.isNull(o2.getPrice())) {
                return 1;
            }
            if (Objects.equals(o1.getPrice(), o2.getPrice())) {
                return 0;
            }
            return o1.getPrice() > o2.getPrice() ? 1 : -1;
        });

        System.out.println("排序后:" + catPetList);
    }

3、List 中对象排序--方案3 (对象中增加静态内部类实现 Comparator 接口 )

public class CatPet extends Pet {


    public CatPet(String kind, Double price) {
        super(kind, price);
    }

    /**
     * 价格比较规则
     *
     * @author tony
     */
    static class PriceComparator implements Comparator<CatPet> {

        @Override
        public int compare(CatPet o1, CatPet o2) {
            if (o1 == o2) {
                return 0;
            }
            if (Objects.isNull(o1) || Objects.isNull(o1.getPrice())) {
                return -1;
            }
            if (Objects.isNull(o2) || Objects.isNull(o2.getPrice())) {
                return 1;
            }
            if (Objects.equals(o1.getPrice(), o2.getPrice())) {
                return 0;
            }
            return o1.getPrice() > o2.getPrice() ? 1 : -1;
        }
    }
}
    /**
     * 对象排序--list.sort--可用
     *
     * <p>提取出专用的comparator
     */
    @Test
    public void sort3() {
        System.out.println("排序前:" + catPetList);

        catPetList.sort(new CatPet.PriceComparator());

        System.out.println("排序后:" + catPetList);
    }

五 、删除对象

1、List 删除匹配的对象--方案1( jdk1.8才可用):

list.removeIf("龙母"::equals);

2、List 删除匹配的对象--方案2

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            if ("龙母".equals(iterator.next())) {
                iterator.remove();
            }
        }

六、疑问点

1、ArrayList LinkedList能否互相转换?

      能 必须用构造方法

      LinkedList<People> linkedList = new LinkedList<>();

      ArrayList<People> peopleList = new ArrayList<>(linkedList);

       ArrayListLinkedList 较慢

       LinkedListArrayList 挺快

2、既需要获取 又需要频繁删除呢?

如果是一个集合,需要遍历整个集合删除符合条件的对象,建议直接使用 iterator 或 removeIf方法

直接用 ArrayList 就可以了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值