首页 > 代码库 > Java集合

Java集合

##Java集合类概述  

Java集合类是一种工具类,用于存储不定长度的数据。Java集合可以大致分为Set,
List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、
重复的集合;而Map代表具有映射关系的集合。从Java5之后又增加了Queue体系集合,
代表一种队列集合实现。

集合类的出现是为了在编程时保存数量不确定的数据,以及具有映射关系的数据(也就是关系数组),
所以也称集合类为容器类。集合类都位于Java.util包下,
为解决线程并发问题Java5之后还在Java.util.concurrent包下提供了支持多线程的集合类。
其与数组不一样,数组元素可以保存基本数据类型的值,也可以是对象;而集合类只允许保存对象的引用变量。
Java中的集合类主要有两个接口派生:Collection和Map,Collection和Map是Java集合框架的根接口,
这两个接口又包含了一些子接口或实现类
  
##Collection
###List:元素是有序的,元素可以重复。因为该集合体系有索引。
ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
Set:元素是无序,元素不可以重复。
List:
特有方法。凡是可以操作角标的方法都是该体系特有的方法。  
增  
add(index,element);  
addAll(index,Collection);  
删  
remove(index);  
改  
set(index,element);  
查  
get(index):

listIterator();  
int indexOf(obj):获取指定元素的位置。  
ListIterator listIterator();  
List集合特有的迭代器。ListIterator是Iterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素。  
因为会发生ConcurrentModificationException(并发修改)异常。
所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,  
只能对元素进行判断,取出,删除的操作,
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。
该接口只能通过List集合的listIterator方法获取。  
LinkedList:特有方法:  
addFirst();
addLast();

getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException  
###Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
HashSet:底层数据结构是哈希表。是线程不安全的。不同步。  
HashSet是如何保证元素唯一性的呢?  
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
    /* 
    往hashSet集合中存入自定对象 
    姓名和年龄相同为同一个人,重复元素。去除重复元素 
    思路:1、对人描述,将人的一些属性等封装进对象 
      2、定义一个HashSet容器,存储人对象 
      3、取出 
 
    */  
    import java.util.*;  
  
    //人描述  
    class Person  {  
    private String name;  
    private int age;  
  
    Person(String name,int age) {  
        this.name=name;  
        this.age=age;  
        }  
  
    public String getName()  {  
        return name;  
        }  
  
    public int getAge()  
    {  
        return age;  
    }  
  
    public boolean equals(Object obj)  
    {  
        if(!(obj instanceof Person))  
            return false;  
        Person p=(Person)obj;  
        return this.name.equals(p.name)&&this.age==p.age;  
    }  
  
    public int hashCode()  
    {  
        return this.name.hashCode()+this.age;  
        }  
    }  
    class  HashSetTest  {  
    public static void main(String[] args)   
    {  
        HashSet h=new HashSet();  
        h.add(new Person("shenm",10));  
        h.add(new Person("shenm2",6));  
        h.add(new Person("shenm1",30));  
        h.add(new Person("shenm0",10));  
        h.add(new Person("shenm0",10));  
          
        getOut(h);  
  
        }  
  
    //取出元素  
    public static void getOut(HashSet h)  
    {  
        for (Iterator it=h.iterator(); it.hasNext(); )  
        {  
            Person p=(Person)it.next();  
            sop(p.getName()+"..."+p.getAge());  
            }  
        }  
  
    //打印  
    public static void sop(Object obj)  
    {  
        System.out.println(obj);  
         }  
    }    
###Map  
Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低  
HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。  
TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。  
1,添加。
put(K key, V value) 
putAll(Map<? extends K,? extends V> m) 

2,删除。
clear() 
remove(Object key) 

3,判断。
containsValue(Object value) 
containsKey(Object key) 
isEmpty() 

4,获取。
get(Object key) 
size() 
values() 

entrySet() 
keySet() 
注:HashMap集合可以通过get()方法的返回值来判断一个键是否存在,通过返回null来判断。
map集合的两种取出方式:  
1,Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。
所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
Map集合的取出原理:将map集合转成set集合。再通过迭代器取出。  
2,Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
而这个关系的数据类型就是:Map.Entry

Entry其实就是Map中的一个static内部接口。
为什么要定义在内部呢?
因为只有有了Map集合,有了键值对,才会有键值的映射关系。
关系属于Map集合中的一个内部事物。
而且该事物在直接访问Map集合中的元素。

Java集合