Java篇(七)

目录

1.集合类

1)队列LinkedList

2)数组列表ArrayList

3)散列集HashSet

4)树集TreeSet

5)优先队列PriorityQueue

2.映射

3.视图

4.算法


1.集合类

1)队列LinkedList

LinkedList<>便于插入和删除,但是查找效率低

    @Test
    void queueOperation(){
        var queue=new LinkedList<>();
        queue.add(3);//增加,对于有限制的队列,队满时unchecked异常
        queue.offer(4);//增加,对于有限制的队列,队满时返回false
        queue.addFirst(11);//加至队头
        queue.remove();//出队并查看,空时抛出异常
        queue.poll();//出队并查看,空时返回null
        queue.removeLast();//删除队尾元素
        queue.element();//查看,空时抛出异常
        queue.peek();//查看,空时返回null
        queue.getLast();//查看队尾元素
        
    }

迭代器

通常在队的两头操作,如果要在队中操作,使用迭代器

    var it=queue.iterator(); //创建迭代器
        if(it.hasNext()){ //判断
            Integer f= it.next(); //指向第一个
            logger.info(f.toString());
        }
        it.next(); //指向下一个
        it.remove(); //删除当前指向的元素 
        for(int x: queue){ 可使用for each 遍历
            System.out.println(x);
        }

ListIterator

iterator()只能删除,不能在中间插入,通常只需要用add或offer在队尾插入,若要实现队中插入,可以使用listIterator()

        //可在中间插入元素的迭代器
        var listIt=queue.listIterator(1);//默认值为0
        listIt.add(33);//在下标1处插入33,光标自动加1
        listIt.next();
        listIt.add(44);
        System.out.println(queue.get(3));//44 . 查找效率极低
        System.out.println(queue.contains(33));//true

        listIt.next();
        listIt.remove();//删除5

        listIt.previous(); //光标前移
        listIt.set(66); //44改为66
        System.out.println(listIt.nextIndex());//后一元素的序号,3
        System.out.println(listIt.previousIndex());//前一元素的序号,2

        print(queue);

如果光标的起始位置在第一个元素前,从0开始数,使用remove删除的是光标前的元素;set修改的是光标后的元素;add添加在光标处,添加后移动至新增元素后,所以可连续使用add,但是remove不可以。

2)数组列表ArrayList

可动态分配数组,有缓存,所以便于查找指定位置的元素。

Vector类可以保证同步,但通常只有一个线程访问,ArrayList就够了。

3)散列集HashSet

一个无序集合。可以指定初始容量和填装因子,默认值为0.75,超过这个长度容量自动扩展为2倍。

4)树集TreeSet

一个有序集合。插入的比较次数不会超过树高。可以有序输出,可自定义排序方式

5)优先队列PriorityQueue

便于删除最小元素,常用于优先级队列

2.映射

有HashMap和TreeMap

如果不需要有序访问,HashMap更快。

    void MapTest(){
        var map=new HashMap<Integer,String>();
        map.put(1,"Ben");
        map.put(2,"Peter");
        map.put(3,"Alice");
        map.remove(2);
        logger.info(map.get(1));
        logger.info(map.getOrDefault(2,"null"));
        logger.info(String.valueOf(map.containsKey(3)));
        var map2 = new HashMap<Integer, String>(map);
        map2.forEach((k,v)->{
            System.out.println("k="+k+",v="+v);
                }
        );
        var keys=map.keySet();
        System.out.println(keys);
        var values=map.values();
        System.out.println(values);
    }

需要记住插入顺序,就用LinkedHashMap

3.视图

如果只作为临时变量且不需要修改,可以使用试图,减少开销。

    void view(){
        List<Integer> list=List.of(1,2,3,4);
        Set<Integer> set=Set.of(5,6);
        Map<Integer,String> map=Map.of(1,"a",2,"b");
        System.out.println(list.get(0));
        System.out.println(set.contains(5));
        System.out.println(map.get(1));

    }

4.算法

不需要为不同的集合类型设计不同的算法,要善于使用泛型,其中使用迭代器代替get和set。

善于使用Java类库的函数,设计时尽可能使用接口,使用泛型类代替具体类,使用父类代替子类,如Collection<Item>.

根据类中的成员排序

staff.sort(Comparator.comparingDouble(Employee::getSalary));

倒序排列

staff.sort(Comparator.reverseOrder());

根据成员倒序

staff.sort(Comparator.comparingDouble(Employee::salary).reversed());

集合常用方法

        Collections.shuffle(numbers);//打乱顺序
        Collections.binarySearch(list,3);//二分查找
        Collections.max(list);//最大值
        Collections.fill(list,2);//用2填充
        Collections.replaceAll(list,2,4);//所有2换为4

批操作

A\cap B

list1.retainAll(list2);

A\cap \overline{B}

list1.removeAll(list2);

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值