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 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集合中的元素。

posted on 2017-02-13 19:57  Tony_Xu1206  阅读(95)  评论(0)    收藏  举报

导航