集合

集合

1. 内容

image-20241110162932396

image-20241110165953906

image-20241110170043961

1.1 List

ArrayList集合特点:有序,可重复

LinkdList特点:有序,可重复,增加删除效率高。

1.2 set

set集合特点:无序,不可重复元素

Hashset:无序,不可重复元素

LinkdHashset:有序,不可重复

Treeset:有序且不可重复

1.3 Map

键值对集合

HashMap:键值对集合,无序且不可重复

LinkdHashMap:键值对集合,有序且不可重复

TreeMap:键值对集合,有序且不可重复

2. 集合概述

集合是什么,有什么用

可以认为集合就是一个可以存储任何数据类型的动态数组。

image-20241110164052119

3. 集合导入泛型

简单了解泛型的基本使用后,对于我目前javaweb的使用的相关定义记录一下

java web使用的一般是HashMap这个集合,实例化如下:

HashMap <key,value> 集合变量名 = new HashMap<key,value> ();
其中,key指的是这个集合里面对象的序号的类型,value指的是该对象来自哪个类,即该对象的类型是什么。
举例:HashMap<String,UserBean> = new HashMap<String,UserBean> ();

注意:集合里面实际上存储的是对象,对于基本数据类型,要转化为他的包装类。

对于String类型的对象,集合里面直接传数据就可以(这是允许的),可以简单的认为,数据就是以String类的对象的形式存储的,只不过这个对象就表示数据。
就好像这个String类里面属性只有一个value,str.value=数据。

static这个找个时间看一下,好多对象都是用静态设置

4.集合和数组的区别

image-20250212174130145

5.集合和数组输出对比

5.1 集合原型输出

List<Integer> people1 = Arrays.asList(1,2,4);
System.out.println(people1);

上述代码输出后结果为

image-20250213172756331

System.out.println(people1);输出时,,List接口的实现abstractCollection类中对该方法重写,输出结果为集合的值。

public String toString() {
    Iterator<E> it = iterator();
    if (! it.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = it.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! it.hasNext())
            return sb.append(']').toString();
        sb.append(',').append(' ');
    }
}

5.2 集合遍历输出

List<Integer> people1 = Arrays.asList(1,2,4);
for (Integer people2 : people1 ) {
    System.out.println(people2.toString());

}

上述代码输出结果为:

image-20250213173004562

遍历输出是访问每个元素,一个一个输出。

5.3 数组原型输出

int[] array = {1, 2, 3};
System.out.println(array.toString());

上述代码输出:

image-20250213173322241

数组默认没有重写toStirng方法,输出类型和哈希值组合

5.4 数组如何输出原型

int[] array = {1, 2, 3};
System.out.println(Arrays.toString(array)); // 输出: [1, 2, 3]

5.5总结toStirng方法重写和未重写对象

总结一下List、map和list集合对象是map,map值是list的三种情况原型输出方法出处

5.1map集合输出原型

编译时调用的是Object的toString方法,运行时调用的是实际类型的重写后的toString方法,这个toString方法是HashMap的父类AbstractMap类的方法,这个方法输出的Map集合带有{key=value}的格式,如果value是list集合则输出{key=[a,b,c]}的形式。

因此下面的图片的说调用toString的方法有误,其他没问题。

public String toString() {
        Iterator<Entry<K,V>> i = entrySet().iterator();
        if (! i.hasNext())
            return "{}";

        StringBuilder sb = new StringBuilder();
        sb.append('{');
        for (;;) {
            Entry<K,V> e = i.next();
            K key = e.getKey();
            V value = e.getValue();
            sb.append(key   == this ? "(this Map)" : key);
            sb.append('=');
            sb.append(value == this ? "(this Map)" : value);
            if (! i.hasNext())
                return sb.append('}').toString();
            sb.append(',').append(' ');
        }
    }

5.2 第三种类型

List<Map<String, List>> list = new ArrayList<>();

这种输出情况是:

  1. 首先有list的[]
  2. 其次里面对象是map,所以里面是{key=value}的形式
  3. 最后value是list形式,最终形式[{key=[1,2,3]}, {key=[2,2,2]}]

image-20250214203609328

image-20250214205130535

6 三种集合具体对比

6.1 特点对比

只要知道三种集合的特点,根据特点会用响应的集合就行,还不需要仔细理解三个集合的实现类的数据结构,数据结构属于更更底层了。业务开发只根据结构的特点选用具体的集合,一般就到Hash和Array就行,linked用的很少,用的时候他们的实现类都是根据实现的接口的特点操作,只不过也有自己的方法,不过一般不常用(注意一个ArrayList的indexOf方法返回索引)。

我简单总结一下:list主要就是有序,可重复;set主要就是不可重复,也可以通过实现类实现有序;map主要就是键值对特点,也可以实现有序通过实现类。然后注意set的自动去重是除了自定义对象外的所有对象,自己的对象需要重写hasCode和equals方法

下面三张图片详细解释了特点:

image-20250215225421043

image-20250215225857641

image-20250215230035239

6.2三种集合常用方法

image-20250215233635459

6.3 实现类常用方法

其实除了个别实现类有之外,其他的都是跟接口方法一样,只不过基于不同的数据结构之后,一些特点会改变,像无序便有序,增删效率快慢等,尤其是hash实现类,相当于基于哈希表对接口进行实现,相当于接口的宿主一样,没有大的变化,接口干啥他干啥

image-20250215233835949

7. 泛型

7.1 int和Integer的区别

image-20250216220226839

7.2 为什么泛型中无法使用int

image-20250216220354458

posted @ 2025-03-06 16:14  JSESSIONID  阅读(12)  评论(0)    收藏  举报