0
点赞
收藏
分享

微信扫一扫

java中的集合 最全面的集合讲解

小飞侠熙熙 2022-04-08 阅读 57
java

集合只能存储对象,长度可变的数据结构'

Collection是一个接口,没有办法创建对象,所以需要它的子类来创建对象,创建对象的时候可以使用多态。

一、Collection中通用的方法

方法:

  • 创建集合对象,会自动重写toSting方法

  • add

  • remove 删除指定元素

     

  • contains 判定集合是否包含给定对象

         

  • isEmpty判断集合是否为空,为空返回true

  • size

  • toArray

  • clear

二、List集合

  • 特点:

    • 有序的集合(存储元素和取出元素的顺序一致)

    • 有索引,包含了一带索引的方法

    • 允许存储重复元素

  • List是大小可变的数组实现

  • 常用方法:

 public static void main(String[] args) {
        List<String> list =  new ArrayList<>();//多态
        list.add("a");
        list.add("b");
        list.add("s");
        list.add("s");
        System.out.println(list);//[a,b,s,s]打印的不是地址值,说明重写了toString方法

        //使用add方法在指定位置,添加元素
        list.add(2,"c");//在索引为2的位置添加c
        System.out.println(list);//[a,b,c,s,s]
        //移除指定位置元素,并返回被移除的元素
        String remove = list.remove(2);
        System.out.println(remove);//[a,b,s,s]
        System.out.println(list);//[a,b,s,s]
        //替换指定位置的元素,并返回被替换的元素
        String c = list.set(2, "c");
        System.out.println(c);//s
        System.out.println(list);//[a,b,c,s]

        //遍历集合,三种方式
        //使用普通for循环
        for (int i = 0; i < list.size(); i++) {
            //get()返回指定位置的元素
            String s = list.get(i);
            System.out.println(s);
        }
        System.out.println("-----------");
        //使用迭代器
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }
        System.out.println("-----------");
        //使用foreach
        for (String s:list) {
            System.out.println(s);
        }

       // String r = list.get(5);//没有索引为5的,会报索引越界异常IndexOutOfBoundsException
        //System.out.println(r);
    }

三、ArrayList

  • 是List集合的实现类

  • ArrayList最底层的源码是数组的复制。如果添加一个元素,会先创建一个数组,长度是原数组的长度+1,然后把数据放到新数组。先所以查询快(连续的),增删慢

  • 所以查询多,增删少的的话用ArrayList

 

Vector是单线程的,在1.2之后,被ArrayList取代了

四、 LinkedList 

是List接口的链表实现, LinkedList 底层是一个双向链表,里面包含大量操作首尾的方法,查询慢,增删快,此集合是多线程。

 要使用LinkedList 特有方法,不能使用多态了

LinkedList 的方法 

1.添加的方法

 2.获取的方法

 3.移除的方法

 五、Set接口

继承了Collection,

特点:1.没有索引,没有带索引的方法,也不能for循环遍历 2.不允许存储重复元素

主要看他的实现类,HashSet和LinkedHashSet

六、HashSet集合

实现了Set接口

特点:1.不允许存储重复元素 

          2.没有索引,没有带索引的方法,也不能for循环遍历

          3.是无序的集合,存储和取出数据的顺序可能不一样

          4.底层是哈希表结构(查询速度非常快)

【哈希值】

1.是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到的地址,不是数据实际存储的物理地址)

2. 在Object类有一个方法int hashCode 返回该对象的哈希码值 

hashCode方法源码:public native int hashCode();

native :代表该方法调用的是本地操作系统的方法

说到这,我们想起了之前的toString方法,看一下他的源码: 

3.也可以重写hashCode方法

重写之后调用hashCode方法,返回的值虽然一样,但是对象并不一样

4.String类是重写了hashCode的

【哈希表】

是HashSet集合存储数据的结构

特点:查询速度很快

在jdk1.8之前:哈希表=数组+链表

jdk1.8之后:哈希表=数组+链表;哈希表=数组+红黑树(可以提高查询效率)

哈希表:初始容量是16;将元素进行分组,相同哈希值的元素是一组,以链表/红黑树结构连接

1.8之后当一组的元素超过8个,会转换成红黑树

哈希冲突:两个元素不同,但是哈希值相同。

Set集合存储元素不重复的原理:

Set集合在调用add方法时,会先调用元素的hashCode方法和equals方法,判断元素是否重复

Set集合存储元素不重复的前提:所存储的元素类型必须重写hashCode方法和equals方法

保证Set集合元素唯一:重写hashCode方法和equals方法

如果不重写对象的equals方法,则比较的是两个对象的地址值

如果不重写对象的hashCode方法,操作系统会随机匹配hashcode值

 七、LinkedHashSet集合

是HashSet的子类

特点:底层是一个哈希表+链表:多了一条链表,用来记录元素的存储顺序,保证元素有序 

 八、Collections

是操作集合的工具类

Collections的方法:

 addAll,统一添加

shuffle,打乱顺序

 

 sort(实现Comparable的方法)

如果泛型用的是String也可以,因为 Integer和String都实现了Compareable接口,为了重写这个接口里CompareTo方法(排序的方法)

sort方法(Comparaor)

 

需要重写 Comparator里的compare方法,

也可以用于自定义的类,但是要重写compare这个方法

如果自定义一个Person类,要用这个sort方法时,重写compare这个方法。如下

举报

相关推荐

0 条评论