Java复习笔记(三)——集合框架复习

2 篇文章 0 订阅
1 篇文章 0 订阅

集合框架体系

在这里插入图片描述

复习目标

一.掌握JAVA集合框架体系结构,需要明白各接口与类中间的关系。掌握List,set,Map之间区别及使用场景。

集合框架的体系结构

集合框架大致分为两类容器,一类是以元素集合存储的Collection,一类是以键值对存储的Map。如第一个图所示,Collection和Map是两个接口,整个集合框架是围绕一组标准接口而设计的,框架还包括接口的实现类,算法则是实现接口的对象的相关有用的计算。

List、set、Map区别和使用场景

1、list存取有序,允许重复元素 set存取无序,不能重复元素 Map 中存储的数据是没有顺序的, 其 key 是不能重复的,它的值是可以有重复的。
2、set无序,删除插入效率更高,只允许一个null值(元素不能重复)
3、使用场景:

  • 想要快速访问——ArrayList读快改慢、多次删除修改——linkedList改快读慢
  • 想要不出现重复的元素——set的实现类
  • 想要键值对保存——Map的实现类

二.掌握ArrayList,LinkedList及Vector间的区别。掌握ArrayList接LinkedList的底层实现及各自优缺点。

ArrayList,LinkedList及Vector间的区别

ArrayList是基于动态数组数据结构,LinkedList是基于链表的结构,所以在依据索引查询时,ArrayList更快、LinkedList在修改删除更快,ArrayList需要移动数据,LinkedList只需要修改节点的地址,Vector的大致实现和ArrayList相同,但是在每个操作都加上了synchronized修饰,保证了线程安全,所以查询效率低

三.掌握迭代器使用,掌握list set 及Map的遍历方式。

ListIterator<Dazyhkh>iterator=lists.listIterator();//创建集合的迭代器
	while (iterator.hasNext()) {//判断循环
		System.out.println(iterator.next());//获取对象的引用的拷贝
	}

遍历方式
详情:https://blog.csdn.net/zgs921364401/article/details/81699508

for循环迭代器foreach
listfor (){}Iterator iterator = list.iterator();for(E e : list){}
setIterator iterator = set.iterator();for(E e : set){}
MapIterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();for(Map.Entry<String, String> entry : map.entrySet())

四.掌握HashMap及HashTable间的区别与联系

HashMap和Hashtable的底层实现,都是数组+链表结构。
1、HashTable的底层实现方式多了synchronized,所以线程安全,但是效率较低
2、HashMap可使用null作为key,Hashtable不允许null作为key HashMap以null作为key时,总是存储在table数组的第一个节点上
3、HashMap是对Map接口的实现,Hashtable对Map接口的实现和对Dictionary抽象类的继承

五.掌握HashMap的底层实现,理解一个K-V键值对的存取过程,掌握HashMap JDK1.8新特性。

HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。
JDK1.8增加了红黑树部分而当链表长度太长(默认超过8)时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能.

六.理解TreeSet的原理与使用。(TreeSet底层实现https://blog.csdn.net/zhaojie181711/article/details/80494318)

TreeSet是一个“没有重复元素的、有序的”set集合,是一个不同步的非线程安全的二叉树
在这里插入图片描述
TreeSet的底层是这样的一个二叉树(如上图所示),当我们存储的第一个元素的时候,会把第一个元素存在“根”的位置,存储第二个元素的时候,TreeSet 底层会调用 compareTo() 方法:

1)如果 compareTo()的返回结果为 0 则这两个元素是一样的,就不会存储,

2)如果返回负数,则第二个元素比第一个元素小,把第二个元素存储在左孩子的位置。

3)如果返回正数,则第二个元素比第一个元素大,把第二个元素存储在右孩子的位置。

七.理解ConcurrentHashMap使用及实现原理。

介绍

ConcurrentHashMap从JDK1.5开始随java.util.concurrent包一起引入JDK中,主要为了解决HashMap线程不安全和Hashtable效率不高的问题。众所周知,HashMap在多线程编程中是线程不安全的,而Hashtable由于使用了synchronized修饰方法而导致执行效率不高;因此,在concurrent包中,实现了ConcurrentHashMap以使在多线程编程中可以使用一个高性能的线程安全HashMap方案。
而JDK1.7之前的ConcurrentHashMap使用分段锁机制实现,JDK1.8则使用数组+链表+红黑树数据结构和CAS原子操作实现ConcurrentHashMap;

八.了解CopyOnWriteArrayList,CopyOnWriteArraySet,ArrayBlockingQueue,LinkedBlockingQueue,了解其各自特点及使用场景。

CopyOnWriteArrayListCopyOnWriteArraySetArrayBlockingQueueLinkedBlockingQueue
原理底层是用volatile transient声明的数组 array;CopyOnWriteArraySet包含CopyOnWriteArrayList对象,它是通过CopyOnWriteArrayList实现的,所以CopyOnWriteArraySet相当于通过通过动态数组实现的“集合”由数组支持的有界阻塞队列由链表结构组成的有界队列
特点读写分离,写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array和CopyOnWriteArrayList一样,是通过volatile和互斥锁来实现的。按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。队列按照先进先出的顺序进行排序
优缺点读不加锁,内存占用多,不能实时读取数据读不加锁,内存占用多,不能实时读取数据;有界;用于存储队列元素的存储空间是预先分配的,使用过程中内存开销较小(无须动态申请存储空间)可有界可以无界;用于存储队列元素的存储空间是在其使用过程中动态分配的,因此它可能会增加JVM垃圾回收的负担
使用public E set(int index, E element);public boolean add(E e);public E get(int index)public boolean add(E e);public boolean remove(Object o);public boolean add(E e);public boolean offer(E e)boolean add(E e);E take() :取出当前队列首元素

常见知识点
1.Collection和Collections的区别
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。

引用
国科学院
菜鸟教程
https://www.runoob.com/java/java-collections.html
HashMap与Hashtable的区别与联系
https://blog.csdn.net/jiahao1186/article/details/83586515
掌握HashMap JDK1.8新特性。
https://blog.csdn.net/qq_36520235/article/details/82417949
TreeSet底层实现
https://blog.csdn.net/zhaojie181711/article/details/80494318
Java中的集合——TreeSet
https://blog.csdn.net/y0q2t57s/article/details/81295219

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值