为什么要用集合?
在我理解集合就是为了方便java操作多个对象,如何存储这些对象或变量,那么就要一个容器了,这里就说出了集合是什么了,集合就是一个容器,这个容器可以装很多其他的数据(Collection(根类))。
那么数组、StringBuffer、StringBuilder也是容器,他们有什么不同?
数组可以装很多数据但是容量一定,不能扩容而且只能保存相同类型的元素 StringBuffer 和StringBuilder提供一个append()和insert()方法可以往容器对象添加字符串(可以理解为只能加字符串的容器)
Collection可以扩容不同指定长度 集合没有指定泛型之前,默认保存的是任意类型的元素(Object类型)指定泛型后,可以保存对应类型的元素。
我学习的集合框架如图:
java集合浅析
Collection接口:
Set:元素无序的、不可重复的集合
List:元素有序,可重复的集合
Map接口:具有映射关系“key-value对”的集合
java集合浅析
Collection接口的特点和使用
创建:
Collection 对象名=new ArrayList();//初始容量为10的空列表 List有序的允许数据重复
使用:
对象名.功能();
如:c2.add(“1”);
Collection类的成员方法
boolean addAll(Collection c);添加一整个集合 若有相同元素依旧添加进去而不是覆盖因为ArrayList允许重复
boolean removeAll(Collection c);删除一整个集合 删除与c2相同的元素
boolean containAll(Collection c);判读是否包含一整个集合的元素
boolean retainAll(Collection c);求两个集合的交集
boolean add(E e)添加一个元素 E:泛型即规定是什么类型 可以理解成object
boolean remove(object o)删除一个元素 删除成功true 失败false
void clear()清空元素
boolean contains(Object o)包含
boolean isEmpty()判空
int size()集合中的元素 集合中长度是size不是length();
数组长度:length;
字符串的长度:length(属性);
ArrayList中add的返回值
public boolean add(E e){
ensureCapacityInternal(size+1);
elementData[size++]=e;
return true;只要上面的代码不报异常就永远返回true
}
等等
那么他怎么遍历?
他是用迭代器进行的, Iterator迭代器:做遍历读取,或修改即更新但修改地址没有效果(不建议),不做添加、删除元素每次遍历系统都会检查有多少个元素,若执行了添加或删除会与检查到元素个数不同故会系统报错,若要执行删除,应使用迭代器本身有点删除
如:iterator.remove();
方法一:
java集合浅析
大概方法如图:
java集合浅析
方法二:
java集合浅析
LIST接口和SET接口的实现方法其实都与collection相似,因为他们都是collection的接口所以使用方法基本一致。
这里可以说说LIST接口和SET接口的区别:
List有序的可重复 元素在插入时会有个索引所以说有序的
List有特有的增删改查(跟collection差不多)
List接口的实现类:ArrayList、vector、LinkedList
多了个previous(上下移动)详见java代码List4
SET无序不重复 treeset不允许有NUll,hashset底层是个哈希表。
Treeset要配合comparator使用。
总结:
允许重复:list
线程安全问题:vector
不考虑线程安全问题:LinkedList(增删多)
ArrayList(改查多)
不允许重复:set
不需要排序:HashSet
需要插入和取出的顺序一致:LinkedhashSet
需要排序:TreeSet
其实collection还有很多内容比如list接口跟set接口下的分支ArrayList、vector、Linkedlist、Hashset等等这里只做个大概的总结。
当然还有MAP,这里总结的说下MAP,Map实际上是保存了一组key-value的映射关系(称为双列集合)不能包含重复的键,如图示,每一个键至多映射到一个value(一一对应,但是值可以重复)。
Map的遍历:Map没有iterator,不用iterator迭代遍历。可用entrySet(返回所有映射关系的集合)
Keyset原理,因为map都是键值对的映射,所以通过调用keyset拿到所有的键再用get(key)的方法根据键拿到值。
说说主要的HAshmap,他在jdk8以后底层结构基本都是数组+链表+红黑树,为什么红黑树,因为他查找快好像是O(log N)链表的特点是查找不快但增删快,所以才有这么个结构。他是一个基于哈希表的实现(相当于一个大数组),有map接口的方法,允许NULL值NULL键,Hashtable线程安全,hashmap线程不安全。Hashmap的初始容量为16,加载因子loadfactor
(0.75)比较合适(即填入的元素16*0.75),太满查找效率降低,太低存储效率低,所以0.75是查找和存储的平衡。当数量达到加载因子时重新整理哈希表,即重新排列或扩容(可能)。
Hashtable(不怎么用 都是与hashmap做对比)底层结构:哈希表同HashMap
Hashtable table =new Hashtable();创建
Table.put(“”,值);与hashmap相似,但是不能允许有NULL键和NULL值
HashMap和Hashtable的对比:
底层结构 版本 线程安全(同步) 允许NUll键NULL值
HashMap 哈希表 1.2 不安全 允许
Hashtable 哈希表 1.0 安全 不允许
第一次写希望自己理解写的没什么太大问题 有的指出修改哈哈哈哈哈哈哈哈

相关文章: