课堂课题:
Map,List,Array,Set之间的关系是什么,分别适用于哪些场景,集合大家族还有哪些常见的类?
关联任务:
任务五
直播时间:
2019-01-11 15:30:00
课堂内容:
视频链接:
PPT链接:
提交按钮:
小课堂内容格式
标题:
【修真院xx(职业)小课堂】课题名称
开场语:
大家好,我是IT修真院XX分院第X期的学员XX,一枚正直纯洁善良的XX程序员,今天给大家分享一下,修真院官网XX(职业)任务X,深度思考中的知识点——XXX
(1)背景介绍:
背景介绍的时候,尽可能的要宽广,讲清楚来龙去脉,讲清楚为什么会需要这个技术。
(2)知识剖析:
讲知识点的时候,尽可能的成体系,学会成体系的去给别人介绍知识。现在很多做的都是零散的,没有分类。
(3)常见问题:
最少列出1个常见问题。
(4)解决方案:
写清楚常见问题的解决方案。
(5)编码实战:
尽可能的去寻找在真实项目中在用的。如果你能找到某个网站在用你说的知识点,这是最好的。学以致用,否则当成练习题就没有意义了。多准备一些demo,讲解过程中将知识点和demo结合,便于大家理解所讲解的知识点。
(6)拓展思考:
知识点之外的拓展思考,由分享人进行讲解,这些东西就是所谓的深度,也是一个人技术水准高低比较的表现。
(7)参考文献:
引入参加文献的时候,在引用的句子后面加上序号【1】。参考文献中列出详细来源。不要去抄别人的东西,这是一个基本的态度。
(8)更多讨论:
Q1:提问人:问题?
A1:回答人(可以是分享人,也可以是其他学员):回答
Q2:提问人:问题?
A2:回答人(可以是分享人,也可以是其他学员):回答
Q3:提问人:问题?
A3:回答人(可以是分享人,也可以是其他学员):回答
(9)鸣谢:
感谢XX、XX师兄,此教程是在他们之前技术分享的基础上完善而成。
(10)结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
标题:
【修真院java小课堂】
Map,List,Array,Set之间的关系是什么,分别适用于哪些场景,集合大家族还有哪些常见的类?
开场语:
大家好,我是IT修真院北京分院第37期的学员杨若曦,一枚正直纯洁善良java程序员,今天给大家分享一下,修真院官网java任务一,深度思考中的知识点——
Map,List,Array,Set之间的关系是什么,分别适用于哪些场景,集合大家族还有哪些常见的类?
(1)背景介绍
java结合类中主要派生出两个接口 Collection 和 Map;<br>
SET:程序可以依次吧多个对象放入到set集合中,而set不能记住元素的添加顺序;<br>
set集合和collection基本相同,没有提供额外的方法;<br>
set集合不允许相同的元素,如果添加相同元素,返回false
List:代表的是一个元素有序,可以重复的添加到集合中,每个元素对应一个索引;<br>
list集合是程序中使用最多的集合之一,相对set集合来说,最大的优点就是可以快速的取到相应的值<br>
Map: 用于保存具有映射关系的数据,Map集合中保存的两组值,一组保存的是Key,一组保存的是Value;<br>
Key - value一一对应,key不可以重复,value可以重复;
(2)知识剖析:
set集合的具体实现<br>
HashSet:set集合最常用的实现类,主要有以下特点:1.不能保证元素的顺序;2.线程不安全,<br>
LinkedHashSet : HashSet的子类,可以解决HashSet没有排序的问题;<br>
TreeSet : 自动排序的set集合
list集合的具体实现<br>
ArrayList : 基于数组实现的一个集合,<br>
Vector : 古老的一个集合类;<br>
LinkedList : 双向链表,可以实现堆和栈的功能;
map集合的具体实现:<br>
HashMap : 底层实现为数组 + 链表 + 红黑树 ;最常使用的实现类;<br>
HashTable : 古老的方法 ;<br>
LinkedHashMap : 使用双向链表来维护key中的数据
(3)常见问题:
各个集合之间的使用场景
(4)解决方案:
对于set集合来说 : 一般情况下都使用HashSet ,当频繁对集合进行插入删除操作的时候,可以使用LinkedHashSet;<br>
对于list集合来说 : 一般情况都会使用ArrayList, 当频繁进行插入 删除的操作的时候,可以使用LinkedList<br>
对于Map集合来说 : 一般情况下会使用HashMap,
(5)编码实战:
分别使用set,list和map的实现类来实现增删改查功能,同时比较他们的添加效率,迭代效率,和插入效率
(6)拓展思考:
线程安全的集合实现类有哪些?
在集合类中,古老的vector和hashtable都是线程安全的,但是因为他出现时间过早(在jdk1.0的时候就已经存在了),方法名称过长,效率低等都是这些古老容器的问题,
在jdk1.5之后,在juc包中,有添加了几种线程安全的容器:
CopyOnWriteArrayList
和
ConcurrentHashMap
这两个也是线程安全的实现类,如果需要多线程访问的情况,可以使用这两个实现类,
唯一的问题就是他们的执行效率不高,相对HashMap和ArrayList来说效率差了几个0;
(7)参考文献:
相关博客
(8)更多讨论:
Q1:hashCode和equals作用是什么?为什么要同时重写这两个方法?
A1:equals是比较两个对象是否相对的方法,在使用这个方法的时候,会将集合中所有的元素进行一一比较,从而得到两个对象是否相等,
而hashCode则是快速找到两个对象是否为同一个hash值,
当容器中元素过多的情况下,使用equals方法会造成性能问题,而通过hashcode方法,则可以快速定位这个元素hashCode值是否相等,若相等的情况下,则再去使用equals方法来比较是否相等;可以有效减少效率问题;
简单来说 hashCode方法是两个对象相等的必要不充分条件;
equals是相等的充要条件;
当只重写其中一个方法的时候,会造成容器将两个对象看做不同的两个对象,从而比较对象为false;
Q2: 线程安全的实现类是怎么实现线程安全的?与古老的方法有什么区别?
A2:vector和hashTable他们使用的是synchronized来实现线程安全,几乎所有方法都使用这个锁来进行上锁功能,造成效率低下;而1.5后新加的juc包,则是在关键位置上加入synchronized锁,同时list使用的是lock进行加锁,他们的加锁机制也不太一致,造成了他效率比古老的方法要高;
Q3:Linked等集合类为什么插入效率高?
A3: 因为他们底层的实现不一样,在linked等集合中,底层使用的是链表结构,而链表的特性就是增加,删除效率高,而查找效率慢;
(9)鸣谢:
感谢我的师兄和北京分院的各位java师兄,以及无私将经验分享给我们的网上博客制作者以及书籍撰写者和译者,此课程是在他们分享知识的基础上完善而成。
(10)结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
[北京|结业弟子]JAVA-赵君钊 发表于 2019-01-17 14:08:43 #1
TreeMap的底层是红黑树,可以看一下,能说出性质是什么就行,它是怎么实现自动平衡的
回复