Java_Collection集合与Map集合的理解与应用

Java Collection集合的简单介绍与运用 1 集合概述 集合:集合是java中提供的一种容器,可以用来存储多个数据。 集合与数组的区别: 数组的长度是固定的。集合的长度是可变的。 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。 2 集合框架 集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map,这里主要记录一下Collection集合。 Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.Lis 立即下载

集合

概述:可以存储多个数据的容器

  • 集合和数组的区别:

    • 相同点:都可以存储多个数组

    • 不同点:

      • 数组中可以存多个数据,但是不能自由的实现数据的新增和删除操作

        集合中除了可以存储多个数据,还可以自由的实现数据的新增和删除操作

      • 数组中及可以存储基本类型的数据有可以存储引用类型数据

        集合中只能存储引用类型数据

      • 数组本身自带的功能较少,集合中自带的功能比较多

集合的体系

在这里插入图片描述

Collection集合

概述:此类是单列集合的顶层接口,任何单列集合都属于该接口的子接口或者实现类。

  • 特点
    • 是一个接口不能去创建对象。只能通过实现类创建对象访问其中的方法。
    • 在java.util包,需要导包使用
    • Collection中定义的方法,子接口和实现类都可以去使用。

Collection集合中常用的方法

  • **add(E e) :**往集合中添加元素
  • **addAll(Collection<? extends E> c) :**将集合c中的内容全添加到调用者集合中
  • **remove(Object o) :**删除集合中的o元素
  • **removeAll(Collection<?> c) :**删除调用者集合中和c集合中相同的元素
  • **clear() :**清空集合
  • **contains(Object o) :**判断集合中是否包含元素o
  • **containsAll(Collection<?> c) :**判断调用者集合中是否全部包含集合c的所有元素
  • **isEmpty() :**判断集合是否为空
  • **size() :**返回集合中元素的个数
 //创建Collection的实现类list,用接口接收
        Collection c = new ArrayList();
        //添加add
        c.add("chen");
        c.add("shuang");
        System.out.println(c);
        Collection c1 = new ArrayList();
        c1.add("1999");
        c1.add("0328");
        c1.add(4);
        //add All
        c.addAll(c1);
        System.out.println(c);

        //删除集合中的元素
        c.remove("chen");
        //删除集合c中和集合c1中相同的元素
        c.removeAll(c1);
        System.out.println(c);

        //判断集合中包含某一个元素
        System.out.println("------------");
        System.out.println(c.contains(4));
        System.out.println(c.containsAll(c1));
        //将集合中元素全部删除
        c.clear();
        //判断集合是否为空
        System.out.println(c.isEmpty());
        //判断集合元素个数
        System.out.println(c.size());

Collection集合的遍历方式

Collection集合的第一种遍历方式
  • **转数组遍历:**将集合中的数据转到一个数组中,再遍历数组,等于是间接的遍历集合。

  • **集合转为数组的方法:**toArray()

 		Collection c =new ArrayList();
        c.add(new Person("陈一",11));
        c.add(new Person("陈二",13));
        c.add(new Person("陈三",12));
//遍历方法一:
        //先把集合转成数组,用Object超类接收
        Object[] o = c.toArray();
        //遍历Object数组
        for (int i = 0; i < c.size(); i++) {
            //强制转型为Person类型
            Person p = (Person)o[i];
            System.out.println(p.getName());
        }
//陈一
//陈二
//陈三
Collection集合的第二种遍历方式
  • 使用迭代器遍历集合

    迭代:更新换代,一个到下一个

    迭代器:用来获取集合中每一个元素的对象

  • **获取迭代器的方式:**通过集合定义的方法来获取:iterator()

  • 迭代器对象可以使用的方法:

    • next();

    • hasNext();

  • 注意事项:

    • 虽然每次使用的方法都是next,但是获取的值是不同的
    • next方法不仅可以获取下一个元素,而且获取之后,可以将指针指向下一个元素
    • hasnext方法只可以判断是否有下一个元素,不能移动指针
    • 如果集合中没有下一个元素了,仍然获取,会出现一个异常: NoSuchElementException
 		Collection c =new ArrayList();
        c.add(new Person("陈一",11));
        c.add(new Person("陈二",13));
        c.add(new Person("陈三",12));

//先获取一个迭代器对象
        Iterator i = c.iterator();
        //使用hasNext()方法判断是否有下一个元素,如果有返回true否则false
        while (i.hasNext()){
            //如果有下一个元素,就用next()来获取该元素
            System.out.println(i.next());
        }
//Person{name='陈一', age=11}
//Person{name='陈二', age=13}
//Person{name='陈三', age=12}

        //强转--
        Iterator i1 = c.iterator();
        while (i1.hasNext()){
            //注意:(Person)i1.next()
            Person pp = (Person)i1.next();
            System.out.println(pp.getName()+"是:"+pp.getAge());
        }
//陈一是:11
//陈二是:13
//陈三是:12
Collection集合的第三种遍历方式
  • 使用增强for循环遍历

  • 增强for循环:

    ​ 它是JDK5之后出现的,其内部原理Iterator迭代器相同

格式:

 for(元素的数据类型 元素名称:集合或者数组名称){
     元素名称的使用
 }

 //for(超类 公共名称:集合名称)
        for (Object o1:c){
            System.out.println(o1);
        }

代码:

 		Collection c =new ArrayList();
        c.add(new Person("陈一",11));
        c.add(new Person("陈二",13));
        c.add(new Person("陈三",12));

        //for(超类 公共名称:集合名称)
        for (Object o1:c){
            System.out.println(o1);
        }
//Person{name='陈一', age=11}
//Person{name='陈二', age=13}
//Person{name='陈三', age=12}

        //强转--遍历单个元素值
        for (Object o2 : c) {
            Person p1 = (Person)o2;
            System.out.println((p1.getName())+"是"+(p1.getAge()));
        }
//陈一是11
//陈二是13
//陈三是12

List集合

List集合是Collection接口下的子接口

  • 特点:
    • 属于一个单列集合
    • 不能直接创建对象,可以通过实现类创建对象
    • 该集合中的元素特点:
      • 有序:元素存入的和取出的顺序可以保证一致
      • 有索引:每个元素都有自己的一个位置,通过有序的序号来表示这个位置,索引
      • 可重复:集合中可以存储相同的元素值
List集合中特殊的方法
  • **add(int index, E element) :**往集合中的指定位置添加元素
  • **get(int index) :**获取集合中指定元素的值
  • **remove(int index) :**删除指定位置的元素
  • **set(int index, E element) :**修改集合中指定位置的元素值为element

代码:

在这里插入图片描述

并发修改异常解决

ConcurrentModificationException

出现该异常的原因:

  • 一边使用迭代器对象遍历集合,一边使用集合对象增加或者删除元素
ConcurrentModificationException异常
            Iterator i =list.iterator();   
            while (i.hasNext()){          //使用迭代器遍历集合 
                Object o = i.next();
                if (o.equals("chen")){
                    list.add("AAA");      //集合对象增加元素
                }
            }
        System.out.println(list);

解决方案:【统一】

  • 一边使用集合对象遍历,一边使用集合对象增加或者删除
  • 一边使用迭代器遍历,一边使用迭代器增加或删除

第一种方式:

  • 使用集合遍历:list.size方法和List.get方法

  • 使用集合增加:list.add

 //解决办法一:使用集合遍历
        for (int i = 0; i < list.size()-1; i++) {
            Object o = list.get(i);
            System.out.print(o+" ");
        }

第二种方式:

  • **迭代器遍历:**hasnext next
  • 迭代器增加:
    • 使用父类中获取迭代器对象的方式,没有增加元素的方法,所以要使用List集合特有的获取方式:listIterator()
    • 通过这个特有的方式获取的迭代器对象,不仅可以遍历集合,而且有add方法来增加元素。
ListIterator lis =list.listIterator();
        while (lis.hasNext()){
            Object o = lis.next();
            if (o.equals("chen")){
                lis.add("AAA");
            }
        }

List的实现类

概述:List集合也是一个接口,根据底层存储数据方式的不同有不同的实现类

分类:

  • ArrayList
  • LinkedList
ArrayList

List集合的实现类,本类没有特殊的方法,只能使用接口中定义的方法

特点:

  • 底层数组实现,可以表示元素有序
  • 查询元素的效率高,增删元素的效率低
  • 特点:元素有序,元素有索引,元素可以重复

总结:

  • 使用空参构造创建一个ArrayList集合对象,其实底层维护了一个空Object数组
  • 当第一次向集合中添加元素,底层先将数组扩容,从0扩容10
  • 当10个元素存储之后,继续存储其他元素,底层继续对数组进行扩容,扩容原来的1.5倍,依次类推。
LinkedList

属于List接口的实现类,可以使用接口中继承方法

  • 底层通过双向链表实现,可以保证元素有序

  • 查询元素效率低,增删元素效率高

  • 使用构造方法创建一个LinkedList对象,底层什么也没有维护(数据是保存在Node对象中,如果没有数据,就不需要创建Node对象)

    如果使用该集合对象增加一个元素,那么底层就会新建一个Node对象(节点)来保存该元素的值,以及上一个元素和下一个元素的地址值,如果继续新增元素,那么该新增的元素就是最后一个元素,将上一个元素的last地址改为新元素的地址,也会将新元素的上一个元素地址进行保存

特有方法:【因为linkedList可以记录头部和尾部元素的地址,所以有一些操作头部和尾部元素的方法:】

  • addFirst(); 在头部位置添加元素
  • addLast(); 在尾部添加元素
  • removeFirst(); 删除头部位置的元素
  • removeLast(); 删除尾部的元素
  • getFirst(); 获取头部元素
  • getLast(); 获取尾部元素

总结

  • 数组和集合的区别

  • Colllection特点

    方法

  • Collection遍历方式:

    转数组:toArray

    迭代器:iterator

    增强for循环

  • List集合特点

  • 元素有序 有索引 可以存储重复值

  • add(index ,e) get(index) remove(index) set(index,e)

    特有的遍历方式: size() get(index)

  • 异常:并发修改异常

    使用同一个对象遍历集合,增删元素

  • ArrayList:

    底层数组实现,查询快,增删慢

  • LinkedList:

    底层双向链表实现,查询慢,增删快

    有特殊的方法

  • 数组和集合的区别

  • Colllection特点

    方法

  • Collection遍历方式:

    转数组:toArray

    迭代器:iterator

    增强for循环

  • List集合特点

  • 元素有序 有索引 可以存储重复值

  • add(index ,e) get(index) remove(index) set(index,e)

    特有的遍历方式: size() get(index)

  • 异常:并发修改异常

    使用同一个对象遍历集合,增删元素

  • ArrayList:

    底层数组实现,查询快,增删慢

  • LinkedList:

    底层双向链表实现,查询慢,增删快

    有特殊的方法

    Set集合

概述:该集合是一个单列集合,是Collection集合的子接口。

特点:

  • 在java.util包中

  • 该类元素特点:

    ​ 不可重复:集合中不可以存储相同的元素(去重)

     **没有索引:集合中没有一些操作元素索引的方法**
    

    ​ 无序:元素存储的顺序和取出的顺序不能保持一致

TreeSet集合

概述:TreeSet集合为Set集合的实现类。

特点:

  • 不可重复:集合不可以存放重复的元素(去重)

  • 无序:元素存入和取出的顺序不一致

  • 无索引:元素没有索引来对应

  • 该集合底层使用二叉树来存储

    虽然该集合是无序存入和取出,但是该集合可以对元素进行排序

在这里插入图片描述

存储元素排序方式:

  • 如果集合中存储的是整数、小数则按照数据的大小,从小到达排序

  • 如果集合中存储的是字符、则按照字符转码后的整数从小到达排序

  • 如果是非中文字符串类型,则按照字符串中字符转码后的整数从小到达排序

  • 如果是中文字符串则按照中文字符解码后的数字大小,从小到大排列

  • 如果是自定义的类型对象,不能直接使用TreeSet集合存储

    ​ 解决方案:实现Comparable接口,并重写接口中的compareTo方法

compareTo方法排序原理:

  • Comparable接口: 是一个比较接口

  • 需要重写该接口的方法: public int compareTo(Object o)

  • 方法的比较规则:

    Comparable接口: 是一个比较接口

(2)需要重写该接口的方法: public int compareTo(Object o)

(3)方法的比较规则:

返回值为0 默认添加的元素重复,就实现去重

返回值为正 默认添加的元素大,将元素存储在右子树(后取)

返回值为负 默认添加的元素小,将元素存储在左子树(先取)

//person类实现比较接口并重写compareTo方法
public class Person implements Comparable<Person> {
     @Override
    public int compareTo(Person o) {
//        当前的减去上一次的返回值大,放右边,后取出,所以是从大到小排序
//        return this.age-o.age;
        //年龄比
        int a= this.age-o.age;
        //姓名比
        int b = this.name.compareTo(o.name);
        return a!=0 ? a:b;
    }
}

//以上类重写后的方法可以决定测试类中TreeSet集合输出的排序顺序
public class Person_complication {
    public static void main(String[] args) {
        TreeSet<Person> p = new TreeSet<>();
        p.add(new Person("张三",18));
        p.add(new Person("李四",15));
        p.add(new Person("王五",20));
        p.add(new Person("赵六",14));
        p.add(new Person("陈八",16));
        p.add(new Person("王五",16));
        p.add(new Person("周七",22));

        System.out.println(p);
         }
}

Comparator比较器使用

案例:

使用TreeSet集合存储多个学生信息,
先按照学生的总成绩升序排列
如果总成绩相同,则按照语文成绩升序排列
如果语文成绩也相同,则按照名字的自然排序升序排列

学生类:
属性:姓名 语文成绩 数学成绩
public class Student {
    private String name;
    private int chinese;
    private int math;
    private int sum=chinese+math;
    public Student() {
    }
    public Student(String name, int chinese, int math) {
        this.name = name;
        this.chinese = chinese;
        this.math = math;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getChinese() {
        return chinese;
    }
    public void setChinese(int chinese) {
        this.chinese = chinese;
    }
    public int getMath() {
        return math;
    }
    public void setMath(int math) {
        this.math = math;
    }
    public int getSum() {
        return sum;
    }
    public void setSum(int sum) {
        this.sum = sum;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", chinese=" + chinese +
                ", math=" + math +
                ", sum=" + sum +
                '}';
    }
}

//测试类
public class Student_Test {
    public static void main(String[] args) {
        //使用Comparator比较器,new一个匿名内部类
        Comparator c = new Comparator<Student>(){
            @Override
            public int compare(Student o1, Student o2) {
                int sum = o1.getSum() - o2.getSum();//此值大于零时,按成绩升序
                int chinese = o1.getChinese() - o2.getChinese();
                int name = o1.getName().compareTo(o2.getName());
                return sum == 0 ? (chinese == 0 ? name : chinese) : sum;
            }
        };
        //往集合中录入数据
        TreeSet<Student> s = new TreeSet<>(c);
        s.add(new Student("张三",50,70));
        s.add(new Student("李四",60,90));
        s.add(new Student("王五",30,95));
        s.add(new Student("赵六",40,40));
        s.add(new Student("周七",80,20));
        System.out.println(s);
    }
}

HashSet集合

概念:属于set集合的实现类

特点:

  • 无序,没有索引,不可重复
  • 该集合没有特殊的方法,可以使用单列接口中定义的方法
  • 该集合存储元素的方式,底层是根据哈希表来进行存储的

哈希值简介

是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值

  • 如何获取哈希值

    Object类中的public int hashCode():返回对象的哈希码值

  • 哈希值的特点

    • 同一个对象多次调用hashCode()方法返回的哈希值是相同的
    • 默认情况下,不同对象的哈希值不同
  • 总结

    • 两个对象的哈希值不同,肯定是不同的对象
    • 如果两个对象的哈希值一样,可能不是同一个对象

哈希表图示

哈希表:底层就是使用 数组 + 链表 结合产生的。

JDK1.7版本哈希表的图示

  • 使用数组和链表组成

在这里插入图片描述

JDK1.8之后对哈希表的优化

优化的原因:因为如果链表的长度过长,该链表中的数据在查询时,查询的效率低,所以当链表长度>=8时,会将该链表转为红黑树(特殊的二叉树)来存储,转换之后,链表的长度就会缩短,提高查询效率。

在这里插入图片描述

HashSet集合保证元素唯一性原理

在这里插入图片描述

在这里插入图片描述

LinkedHashSet集合

概述:是一个单列集合,是HashSet集合的子类

特点:

  • 没有特殊的方法,可以使用父类中继承的方法

  • 元素特点:

    • 无索引

    • 不可重复:和父类去重的原理一样

    • 有序:可以保证元素存入的和取出的顺序

      ​ 有序的原理和链表原理相同

单列集合总结

  • Collection接口:

    • 单列集合的顶层接口
    • 方法需要重写
    • 三种遍历方式
  • List:Collection集合的子接口

    • 特点:有序 有索引 可重复
    • 特有方法:通过索引操作元素的方法
    • 特有的遍历方式:size get
    • 并发修改异常:解决:使用同一个对象操作集合
  • ArrayList:

    • 底层使用数组实现,查询快,增删慢
  • LinkedList:

    • 底层使用双向链表实现,查询慢,增删快
    • 特有方法,操作头部和尾部元素方法
  • Set:Collection接口的子接口

    • 特点:无序 无索引 去重
    • 三种遍历方式
  • TreeSet:

    • 底层使用二叉树实现
    • 去重原理和无序原理:
      • 通过比较器对象Compator对象的compare
      • Comparable接口的compareTo方法
    • 可以对元素进行排序
  • HashSet集合:

    • 底层使用哈希表实现

    • 去重原理:通过比较元素的哈希值和equals结果来去重

      ​ 比较之后,两个结果都相同去重,有一个不同就存入

  • LinkedHashSet集合:

    • HashSet集合的子类:哈希表实现
    • 特点:有序 无索引 去重

Map集合

概念:现实生活中,我们常会看到这样的一种关系:IP地址与主机名,身份证号与个人,用户名与密码,等等。

这种一一对应的关系,就叫做映射。
Java提供了专门的集合类用来存放这种对象关系的数据,存储映射关系的集合就是双列集合。

Map集合中常用的方法

  • put(K key, V value) :往集合中添加元素 每个元素是由键值对组成

    如果key值是第一次出现,就是添加

    如果key值第二次出现,就是替换

//添加键值对
map.put(1, "陈爽");
map.put(2, "张三");
map.put(3, "李四");
  • remove(Object key) :根据制定的key删除对应的键值对
//根据key删除键值对
map.remove(1);
  • remove(Object key, Object value) :根据键和值删除对应键值对
map.remove(2,"张三");
  • clear() :清空集合
//清楚所有集合
map.clear();
  • containsKey(Object key) :判断集合中是否包含key
//判断集合中是否包含key
map.containsKey(1);
  • containsValue(Object value) :判断集合中是否包含value
//判断集合中是否包含Value
map.containsValue("chenshuang");
  • get(Object key) :根据key值获取对应的value值
//根据key值获取value
map.get(2);
  • isEmpty() :判断集合是否为空
//判断集合是否为空
System.out.println(map.isEmpty());
  • replace(K key, V value) :替换key对应的value值
//修改键值对
map.replace(3, "19990328");
  • ** size()**:获取集合中键值对的对数
//返回集合中键值对的对数
System.out.println(map.size());

Map集合的遍历

遍历一:通过key获取Value

1、概述:

先将Map集合中的key单独获取到一个单列集合中,然后遍历该单列集合获取每一个key,再通过key依次获取每一个对应的value。

  • 如何获取每一个key:keySet()

  • 遍历set集合:

    三种方式

  • 遍历set集合获取每一个key,再使用get方法获取key对应的value

图示:
在这里插入图片描述

代码:

HashMap<String,Integer> map = new HashMap<>();
        map.put("aaa",23);
        map.put("sss",318);
        map.put("ccc",999);

//遍历方式一:通过获取key来遍历
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext()){
    //获取每一个key
    String key = it.next();
    //输出key和对应的value值
    System.out.print(key+ map.get(key)+"\t");
}
//aaa23	sss318	ccc999	
遍历二:通过键值对对象来获取key和value

1、思路:

先将Map集合中的每一个键值对数据封装为一个个键值对对象,然后将每一个对象保 存在set中,遍历set集合,获取每一个键值对对象,通过方法获取该对象中的key和 value

  • 获取键值对对象到set中的方法:entrySet()
    • 集合set中保存的是:一个个键值对对象 ,该键值对对象所属的类型是Entry接口
    • Entry接口是,Map集合中内部接口
    • 该接口中由两个方法:
      getKey获取key
      ​getValue获取value

思路:

  • 获取set集合之后,遍历set获取每一个键值对

    三种遍历方式

  • 遍历set集合之后,可以得到每一个键值对,如何获取对应的key、value

    getKey获取key

    getValue获取value

图示:
在这里插入图片描述

代码:

	HashMap<String,Integer> map = new HashMap<>();
			map.put("aaa",23);
			map.put("sss",318);
			map.put("ccc",999);
 
//遍历方式二:通过对key和value的对象封装来遍历
        Set<Map.Entry<String,Integer>> s= map.entrySet();
        for(Map.Entry<String,Integer> o :s){
            String key = o.getKey();
            System.out.print(key+map.get(key)+"\t");
        }
        
        for (Map.Entry<String,Integer> o : map.entrySet()){
            String key =o.getKey();
            System.out.print(key+map.get(key)+"\t");
        }
//aaa23	sss318	ccc999	
//aaa23	sss318	ccc999	

Map集合实现类

概述:Map集合为双列集合的顶层接口,底层根据不同的实现方式,有不同的实现类

  • 实现类:
    • TreeMap
    • HashMap

TreeMap集合

概述:是一个双列集合,是Map集合的实现类

特点:

  • 集合中的key值是唯一的,元素是无序的

    TreeMap集合key值 去重和排序原理 与TreeSet都是一样的

    底层都是二叉树来实现的

  • TreeSet集合和TreeMap集合的关系:

    TreeSet集合的底层就是使用TreeMap集合实现的

HashMap集合

概述:是一个双列集合,属于map集合的实现类。

特点:

  • 集合中的key值是唯一的,元素是无序的
  • HashMap集合去重原理和无序原理和HashSet集合原理一致
  • 通过比较key的哈希值和equals的结果来实现去重
  • HashSet集合底层就是使用HashMap来实现的

LinkedHashMap集合

概述:是一个双列集合,是HashMap集合的子类

特点:

  • 本类没有特殊的方法,只能使用父类中继承的
  • 集合中元素有序
  • 集合中的key值唯一

【笔试题】HashMap集合和HashTable集合的区别

相同点:

  • 两个集合都是Map接口的实现类,都属于双列集合
  • 两个集合底层是使用哈希表来存储数据
  • 两个集合中的方法大致相同

不同点:

  • 版本不同:HashMap是jdk1.2出现的,HashTable是jdk1.0出现
  • 线程安全性不同:HashMap是线程不安全的,HashTable线程安全的
  • 存储的值不同:HashMap可以存储null键null值,HashTable不可以存储null

Collections工具类

本类是JDK提供的操作集合的工具类,类中定义了一些操作集合元素的方法

常用方法

  • binarySearch(List<? extends Comparable<? super T>> list, T key) :

    通过二分查找法查找元素key在集合中的索引

    前提数组或者集合一定是升序排列

  ArrayList<Integer> in = new ArrayList<>();
  in.add(2);
  in.add(3);
  in.add(4);
  in.add(5);
  int indexx = Collections.binarySearch(in,2);
  System.out.println(indexx);
  //0
//创建学生对象实现Combareble接口,然后重写了其compareTo方法
public class Student implements Comparable<Student>{
    String name;
     int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public int compareTo(Student o) {
        return 0;
    }
}

//测试类
public class Student_test {
    public static void main(String[] args) {
        ArrayList<Student> st = new ArrayList<>();
        st.add(new Student("chen",25));
        st.add(new Student("shuang",24));
        st.add(new Student("ccccc",20));

        System.out.println(indexx);
        int index = Collections.binarySearch(st,new Student("shuang",24));
        System.out.println(index);

    }
}
//1
  • frequency(Collection<?> c, Object o) :

    获取集合中o元素出现的次数

public static void main(String[] args) {
		ArrayList<Integer> in = new ArrayList<>();
		in.add(2);
		in.add(2);
        in.add(3);
        in.add(4);
        in.add(5);
        int count1 = Collections.frequency(in,2);
        System.out.println(count1);
}
//2
//创建学生对象
public class Student {
    String name;
     int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
}
//测试类
public class Student_test {
    public static void main(String[] args) {
        ArrayList<Student> st = new ArrayList<>();
        st.add(new Student("chen",25));
        st.add(new Student("shuang",24));
        st.add(new Student("shuang",24));
        st.add(new Student("ccccc",20));

        int count = Collections.frequency(st,new Student("shuang",24));
        System.out.println(count);
    }
}
//2
  • max(Collection c) : 求出集合中的最大值
//求出集合中最大值              max()
System.out.println(Collections.max(in));
  • min(Collection c) : 求出集合中的最小值
//求出集合中最小值              min()
System.out.println(Collections.min(in));
  • reverse(List<?> list) : 反转集合中的元素顺序
ArrayList<Integer> in = new ArrayList<>();
        in.add(2);
        in.add(2);
        in.add(3);
        in.add(4);
        in.add(5);
//反转集合中的元素
Collections.reverse(in);
System.out.println(in);
//[5, 4, 3, 2, 2]
  • shuffle(List<?> list) : 随机排列集合元素的顺序
//随机排列集合中的元素
Collections.shuffle(in);
System.out.println(in);
//[3, 5, 2, 4, 2]
  • sort(List list) : 将集合中的元素进行升序排列
ArrayList<Integer> in = new ArrayList<>();
        in.add(6);
        in.add(4);
        in.add(1);
        in.add(4);
        in.add(8);
//将集合中的元素升序排列
Collections.sort(in);
System.out.println(in);
//[1, 4, 4, 6, 8]
  • swap(List<?> list, int i, int j) : 交换集合中两个元素的位置
ArrayList<Integer> in = new ArrayList<>();
in.add(6);
in.add(4);
//交换集合中两个元素的位置
Collections.swap(in,0,1);
System.out.println(in);
//[4, 6]

realsense D455深度相机+YOLO V5结合实现目标检测(一) realsense D455深度相机+YOLO V5结合实现目标检测代码来源环境配置代码分析:1.如何用realsense在python下面调用的问题:2.对main_debug.py文件的分析:结束语 可以实现将D435,D455深度相机和yolo v5结合到一起,在识别物体的同时,还能测到物体相对与相机的距离。 说明一下为什么需要做这个事情?1.首先为什么需要用到realsense D455深度相机? 因为他是普通的相机还加了一个红外测距的东西,所以其他二维图像一样,能够得到三维世界在二维像素平面的投影 阅读详情

相关推荐

自动驾驶入门到进阶完整指南:感知、预测、规划、端到端、仿真测评与场景挖掘全解析

对小白来说,不建议一开始直接冲端到端大模型。先学数据和坐标系:否则所有结果都看不懂。再学 LiDAR 3D 检测:最容易建立空间感。再学 BEV/多相机感知:这是当前主流。再学轨迹预测:理解交互和多模态。再学规划控制:理解车为什么这样开。再学仿真和闭环评测:理解 open-loop 和 closed-loop 差异。最后学端到端/VLM/VLA:这时候你才知道它到底替代了哪些模块。贯穿始终学习场景挖掘和安全测评:这是工业界最核心的能力之一。

u013250861的博客 393

java核心知识之集合详解五(Map集合和Collections工具类)

Map集合 HashMap HashTable HashMap和HashTable的区别 LinkedHashMap 实现类 Properties读写属性文件 SortedMap 接口和 TreeMap 实现类 WeakHashMap 实现类 IdentityHashMap 实现类 EnumMap 实现类 各种Map集合类的性能分析

m0_46198325的博客 1089

SLAM工程师面试避坑指南:2025年最新高频考点与实战代码解析

本文为SLAM工程师提供2025年最新面试避坑指南,涵盖高频技术考点如VINS初始化、三维几何处理、多传感器融合架构设计等,并包含实战代码解析。特别针对算法工程师面试中的常见陷阱,提供系统设计框架和代码模板,帮助求职者提升通过率。

metaverse5vr的博客 246

Java集合(二):Map集合与Collections工具类

Java集合(二):Map集合与Collections工具类

席木木的博客 1516

hMailServer安装配置

hMailServer安装配置 使用宝塔面板上的宝塔邮件服务器2.1版本,进行安装hMailServer。 宝塔在安装hMailServer是有做了一些配置,如果是手工安装需要注意一下配置点: 1、\hMailServer\Bin 目录下增加mysql连接文件libmysql.dll,要去下载32位的。 libmysql.dll下载 链接:https://pan.baidu.com/s/1YGJXzjowlJ9n_MiqB4xiqw 提取码:wz90 2、 需要提前安装mysql,并创建hM.

王者的博客 5867

用友YonSuite产品实操手把手教学(图文版)

用友YonSuite

ct341688的博客 8166

面试题集锦-java容器

Java 容器都有哪些? Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示: Collection 和 Collections 有什么区别? Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List、Set 等。 Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法: Collections. sort(list)。 List、Set、Map

yyqhwr的博客 267

【VAE学习笔记】全面通透地理解VAE(Variational Auto Encoder)

完整笔记:http://www.gwylab.com/note-vae.html 李宏毅老师的教程视频:https://www.bilibili.com/video/av15889450/?p=33 —————————————————————————————————   依据李宏毅老师的讲解,我整理了一番VAE的笔记。先简单介绍一下VAE,VAE作为一个生成模型,其基本思路是很容易理解的:把一堆真...

a312863063的博客 14万+

java中Map集合的四种遍历方式

java中Map集合的四种遍历方式 Map接口和Collection接口的集合不同,Map集合是双列的,Collection是单列的.Map集合将键映射到值的对象. 双列的集合遍历起来也是比较麻烦些的,特别是嵌套的map集合,这里说下MAP集合的四种遍历方式,并且以嵌套的hashMap集合为例, 遍历一下。 import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry

kang3allen的博客 6244

顺序功能图基本结构

顺序功能图(Sequential Function Chart,SFC)是一种用于描述工业控制系统中顺序控制流程的图形化编程语言,广泛应用于PLC(可编程逻辑控制器)编程。其核心思想是将复杂的控制流程分解为多个有序的步骤,通过逻辑条件实现步骤间的切换。顺序功能图通过图形化的方式简化了复杂控制逻辑的设计,尤其适用于需要严格顺序控制的工业自动化场景。[初始步] → 转换条件1 → [步1] → 转换条件2 → [步2] → ...[步X] → → [步B] → 转换条件B → → [合并步]

ayingqin1的博客 1225

反光柱定位算法实战05:Cartographer Landmark融合定位——从原理到实战

本文介绍了CartographerLandmark融合定位方案,该方案将反光柱作为Landmark节点直接融入Cartographer后端优化框架,避免了传统双系统切换导致的位姿跳变问题。文章详细阐述了Landmark的核心原理、数据发布格式(包括ID、坐标、权重等关键字段)以及两种工作模式(建图模式和导航模式)。特别指出组合反光柱作为Landmark可提供方向参考,有效解决镜像歧义问题。该方案通过统一优化框架实现稳定定位,尤其适用于缺乏自然特征的环境,但存在ID匹配不稳定等局限性。整体而言,Cartogr

Studying…… 424

Java——Collection(List,Set),Map系列集合的特点

Java集合框架两大接口 (1)Collection:规范单值集合的接口 (2)Map:规范对值集合的接口 Collection (1)它是根接口 (2)它没有直接的实现类,有更具体的子接口 (3)有些集合的元素是可以重复的,有些集合的元素是不能重复的,有些集合的元素是有序的,有些集合的元素是无序的 ...

shiranjiu的博客 400

stata 工具变量法【计量经济系列(七)】

stata 工具变量法【计量经济系列(七)】 1. 内生性 2. 工具变量3. 2SLS (二阶段最小二乘法) 4. 弱工具变量5. 工具变量外生性的过度识别检验 6. 豪斯曼检验6.1 传统豪斯曼 6.2 杜宾-吴-豪斯曼检验(DWH)

侯小啾技术博客 2万+

Java集合详解

Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组。

知足上进,不负野心。 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java集合之Map

Map和Collecton比较 Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。 Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。 Collection中的集合称为单列集合,Map中的集合称为双列集合。 - 需要注意的是, Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。 Map中常用的集合为HashMap集合、LinkedHashMap集合。 HashMap.

Hai-Yang-code的博客 305

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java两种集合框架

** Java集合Collction接口和Map接口 ** 1.Java集合就好比一个容器,它可以储存任何类型的数据。 在Java中,集合类通常存在于Java.util包中。 2.Java集合主要由两大体系构成,分别是: Collection体系 Map体系 其中:Collection体系和Map体系分别是两大体系中的顶层接口。 3.Collection主要有三个子接口,分别为List(列表)、Set(集)、Queue(列队)。 有序可重复:List、Queue 无序不可重复:Set Collection接

Turniper的博客 2万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

31、Java集合概述

集合是一组对象的集合,它封装了对象的存储和操作方式。集合框架提供了一组接口和类,用于存储、访问和操作这些对象集合。这些接口和类定义了不同的数据结构,如列表、集合、映射等,以支持各种类型的数据操作。简单来说,集合是对象的容器,它允许你将多个对象存储在一个单一的数据结构中,并对这些对象进行各种操作,如添加、删除、搜索等。Java集合框架的设计旨在提供一种统一的方式来处理不同类型的集合,从而简化代码的编写和理解。集合类位于java.util包下,都是Collection和Map派生而来的。

2402_87701017的博客 1074

Java集合Collection和Map分析解读

Collection和Map集合框架的分析(包含源码解读)

中二阿泽的日常 353

类集、Collection集合、Map

类集、集合一、类集设置的目的二、Collection接口1.List接口1.1 ArrayList1.2 LinkedList2.Iterator迭代器3.for each(增强for循环)4.Set接口4.1 HashSet 集合4.2 HashSet 存储数据的结构(哈希表)4.3 TreeSet4.4 使用HashSet 区分自定义类的重复元素4.5 总结三、 集合工具类Collections四、Comparator 比较器1. 默认排序规则的定义2. 简述Comparable和Comparator两

weixin_41792829的博客 243

java常用Collection和Map的继承结构图

1、常用Collection继承结构图及说明: 1.1 哈希表/散列表数据结构 一、关于Collection常用方法: ( 新建Collection: Collection co1 = new ArrayList();// 多态 Collection co2 = new LinkedList();// 多态 Collection co3 = new Vector();// 多态 ) 1. boolean add(E e) : ..

qq_35661527的博客 1191

Collection集合类

集合类

CDSN_XU的博客 1690

黑马程序员——集合——Collection、List、set、Map

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 集合 集合:         1.容器—用于存储对象(不可以存储基本类型,要用包装类来存储)的容器。                    2.集合的长度可变(相当于是一个可变长度的数组,但是数组中可以存储基本数据类型),且存入的类型可以不同(但是貌似很少存不同类型的)。 集合框架

u013221229的博客 576

Java 容器Collection 和 Map

Collection List ArrayList LinkedList Vector Stack Set HashSet LinkedHashSet TreeSet Map HashMap LinkedHashMap TreeMap ConcurrentHashMap Hashtable 1、Collection 和 Collections 有...

weixin_42179326的博客 186

JAVA集合体系总结

前面简要的宏观的介绍了几个常用的容器,Java中4大集合系统(Map、Set、List、Queue),常用的主要是前三种。我总结的比较肤浅,还有很多重要的特征,比如Map、Set、List的各个实现类之间的性能比较等,HashMap/HashSet插入自定义对象时,复写了equals方法、hashCode方法的不同情况对应不同结果,TreeMap/TreeSet插入自定义对象,复写equals方法、compareTo 方法的不同情况对应不同结果。很多书在这里着墨较多,以后有时间再补充。

从码农到码到成功 677

Java 集合详解,常用集合类

一、 java集合类图 1. 简单版: 2. 图二: 3. 图三 上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。 发现一个特点,上述所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove

qq_33454058的博客 3847

集合-Collection

1.1数组和集合的区别【理解】 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类 1.2集合类体系结构 集合分为两个接口:Collection(单列)、Map(双列) Collection(单列)分为两个接口:List(可重复)、Set(不可重复) List接口有两个实现类:ArrayList、LinkedList Set接口有两个实现类:Has

weixin_52600645的博客 407
上一篇: 数据结构概述
下一篇: Java中对泛型的理解及应用
皮卡丘不断更
博客等级 码龄5年 111粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮卡丘不断更

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值