疯狂java学习笔记(三)

疯狂java学习笔记(三)

本系列是基础知识巩固,主要参考李刚老师的疯狂java 突破程序员基本功的16课这本书籍的学习笔记总结。

一、Set与Map

1.Set与Map可以手动的互相转换 Set转换Map只需要新建一个对象,对象中又key和value两个属性,新建一个类继承Set存储新建的对象即可实现。Map转换为Set只需要将Map的Value固定,只使用Key存储数据即可实现;
2.Java底层Set就是Map封装一下只使用Key;
3.HashMap底层就是一个数组,数组中根据存入的Key的HashCode决定存放位置,其Entry单元中有四个属性,分别为HashCode,Key,Vaule,和下一个Entry,这样就形成了一个链表,当HashMap中的另一个拥有相同的HashCode值的不同的Key存入时,会将原来的Entry赋到新Entry的属性中,然后形成Entry链,查询的时候先比较HashCode,如果相同且Key值相同则直接取出,如果HashCode相同Key值不同则继续顺着链表寻找直到寻找到相同的Key值;
4.HashMap使用的时数组+数组中的对象为链表结构这种储存方式,我们称之为桶结构;
5.HashMap和TreeMap:表象上时TreeMap可以对Key进行排序,同理对应的TreeSet也一样,原因时TreeMap使用的时“红黑树”的二叉树结构储存Entry,也就是排序二叉树,左边恒放比此值小的数右边恒放比此值大的树,按照当前节点值与传入查询值的比较进行判断决定其存放位置/查询其数值;

二、List相关

6.Map与List转换:可以将List看作Map中的Key固定为一个从0开始每一次+1的整数,实际上ArrtyList底层为数组而LinkList底层为链表;
7.古董级Vector:Vector是从JDK1.0中就使用的集合储存,在后面几乎被ArryList完全取代,在使用上Vector与ArryList相比,ArryList几乎全部的方法在Vector中都有对应实现,区别在于Vector中其使用了synchronized修饰,即Vector是线程安全的,另外的不同是Vector中存储数据的数组elementData没有使用transient修饰,而使用transient修饰的ArryList其数组函数不会在序列化时不会直接序列化,顺便提供了writeObject&readObject方法从而实现定制的序列化输出,而Vector只提供了writeObject方法,并没有完全实现定制序列化。实际上当我们需要使用线程安全的集合时只需要调用一下Collection工具类中的synchronizedList方法即可将一个普通的ArryList包装为线程安全的ArryList(可怜的Vector);
8.ArryList与LinkList使用时性能分析:
当使用get(int index)方法时ArryList强于LinkList;
当使用add(int index,Object obj)时LinkList强于ArryList(因为ArryList需要对数组进行整体搬家);
当使用remove(int index)时,LinkList开销与add几乎完全相同,ArryList也需要对数组进行搬家,但是比add略快(因为无需新建数组),性能而言还是LinkList较好;
当使用add(Object obj)时,往List末尾添加一个元素,ArryList大部分情况下不需要对数组进行整体搬家扩展时性能略优于LinkList但是如果需要长度扩展则开销就很大了,而LinkList总能获得较好的性能;
结论:当把List当作双端队列频繁调用增删方法时,LinkList性能较强,大部分情景下应当使用ArryList;

三、队列与栈相关

9.栈和队列是两种数据结构,栈为先进后出队列为先进先出模式,在JAVA中栈类Strack实际上是对Vector的封装(也就是基于数组的栈),新增加了5个方法(进栈出栈等)。队列Queue是一个继承Collection的接口,是LinkList的窄化,LinkList实现了Queue接口,常用的基于数组的队列ArrayBlockingQueue,和基于链表的队列LinkedBlockingQueue。
10.在jdk1.6之后Java不再推荐使用Strack,而是提供了一个Deque接口其中有一个ArrayDeque可以用来完全代替Strack。Deque是双端队列的意思即实现先进先出(FIFO)队列的性质又实现的先进后出(FILO)栈的性质。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值