2022-08-06 第4组 蒋萍 Java集合的简单介绍

“活的认真,笑的放肆”

本文只是简单整理了关于集合的一些简单引应用,还有些凌乱,建议看导图学习

一、集合

就是容器容器,方便存储和操作数据

导图

image

下面这张图来自网络,如有侵权,联系删
注意:Collection 是接口,而 Collections 是一个工具类
image

1、Collection:存放单值的最大父接口

​ List:列表,线性表,和数组乐类似,List可以动态增长,查找元素方便

​ Set:线性表,查询效率低,方便插入删除,且不用移位

1.1 List

List集合中存放的数据:
1、数据有序,(添加的先后顺序和输出的顺序一致)

2、数据可以重复

image

ArrayList类

内部是一个数组,

image
它的一些常用方法:
image
数组变集合:
image

  • 数组和集合之间的转换时,建议封装成一个工具类
/**
 * 数组与集合之间的相互转换
 */
public class ArrayTrans {

    public static Object[] toArr(List list){
        Object[] obj = new Object[list.size()];
        for (int i = 0; i < list.size(); i++) {
            obj[i] = list.get(i);
        }
        return obj;
    }
    
    public static List toList(Object[] arr){
        List list = new ArrayList();
        for (Object o : list) {
            list.add(o);
        }
        return list;
    }
}

注意的小点:

  • 初始化集合时尽量指定容量,如果不确定,就写16

  • 使用泛型数据类型时,一定就是引用数据类型

LinkedList

image

怎么办?? 用它自己创建:
image

Vector

效率太低,一般只出现在面试里

1.2 Set(几乎不用)

继承自Collection接口。

Set:无序(添加的先后顺序),不可重复

无序,那就不好取值

HashSet

image

image

  • 没有get方法,难以单独获取某一个元素

  • 如果传入的是引用数据类型:

image

TreeSet

排序规则:

要排序的对象的类,必须实现comparable接口

comparable接口是个泛型接口
String和Integer实现了!!所以不会报错

  • 当参数传入的是Integer型的数字:

image

  • 当参数传入的是String型:

image

  • 当参数传入的是引用数据类型会报错:

那实现了comparable接口,引用数据类型咋排序??

image

自己写排序规则:

image

image

LinkedHashSet(一般不用)

image

2、Map<K,V>:存放对值的最大父接口

Map(最常用 ),映射,保存具有映射关系的数据,key和value可以是任意的引用数据类型,key唯一

  • List和Set两个接口都继承自Collection接口

Map接口:存储对值,key唯一,value可重复,无序添加的先后顺序

HashMap面试90%必问原理

根据key取value用get():
image

image

**- 它的内部存储结构:

1、JDK1.7之前:链表 + 二叉树

2、JDK1.8以及之后:链表 + 数组 + 红黑树**

Hashtable (t就是小写)

和HashMap 几乎一模一样

LinkedHashMap

内部是链表

Properties(Hashtable的子类)(重要)

更多的用于操作属性文件,重要且单一

image

二、集合遍历

List集合的遍历(最简单)

遍历:把每个属性都访问一遍

1、for循环

2、增强for循环,其实它的原理就是迭代器

3、迭代器

它是个接口,
image

image

image

Set集合的遍历

1、增强for循环(原理就是迭代器),不能用普通的for循环

2、迭代器

先生成一个迭代器

image

Map集合的遍历(重点)

1、增强for循环(原理就是迭代器)

image

image

2、迭代器
image

迭代中删除元素问题

image

没删干净!!!!数组删完后有移位问题,List自己移位了

怎么解决??

1、回调指针

image

2、逆序遍历删除

image

3、使用迭代器(推荐使用)
image

4、增强for循环

image

三、其他的集合

LinkedHashMap:在HashMap的基础上维护了一个双向链表

TreeMap:天然支持排序

Colletions : Collection的一个工具类

四、比较接口

comparator是个泛型的函数式接口:做临时排序(用的时候就写)

comparable接口:自然排序,排序规则固定

image

五、一个并发修改问题(面试题)

开发一般不用

并发修改异常

image

增强for循环底层是迭代器,而迭代器是依赖于集合而存在,在判断成功后,集合中增加了元素,

迭代器不知道,所以报错!!!(集合删除,迭代器遍历,还互相不知道,就报错~!!!!)

相当于两个人在干活

解决:

1、迭代器遍历元素,迭代器删除元素

2、普通for循环遍历,集合删除

六、集合总结

需要掌握的 :

1、如何创建需要的集合,通常使用多态创建,主要用到的是List和Map

2、各种区别,理解不了就背下来

3、各种集合API的调用

4、两个比较的接口

5、最重要的集合

ArrayList和HashMap、

List、Map

6、各种集合的特点(必须会,理解不了就背)

从接口层面到实现类层面

7、重点集合的内部结构 ArrayList、HashSet、HashMap

8、各种集合的遍历

9、并发问题(面试可能会问)

七、积压问题:

1、sychronized 原理

2、ReentrantLock 原理

3、ArrayList、LinkedList 、原理

4、HashMap(重灾区)、HashSet原理

image-20220806164312666

List--Map--Set

posted @ 2022-08-06 21:57  来日可追  阅读(22)  评论(0编辑  收藏  举报