集合框架反复蹂躏(一)
来源:互联网 发布:微博金v软件 注册码 编辑:程序博客网 时间:2024/05/18 04:59
集合框架层次结构:
---Iterable
----Collection
----List(有序且重复)
---ArrayList
---LinkedList
----Set(无序不重复)
---Map(键值对)
---HashMap
ArrayList:*****
它底层是Object类型的数组,当调用无参构造方法的时候,添加第一个元素的时候,给数组
开辟一个长度为10的一个Object数组。当添加的元素超过原数组大小的时候,数组会自动扩容,
大小是原数组大小的1.5倍,再把原数组中的值拷贝到新数组中。
特点: 查询效率高,但删除、添加效率比较低,因为数组要做移位操作。
LinkedList:*** 它比ArrayList多继承了几个接口,deque,queue
所以LinkedList 无非比ArrayList多了,XXXFirst XXXLast方法
总结:LinkedList 它底层是一个双向链表数据结构.
特点:链表数据结构的特点决定了LinkedList的性能.删除、插入效率比较高,因为它
只影响被删除或插入节点的前后两个节点,其它的节点不影响。
查询效率比较低,因为它要从到开始一个个节点去查找。
Iterator(迭代器)
讲一下迭代模式。
迭代器模式(Iterator),提供一种方法顺序访问一个集合对象中的各种元素,而又不暴露该对象的内部表示。当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。另外,当需要对聚集有多种方式遍历时,可以考虑去使用迭代器模式。迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
HashMap*****HashTable
HashMap:非线程安全,可以键为null,Hashtable:线程安全,不可以为null
HashMap它底层是一个数组+单项链表(Entry类型的数组),调用默认构造方法的时候,默认开辟的数组16*0.75=12大小,
存放null键的话肯定是放在第一位的
假设不为null 先执行
int hash = hash(key); 根据键计算出一个哈希值
int i = indexFor(hash, table.length);计算出放到哈希表的具体位置
//在哈希表中遵循的原则:
1)当两个对象equals相同,那么这两个对象hashcode相同
2)当两个对象equals不相同,这两个对象hashcode可以相同也可以不相同,最好是设置为不 同,这样会提高效率。
3)当两个对象的hashcode相同,那么两个对象的equals不一定相同
4)当两个对象的hashcode不相同,那么两个对象的equals一定不相同
TreeMap:
它底层是一个红黑树(平衡二叉树)的一种数据结构,默认会按照
键的自然顺序来进行排序,也就说要没比较的对象实现Comparable接口(实现compareTo),要么TreeMap的构造方法中添加Comparator接口的实现类对象(实现compare()方法).
此两个方法返回值为3个,小于0的放在节点的左侧,大于0的放在节点的右侧,相同的话,键所对应的值替换。
HashSet:
其实我们操作的是它底层维护的HashMap的键,值不用
TreeSet:
其实我们操作的是它底层维护的TreeMap的键,值不用
---Iterable
----Collection
----List(有序且重复)
---ArrayList
---LinkedList
----Set(无序不重复)
---Map(键值对)
---HashMap
ArrayList:*****
它底层是Object类型的数组,当调用无参构造方法的时候,添加第一个元素的时候,给数组
开辟一个长度为10的一个Object数组。当添加的元素超过原数组大小的时候,数组会自动扩容,
大小是原数组大小的1.5倍,再把原数组中的值拷贝到新数组中。
特点: 查询效率高,但删除、添加效率比较低,因为数组要做移位操作。
LinkedList:*** 它比ArrayList多继承了几个接口,deque,queue
所以LinkedList 无非比ArrayList多了,XXXFirst XXXLast方法
总结:LinkedList 它底层是一个双向链表数据结构.
特点:链表数据结构的特点决定了LinkedList的性能.删除、插入效率比较高,因为它
只影响被删除或插入节点的前后两个节点,其它的节点不影响。
查询效率比较低,因为它要从到开始一个个节点去查找。
Iterator(迭代器)
讲一下迭代模式。
迭代器模式(Iterator),提供一种方法顺序访问一个集合对象中的各种元素,而又不暴露该对象的内部表示。当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。另外,当需要对聚集有多种方式遍历时,可以考虑去使用迭代器模式。迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
HashMap*****HashTable
HashMap:非线程安全,可以键为null,Hashtable:线程安全,不可以为null
HashMap它底层是一个数组+单项链表(Entry类型的数组),调用默认构造方法的时候,默认开辟的数组16*0.75=12大小,
存放null键的话肯定是放在第一位的
假设不为null 先执行
int hash = hash(key); 根据键计算出一个哈希值
int i = indexFor(hash, table.length);计算出放到哈希表的具体位置
//在哈希表中遵循的原则:
1)当两个对象equals相同,那么这两个对象hashcode相同
2)当两个对象equals不相同,这两个对象hashcode可以相同也可以不相同,最好是设置为不 同,这样会提高效率。
3)当两个对象的hashcode相同,那么两个对象的equals不一定相同
4)当两个对象的hashcode不相同,那么两个对象的equals一定不相同
TreeMap:
它底层是一个红黑树(平衡二叉树)的一种数据结构,默认会按照
键的自然顺序来进行排序,也就说要没比较的对象实现Comparable接口(实现compareTo),要么TreeMap的构造方法中添加Comparator接口的实现类对象(实现compare()方法).
此两个方法返回值为3个,小于0的放在节点的左侧,大于0的放在节点的右侧,相同的话,键所对应的值替换。
HashSet:
其实我们操作的是它底层维护的HashMap的键,值不用
TreeSet:
其实我们操作的是它底层维护的TreeMap的键,值不用
Collecions:它是一个类,内部提供了很多静态的工具方法用来专门对集合框架中的容器来进行操作,比如:排序,二分查找等
po一个简要区别:
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。 Collection是个java.util下的接口,它是各种集合结构的父接口。 List, Set, Map是否继承自Collection接口? List,Set是 Map不是 ArrayList和Vector的区别。 一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 HashMap和Hashtable的区别 一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 三.值:只有HashMap可以让你将空值作为一个表的条目的key或value 来源(http://luofeng113.javaeye.com/blog/219391)
阅读全文
0 0
- 集合框架反复蹂躏(一)
- 集合框架(一)
- 集合框架(一)
- 集合框架(一)
- 蹂躏
- Java集合(一)---Java集合框架
- 集合框架总结(一)
- java集合框架(一)
- 集合与框架(一)
- Java集合框架(一)
- 集合 反复器
- 全面接触Java集合框架(一)
- 第十二天(集合框架-续一)
- 黑马程序员--集合框架笔记(一)
- Java集合框架练习(一)
- 黑马程序员_集合框架(一)
- 集合框架(一)——概述
- 黑马程序员 集合框架(一)
- adb server is out of date. killing解决方案
- weblogic中删除自动部署项目
- synchronized 中的wait/notify 与 Condition 中的await/single的区别
- Redis事件
- springmvc application/octet-stream 问题
- 集合框架反复蹂躏(一)
- 计算机核心期刊排名及投稿信息
- Variation calling and annotation
- linux multipath设置及udev创建裸设备
- 短信还原默认设置
- 信息无限量,如何承接,提升自己
- 彻底理解PHP的SESSION机制
- Sublime Text 3 经典模式
- LeetCode 59 Spiral Matrix II