集合类

来源:互联网 发布:派派辅助软件 编辑:程序博客网 时间:2024/06/11 09:29

集合类


 

1.有一个总的接口叫做collection,下面有两个继承了它的子接口是Set接口和List接口还有Queue。List接口的特点就是元素存入集合的顺序和取出的顺序一致,元素有索引,元素可以重复。而Set接口的特点是存入和取出的顺序可能不一致,不可以重复存储元素,必须保证元素的唯一性。

2.Map是java.util包中的另一个接口,它和Collection接口没有关系,是互相独立的,但是都属于集合类的一部分。map包含了key-value对。Map不能包含重复的key,但是可以包含相同的value。

3.Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方式:

1.hashNext()是否还有下一个元素。

2.next()返回下一个元素

3.remove()删除当前的元素


4.首先先介绍一下List接口,它有两个实现类分别是ArrayList和LinkList。ArrayList底层的数据结构是数组,线程不同步,ArrayList替代了Vector,查询的速度很快。LinkList底层的数据结构是链表,线程不同步,增删元素的速度特别快。Vector底层的数据结构就是数组,线层同步,Vector无论是查询还是增删都巨慢。List有专门的接口ListInterator来遍历集合中的元素,这个接口是继承了Iterator接口,覆盖了它的所有方法。

5.然后介绍一下set接口,Set接口有两个子接口分别是SortedSet和AbstractSet接口,其中AbstractSet接口有两个实现类分别是HashSet和TreeSet其中TreeSet还继承了SortedSet接口。6.HashSet底层数据结构是哈希表,线程是不同步的,无序,高效。HashSet集合保证元素的唯一性,通过元素的hashCode方法和equals方法完成的。当元素的hashCode值相同的时候,才继续判断元素的equals是否为true。如果为true,那么视为相同的元素,不存。如果为false,那么存储。如果hashCode值不同,那么不判断equals,从而提高对象比较速度。HashSet还有一个子类LinkedHashSet继承了它。这个子类是有序的。

7.TreeSet是对Set集合中的元素进行指定顺序的排序。不同步。TreeSet底部的数据结构就是二叉树。TreeSet用于Set集合进行元素的制定顺序排序,排序需要根据元素自身具备的比较性。如果元素不具备比较性,在运行时会发生ClassCastException异常,所以需要实现Comparable接口,强制让元素具备比较性,复写compareTo方法。根compareTo方法的返回值,确定元素在TreeSet数据结构中的位置。TreeSet方法保证了元素的唯一性的方式就是参考比较的结果是否为0,如果return 0,视为两个对象重复,不存。

TreeSet集合排序有两种方式,Comparable和Comparator:

Comparable:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖comparato方法

Comparator:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖了compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造器

8.上面我们已经说明了一个叫做哈希表的概念。现在我们来解释一下哈希表的原理:对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值,称为哈希值。哈希值就是这个元素的位置,如果哈希值出现冲突,再判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就存储,在原来对象的哈希值基础+1顺延。存储哈希值的结构,我们称为哈希表。既然哈希表是根据哈希值存储的,为了提高效率,最好是保证对象的关键字是唯一的,这样可以尽早的判断关键字对应的对象是否相同,提高了哈希表的操作效率。

9.Map集合:Map是一个接口,它有两个子接口分别是AbstractMap和SortedMap,AbstractMap有五个实现类,HashMap,WeakHashMap,HashTable,IdentityHashMap,TreeMap.其中Hashtable底层是哈希表数据结构,是线层同步的。不可以存储null键,null值。HashMap:底层是哈希表数据结构,是线程不同步的,可以存储null键,null值,替代了Hashtable.TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。

package jj;


import java.util.Collection;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

import java.util.TreeSet;


public classss {

publicstatic voidmain(String[]args){

Setset = newHashSet();

set.add("scacs");

set.add("addddd");

set.add("dddd");

Iteratori =set.iterator();

while(i.hasNext()){

System.out.println(i.next());

}

Setset1 = newTreeSet(set);

System.out.println(set1);

pastedGraphic.png



想要获取map中所有的元素,因为map中是没有迭代器的,collection具备迭代器,只要将map转化为set集合,就可以使用迭代器了,之所以转化为set,是因为map集合具备着键的唯一性,其实set集合就是来自于map,set集合底层其实用的就是map方法。

将map转化为set的方法:

可以将map集合中的键都取出存放到set集合中。对set集合进行迭代。迭代完成,再通过get方法对获取到的键进行值的获取。

1.Set keySet = map.keySet();

Iterator it = keySet.iterator();

while(it.hashNext()){

Object key = it.next();

Object value = map.get(key);

System.out.println(key+”:”+value);

}

entry就是map接口中的内部接口,是访问键值关系的入口,是map的入口,访问的是map中的键值对

2.Set entrySet = map.entrySet();

Iterator it = entrySet.iterator();

while(it.hashNext()){

Map.Entry me = (Map.Entry)it.next();

System.out.println(me.getKey()+”:”+me.getValue());

}

java Map及Map.Entry详解:

Map是java中的接口,Map.Entry是Map的一个内部接口。Map提供了一些常用的方法,如keySet(),entrySet()等方法。

KeySet()方法返回值是Map中的key值的集合;

entrySet()返回值也是返回一个Set集合,此集合的类型为Map.Entry

Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>.他表示Map中的一个实体(一个key-value对)。接口中有gettKey(),getValue()方法


使用集合的技巧:

看见Array就是数组结构,有角标,查询速度很快。

看到link就是链表结构,增删速度很快,而且有特定的方法,addFirst,addLast,removeFirst(),removeLast();getFirst(),getLast()

看见hash就是哈希表,就是想要哈希值,就想到唯一性,就想到存入到该结构中的元素必须覆盖hashCode,equals方法

看见tree就是树,就要想到排序,就要想到用比较。

比较的两种方式:

Comparable:覆盖compareTo方法

Comparator:覆盖compare方法

LinkedHashSet,LinkedHashMap这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序。

集合什么时候用?

当存储的是一个元素的时候,就用collection。当存储对象之间存在映射关系的时候,就用map集合。

保证唯一就用set,不保证唯一就用list。

Collections:它的出现给集合操作提供了更多的功能,这个类不需要创造对象,内部提供的都是静态方法。

Collections.sort(list);//list集合进行元素的自然顺序排序

collections.sort(list,new ComparatorByLen())按指定的比较器方法排序。

class ComparatorByLen implements Comparator<String>{

public int cimpare(String s1,String s2){

int temp = s1.length() - s2.length();

return temp =()?s1.compareTo(s2):temp;

}

}

Collection.max(list);

int index = Collection.binarySearch(List,”zz”);二分法查找,返回角标

Collections.reverseOrder();逆向反转排序

Collections.shuffle(liat)随机对list中的元素进行位置的置换


将非同步集合转换为同步集合的方法:Collections 中的xxx synchronized(xxx);

List synchronized(list);

Map synchronized(map);

原理:定义一个类,将集合中的所有的方法加同一个锁以后返回