黑马程序员 7 集合容器(List&Set)

 

基本操作:增删改查(判断)

结构
Collection
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍
慢。线程不同步。
|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不
同步。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
|--Set:元素是无序,元素不可以重复。
|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素hashcode
和equals方法。
|--TreeSet:可以对Set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据:compareTo方法return 0.
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
也种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。

 

Collection定义了集合框架的共性功能。
1,添加
add(e);
addAll(collection);
2,删除
remove(e);
removeAll(collection);
clear();
3,判断。
contains(e);
isEmpty();
4,获取
iterator();
size();
5,获取交集。
retainAll();
6,集合变数组。
toArray();

======================================================
List:
特有方法。凡是可以操作角标的方法都是该体系特有的方法。


add(index,element);
addAll(index,Collection);

remove(index);

set(index,element);

get(index):
subList(from,to);
listIterator();
int indexOf(obj):获取指定元素的位置。
ListIterator listIterator();
=============================================================

List集合特有的迭代器。ListIterator是Iterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。

所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作,
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。

该接口只能通过List集合的listIterator方法获取。

import java.util.*;

public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList<String> a =  new ArrayList<String>();
        a.add("1");
        a.add("2");
        a.add("3");
        a.add("4");
        ListIterator<String> li = a.listIterator();
        while(li.hasNext()){
            String str = li.next();
            System.out.println(str);
            if(str.equals("2")) li.add("2_1"); //在2后面插入2_1
            if(str.equals("3")) li.remove();   //移除3    
            if(str.equals("4")) li.set("5"); //把4改成5        
        }
        System.out.println(a);
    }
}

==============================================================
LinkedList示例

//用Linkedlist 模拟堆栈
import java.util.LinkedList;

public class LinkedListDemo {
    public static void main(String[] args) {
        Stack<Integer> s = new Stack<Integer>(new LinkedList<Integer>());        
        s.push(1);
        s.push(2);
        s.push(3);
        s.push(4);
        System.out.println(s.pop());
        System.out.println(s.pop());
        System.out.println(s);
    }
}

class Stack<T>{
    private LinkedList<T> list;
    Stack(LinkedList<T> list){
        this.list = list;
    }
    public void push(T data){
        list.addLast(data);
    }
    public T pop(){
        return list.removeLast();   //返回并移除最后的元素
    }
    @Override
    public String toString(){
        return list.toString();        
    }    
}

=================================================
HashSet判断元素相同 例

import java.util.*;
/*
往hashSet集合中存入自定对象
姓名和年龄相同为同一个人,重复元素。
*/
public class HashSetTest 
{
    public static void main(String[] args) 
    {
        HashSet hs = new HashSet();

        hs.add(new Person("a1",11));
        hs.add(new Person("a2",12));
        hs.add(new Person("a3",13));
        hs.add(new Person("a2",12));
        Iterator it = hs.iterator();
        while(it.hasNext())
        {
            Person p = (Person)it.next();
            System.out.println(p.getName()+"::"+p.getAge());
        }
    }
}
class Person
{
    private String name;
    private int age;
    Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    
    public int hashCode()
    {
        System.out.println(this.name+"....hashCode");
        return name.hashCode()+age*37;      //防止出现name和age都不同,但是

name.hashCode()+age相同的情况。37可以是其他整数
    }

    public boolean equals(Object obj)
    {
        if(!(obj instanceof Person))
            return false;
        Person p = (Person)obj;
        System.out.println(this.name+"...equals.."+p.name);
        return this.name.equals(p.name) && this.age == p.age;
    }
    
    public String getName()
    {
        return name;
    }
    public int getAge()
    {
        return age;
    }
}

 

==========================================
TreeSet
对类实现Comparable接口进行顺序判断

import java.util.TreeSet;

public class TreeSetDemo {
    public static void main(String[] args) {
        TreeSet<Person> ts = new TreeSet<Person>();
        ts.add(new Person("c",10));
        ts.add(new Person("a",10));
        ts.add(new Person("b",10));
        System.out.println(ts);
        
    }
}

class Person implements Comparable<Person>{
    private String name;
    private int age;
    Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public int compareTo(Person p){
        if(this.name == p.name)
            return new Integer(this.age).compareTo(new Integer(p.age));
        else return this.name.compareTo(p.name);
    }
    public String toString(){
        return name +"的年龄是"+age;
    }
}

 

使用自定义的比较器进行顺序判断

import java.util.*;

public class TreeTest {
    public static void main(String[] arg){
        TreeSet<String> ts = new TreeSet<String>(new StrLenComparator());
        ts.add("100");
        ts.add("dadadadad");
        ts.add("a");
        ts.add("cdd");
        ts.add("d");
        Iterator<String> it = ts.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }    
        System.out.println(ts);
    }
}

class StrLenComparator implements Comparator<String>{
    @Override
    public int compare(String s1,String s2){
        int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
        if(num == 0) return s1.compareTo(s2);
        return num;
    }
}

 

posted @ 2012-10-20 18:04  EnderViking  阅读(141)  评论(0)    收藏  举报