集合
集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下
Collection接口是集合的根接口,没有蹄冻这个接口的直接实现类,但是却又其让其被继承的长 生的两个接口就是set与list 。Set中不能包含重复的元素。List是一个有序的集合
List 有序 可重复的
List里存放的对象是有序的,同时也是可以重复的,list
关注的是索引,拥有一系列和索引相关的方法,查询速度快
因为是会伴随这后面数据的移动,所有插入删除数据速度慢
Set 无序 不能重复
Set是无序的 不能重复的,集合中的对象不按特定的方式排序,只是简单的把对象加入 集合中
Arraylist 和 linked list 区别
Arraylist与linkedlist在用法上没有区别,但是在功能上还是有区别的,linkedlist经常用 在增删操作较多而查询很少的情况下,arraylist则相反
Map 是java。Util包中的另一个接口,它是collection接口没有关系,是互相独立的,但是都属于集合的一部分。Map包含了Key-value对,map不能包含重复的key,但是可以包含相同的value
Map 键值对 建唯一 值不唯一
Map集合中存储的是键值对,建不能重复,值可以重复,根据建得到值,对map集合遍历时先得到建的set集合,对set集合进行遍历,得到相应的值
Map集合
实现类:HashMap Hashtable LinkedHashMao 与 TreeMap
HashMap类
HashMap类是最常见的map集合,他是根据建得HashCode存储数据的,根据建可以直 获取它的值,具有很快的访问速度,在遍历的时候,获取数据的顺序是完全随机的,因 为建不可以重复,所以HashMap最多只允许一条记录为mull,允许多条记录的值为Null
是不同步的
Hashtable 类
Hashtable 与 HashMap类似,是HashMap的线程安全版,他支持线程的同步,即任意 时刻只有一个线程写Hashtable,因此也导致了Hashtable在写入的时候会比较慢,他继 承自Dictionary类,不同的是它不允许记录的键或者值为null,同时效率较低。
ConcurrentHashMap 类
线程安全的,并且是锁分离。ConcurrentHashMap 内部使用段(Segment)来表示这些 不同的部分,每个段其实就是一个小时的hash table 他们有自己的锁,只要修改多个 操作发生在不同的段上,他们就可以并发进行。
LinkedHashMap 类
LinkedHashMap保存了记录的插入顺序,用在lteraor遍历linkedHash
Map时先得到记录肯定是先插入的,在比遍历的时候会比HashMap慢,有HashMap的 全部特征。
TreeMap 类
TreeMap实现SortMap接口,能狗把他保存的记录根据建排序,默认是按键值的升序 序(自然排序),也可以指定排序的比较器,当用lierator 遍历TreeMap,得到的记录时 排过序的,不允许key值为空
Map的遍历
KeySet()
将map中所有的建存入set集合中,,因为set
具备迭代器,所有可以迭代方式取出所有的建,再根据get方法,获取每一个建对应的 值。Keyset();迭代后只能通过gat()获取key。
取到的结果会乱序,因为取得数据行主键的时候,使用了HashMap.keyset()方法,而这 个防范返回的set结果,里面的数据是乱序排放的。
用法:
Map map = new HashMap();
Map.put(“key1” , ”lisi1”);
Map.put(“key2” , ”lisi2”);
Map.put(“key3” , ”lisi3”);
Map.put(“key4” , ”lisi4”);
//先获取mao集合的所有键的set集合,keyset()
Lterator it = map.keyset().iterator();
//获取迭代器
While(it.hasNext()){
Object key =it.next();
System.out.println(map.get(key));
}
entrySet()
Set<Map.Entry<K,V>>entrySet() //返回此映射中包含的映射关系的set视图。(一个关系 就是一个建-值对),就是把(key-value)作为一个整体一对一地存放到set集合中。 Map.entry表示映射关系。Entryset(); 迭代后可以e.getKey(). e.getValur()两种方法来取 key和value。返回的是entry接口;
用法:
Map map = new HashMap();
Map.put(“key1” , ”lisi1”);
Map.put(“key2” , ”lisi2”);
Map.put(“key3” , ”lisi3”);
Map.put(“key4” , ”lisi4”);
//将map集合中的映射关系取出,存入到set集合
Lterator it = map.entrySet().iterator();
While(it.hasNext){
Entry e = (Entry)it.next();
System.out.println(“键”+e.gatKey()+”的值为”+e.getValue);
}
推荐使用第二种方法,及entryset()方法,效率高。
Lterator 类所有的集合类,都实现了lterator接口,这是一个用于遍历集合中的接口,在只要包 含下面的三种方法
HasNext()是否还有下一个元素。
Next() 放回下一个元素
Remove() 删除当前元素
Lteror:迭代输出,时使用最多的输出方式。
Listiterator 是lterator的子接口,专门用于输出list中的内容。
Foreach输出,jdk1.5之后提供的新功能,可以输出数组或集合。
Vector 与 ArrayList
1, Vector是线程同步的,所有他是安全的,而arraylist是线程异步的,是不安全的 如果我 们不考虑到这个线程安全的因素的问题的话,一般用arraylist效率比较高
2, 如果考虑到集合中的元素的数目大于目前聚合数组的长度时,vector增长率为目前数组 长度的100%而arraylist增长率为目前数组长度的50%,如果在集合中使用数据量比较 大的数据,用vector有一定的优势。
3, 查找一个指定数据或者频繁的访问数据 这个时候Vector与arraylist都可以 Vector
使用了synchronized方法 线程安全,所以性能上要比arraylist要差,linkedlist使用双向 链表实现存储,所以插入数据比较快
Arraylist 和 linkedlist
1, Arraylist是实现了基于鼎泰数组的数据结构,linkedlist是基于链表的数据结构
2, 对于随机访问get和set,Arraylist觉得优于linkedlist,因为linkedlist要移动指针
3, 对于新增和删除操作add和remove,linedlistbi'jiao比较占优势,因为arraylist要移动数 据,这一点要看实际情况,若只对单条数据插入或删除,arraylist的速度而优于linkedlist
但若是批量随机的插入删除数据,linkedlist的速度要大于arraylist每插入一条数据要移 动插入点及之后的所有数据
Hashmap与treemap
1, Hashmap通过hashcode对其内容进行快速查找,而treemap中所有的元素都保持这某种 固定的顺序,如果你需要得到一个有序的就应该使用treemap,hashmap是无序的
2, 在map中插入,删除和定位元素,hashmap是最好的选择,但如果您要按自然顺序或自 定义顺序遍历键,那么treemap会更好,使用hashmap要求添加的键类声明确定定义了 hashcode()和equals();
3, 两个map中的元素一样,但是顺序不一样,导致hashcode()不一样。
测试:
在hashmap中,同样的值map顺序不同,equals时 false;
在treemap中,同样的值map,顺序不同,equals时,true,说明,treemap在equals() 时时整理了顺序了的。
Hashtable线程与hashmap
1, 同步性:hashtable时线程安全的,也就是说时同步的,而hashmap是线程不安全的,不 是同步的。
2, Hashmap允许存在一个为nulll的key,多个为null的value
3, Hashtable的key和value都不允许为null;