java 3_4_5判断三角形_Java集合4-3

本文深入探讨Java集合框架,包括List、Set、Map等核心接口及其实现类的特点与应用场景,特别关注了不同数据结构如链表、数组、哈希表和二叉树的应用,并对比了各种集合类的线程安全性与性能表现。

Java集合4-3

文章目录

类集结构图

集合是Java中一些成熟的数据结构的实现

007f9ab441625378bcf4bd95af9c924a.png

一、链表和二叉树思路

(1)链表

class Node {

Object data;

Node next;

}

(2)二叉树

class Node {

Object data;

Node left;

Node right;

}

二、Collection接口

一般不会直接使用Collection接口,而是使用其子接口List和Set,都是存储单值的集合类,前者可以重复,后者不可以重复

三、List接口

List的实现类,ArrayList(95%)、LinkedList(1%)和Vector(4%),Vector是ArrayList的早期实现,LinkedList是链表实现,而其他是数组的动态扩容实现。

1.ArrayList

使用数组进行存储

线程不安全

f90d58e3f313da9fb7e3961b26514cd0.png

2.Vector

Vector是同步的,即线程安全,如果不要求线程安全,建议使用ArrayList

3.LinkedList

使用的是双向链表的结构

dddce6a3230ccdb831c340b9b1810d51.png

08f1387bcf2269f182cb3b06dd2a0da7.png

四、Iterator和ListItertor

用来遍历集合中的元素

快速失败:比如迭代器遍历之前有10个元素,迭代到一半的时候元素的数量变成5个。那么迭代器就懵了,直接出错给你看

安全失败:在遍历之前复制一份,遍历的是复制的那一份,就算数据被改也不会出现异常。一般不进行特殊的描述指的都是安全失败

(1)iterator.next()用来将指针下移并return下一个元素

d529261578e7ccd0a06b0826742e218e.png

使用remove删除元素要先找到元素,否则会出错

f4c261b66ee70267d82f7e438f837f57.png

(2)ListIterator其实是Iterator的一个子类,ListIterator可以有前移操作

f72f3cb568a8dc599e1ecaca0310db10.png

五、forEach

增强for循环,最早出现在c#语言中,内部使用迭代器进行遍历,用于迭代数组和结合(Collection)

abcf182a69b3ff4a8e0b2a4ef8bb530d.png

d21ef1cee476811437d8cbea28ebf255.png

六、Set接口

Collection和Set没有get方法 ,前面说过Set不能包含重复元素,null也只能有一个,模拟数学中集合的概念。如果将可变对象存入Set,则必须非常小心

七、HashSet

Set不能重复,HashSet内部的原理其实是在使用HashMap进行存储

7aa2c43883b19e572b0611863fdbdcd0.png

可以看到flag1为true,flag2为false

89d711229265aca40d4d48cb87295e8c.png

八、TreeSet类与Comparable接口

前面的HashSet是散列存储,这里的TreeSet采用有序的二叉树进行存储,利用TreeMap进行存储。输出的顺序是数据的顺序,而不是输入的顺序

494de3c41a5551571e1527b781a2912e.png

可是毕竟ABCD我们都知道他们的顺序,可是如果是我们自定义的类型呢,比如下面的Person,哪个在前面,你自己肯定也想不明白,那java说我也想不明,我直接出错给你看

dec3161fe8e12fa2f0c896d79714ad4f.png

那么到底如何解决呢,我们 需要实现Comparable接口

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210107105110892.png?x-oss- process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1a2FuZ18=,size_16,color_FFFFFF,t_70)

九、Map 接口

不同于Collection的单值存储,Map存储的是键值对,Map集合的键不可重复

1.哈希表

哈希桶中的数量大于8时,链表会装换成二叉树,更利于查找;当哈希桶中的数量减少到6时,红黑二叉树转换成链表。当散列因子达到0.75时对哈希表扩容到2倍

2.HashMap/HashTable/ConcurrentHashMap/TreeMap/LinkedHashMap

以上的基本用法是一样的,但是输出的顺序可能不同,TreeMap和之前的TreeSet一样,如果是自定义类型需要实现Comparable接口

需要注意的是,不能直接对HashMap进行遍历,要先用keySet()将其转化成Set,这里的set是键

5dc281041d9c488ac756aaa69a0c385c.png

或使用values()将其转化成Collection(),这里的values是值

f0c62ed32f5ea861987d25af474c10aa.png

3.Map集合各子类区别分析

(1)HashMap

线程不安全,效率高

(2)HashTable

线程安全,效率低

(3)ConcurrentHashMap

采用分段锁机制保证线程安全,效率又比较高

(4)TreeMap

有序

(5)LinkedHashMap

HashMap加双向链表

4.存储自定义对象

下面我们自定义一个Book,显然下面的代码是能成功输出的

7c757f0ddb13d34277d950f5d926ad07.png

但如果我们对book1的name进行修改,此时就不能通过book1找到相应元素了,原因是之前我们是通过name和info计算出的hash值,但是当我们的name被改变之后计算出的hash值就变了

2a1df428b7bf74d8eb10ab4524874c58.png

这里的book3也找不到是因为,虽然book3确实能找到book1的位置,但不是找到就结束了,系统还会把book3和book1的key和info进行比较,结果不一致就返回null

81eb41e427aef3a5a0126418cef3fb9d.png

当自定义类型需要改变时尽量不要放在key的位置

十、JDK9集合新特性

提供存储确定长度的List,不可修改

fb98a631b2a3e33646e05e8dd219dd98.png

1e5530492f8bcf6f8662110093ee65d2.png

065d2acdea0aa7ab95b349debdfc500b.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值