集合

 

集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下

 

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类是最常见的map集合,他是根据建得HashCode存储数据的,根据建可以直 获取它的值,具有很快的访问速度,在遍历的时候,获取数据的顺序是完全随机的,因 为建不可以重复,所以HashMap最多只允许一条记录为mull,允许多条记录的值为Null

是不同步的

Hashtable 与 HashMap类似,是HashMap的线程安全版,他支持线程的同步,即任意 时刻只有一个线程写Hashtable,因此也导致了Hashtable在写入的时候会比较慢,他继 承自Dictionary类,不同的是它不允许记录的键或者值为null,同时效率较低。

线程安全的,并且是锁分离。ConcurrentHashMap 内部使用段(Segment)来表示这些 不同的部分,每个段其实就是一个小时的hash  table 他们有自己的锁,只要修改多个

LinkedHashMap保存了记录的插入顺序,用在lteraor遍历linkedHash

Map时先得到记录肯定是先插入的,在比遍历的时候会比HashMap慢,有HashMap的

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接口,这是一个用于遍历集合中的接口,在只要包   含下面的三种方法

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;