集合类
集合类
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 class ss {
public static void main(String[] args) {
Set set = new HashSet();
set.add("scacs");
set.add("addddd");
set.add("dddd");
Iterator i = set.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
Set set1 = new TreeSet(set);
System.out.println(set1);
想要获取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);
原理:定义一个类,将集合中的所有的方法加同一个锁以后返回