4 java se(4)----集合(深入源码分析)
来源:互联网 发布:小米隐藏网络怎么中继 编辑:程序博客网 时间:2024/06/05 10:18
一 什么是容器?作用?
容器就是集合类,集合类是可扩充的数组,用来存放对象。
二 两张结构图
三 细节
1 六个接口: (顶级接口java.lang.Iterator)Iterator------Collection----Set(HashSet(LinkedHashSet)) + List(LinkedList+ArrayList)
(顶级接口java.util.Map)Map---HashMap+TreeMap
(顶级接口java.lang.Comparable)Comparable
2 源码研究:
(1)ArrayList存储对象用的是数组:transient Object[ ] elementData 。为什么用transient,怎么序列化呢?ArrayList有writeObject()和readObject()方法。 LinkedList存储对象用的是链表:transient Node<E> first transient Node<E>last .并且Node是LinkedList的内部类。
这也是ArrayList和LinkedList在增删改查方面效率不一样的原因。
(2)Vector也是用数组存储对象,只不过Vector所有的方法都加了锁(synchronized)。Vctor可以看做是ArrayList的线程安全版。用得比较少。Stack是关于堆栈方面的,用得也比较少。
(3)HashSet继承AbstractSet(只有一个构造方法和三个方法equals()、hashCode()、removeAll())。为了确保Set集合里面的元素不重复所以重写了equals()和hashCode()方法。搞清楚3个问题:
Set用什么保存对象:private transient HashMap<E,Object> map;调用add(E)方法的时候:HashMap中只有键是有用的,值永远都是一个空的Object对象。HashSet调用add()方法时会调用HashMap的input()方法。
public boolean add(E e) { return map.put(e, PRESENT)==null; }
private static final Object PRESENT = new Object();
为什么Set不可以有重复元素:因为用的是HashMap来存储对象,HashMap的键对象(也就是E)是不能重复的。
为什么Set无序:这个就是HashMap的原因了。
(4)HashMap:
HashMap的put()源码:
public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
(1)先看table时候为空,为空的话就使它不为空
(2)处理空的key
(3)按照键key得到hash值
(4)按照hash值得到table的索引
(5)如果table的这个位置上有了一个值e。 e.hash == hash并且并且值相等,则覆盖。
- 4 java se(4)----集合(深入源码分析)
- java集合(4):HashMap源码分析(jdk1.8)
- 深入分析集合并发修改异常(源码分析)java.util.ConcurrentModificationException
- java SE 集合(三)
- java SE 集合(四)
- 深入JAVA源码分析
- java集合源码分析
- Java集合源码分析
- java集合(2):ArrayList源码分析
- java集合(3):LinkedList源码分析
- java集合(5):HashSet源码分析
- Java 集合(1)----- ArrayList 源码分析
- Java集合源码分析(二)Linkedlist
- Java SE 基础:集合(1)
- Java SE 基础:集合(2)
- Java SE --- 集合
- java se 集合 笔记
- Java Se ----集合框架
- 使用Profiler工具分析内存占用情况
- Java笔试常考知识点
- html css js php是否区分大小写 总结
- EJB<二>
- svn完全备份与增量备份
- 4 java se(4)----集合(深入源码分析)
- 机器学习python环境搭建
- Conversion to Dalvik format failed with error 1
- 【填坑】The type cannot be resolved. It is indirectly referenced from required .class files
- 好文章记录
- XML文件的创建,解析,修改
- hadoop---概述
- JDBC学习笔记 -- day03 正确释放资源的方法
- 论文笔记:unsupervised representation learning with deep convolutional generative adversarial networks