您的位置:首页 > 职场人生

黑马程序员_Java集合-Collection<T>接口

2011-11-23 14:40 501 查看
----------------------
android培训、java培训、期待与您交流! ----------------------

所谓的集合就是指 一个长度可以变化的类似于(或等于)数组的东西。

 Collection<T>接口有两个子接口:List<T>和Set<T>

1.List

 List接口及其子类最大的特点就是允许元素重复。
·  List接口中最常见的三个子类:
      ArrayList<E>  此类最最常用。
      Vector<E>
      LinkedList<E>
ArrayList<E>
常用方法举例:
1.add()增加元素
import java.util.*;public class ArrayListDemo {    public static void main(String[] args){       List<String> array = new ArrayList<String>();       array.add("Hello World");  // 在最后增加元素       array.add("世界,你好!");       array.add("Hello World");       array.add(0,"cxy");   //在指定位置增加元素  下标从0开始       System.out.println(array);  // ArrayList类已经重写了toString方法    }
}

2.remove()删除元素
  import java.util.*;public class ArrayListDemo {    public static void main(String[] args){       List<String> array = new ArrayList<String>();       array.add("Hello World");         array.add("世界,你好!");       array.add("Hello World");       array.remove(2);  // 指定位置删除  下标从0开始       array.remove("世界,你好!");  //指定元素删除        array.clear();  //删除所有元素       System.out.println(array);       }
}  
 
·  使用remove()方法删除元素时  会拿指定的元素依次从集合第一个元素开始比较 如果比较的结果相同 可就删除该元素。 比较的时候会调用equals()方法·  因为在String类中重写了此方法 所以可以找到并成功删除。·  但是如果是用户自定义类的匿名对象在没有重写equals()方法的前提下 就无法删除这个匿名对象了。
equals()方法的重写:
  public class Person {    private String name;    private int age;    public Person(String name, int age){       this.name = name;       this.age =age;    }    public boolean equals(Object obj){       if(this == obj)           return true;       if(!(obj instanceof Person))           return false;       Person temp = (Person) obj;       if(this.name.equals(temp.name) && this.age == temp.age)           return true;       return false;    }

这样就可以把person的对象删除了。

3.get()得到指定下标的元素:
import java.util.*;public class ArrayListDemo {    public static void main(String[] args){       List<String> array = new ArrayList<String>();       array.add("Hello World");         array.add("世界,你好!");       array.add("Hello World");       for(int i=0; i<array.size(); i++)  // size()得到当前集合中元素个数           System.out.print(array.get(i)+"、");  //获得指定位置上的元素    }}4.toArray()转成数组:
import java.util.*;public class ArrayListDemo {    public static void main(String[] args){       List<String> array = new ArrayList<String>();       array.add("Hello World");         array.add("世界,你好!");       array.add("Hello World");//转换成指定数据类型的数组       String[] str = array.toArray(new String[]{});        for(String s : str)           System.out.print(s+"  <-->  ");    }
}Vector<E>
Vector<E>的用法和ArrayList<E>用法一样,他们的区别在于Vector<E>是线程安全的。 
所谓的线程安全就是指所有的方法都是用synchronized修饰。使用此关键字修饰的方法同一时间只能被一个线程访问 其他线程必须等待 因此就造成程序执行时间较长的缺点。  正因为此 才说Vector类效率低 且是同步操作。 只有在一些对安全性要求高的场合下才考虑使用Vector类。 LinkedList<E> LinkedList<E> 类表示一个链表类。 它实现了Queue< E >接口。用法举例:import java.util.LinkedList;public class LinkedListDemo {    public static void main(String[] args){       LinkedList<String> line = new LinkedList<String>();       line.add("No.1");   //在表尾增加元素       line.add(0,"No.2"); //在指定位置增加元素       line.push("No.5");     //在表头增加元素       line.addFirst("No.3"); //在表头增加元素       line.addLast("No.4");  //在表尾增加元素       System.out.println(line);       System.out.println("只查看表头:"+line.getFirst());       System.out.println("查看并删除表头:"+line.pop());       System.out.println("只查看表头:"+line.peek());       System.out.println("只查看表尾:"+line.getLast());       System.out.println("查看并删除表尾:"+line.remove(line.size()-1));       String[] array = line.toArray(new String[]{});       for(String str : array)           System.out.print(str+"  ");    }
}  ArrayList其实代表一个数组 数据存储在一片连续的空间。 数据量小时使用此类。
LinkedList是代表链表 数据分散存储在内存中的各个角落。 数据量稍大时使用此类。
 Set<E>接口
·  set接口及其子类最大的特点就是不允许元素重复。

·  set接口中最常见的两个子类:    1. HashSet< E > :无序排列 但是可以高速存取。    2. TreeSet< E > : 自动排序。 HashSet<E>如果想完整的使用HashSet<E>类 那么最少要重写equals()和hashCode()方法。 重写hashCode()  用于获得元素的存储位置。 重写equals() 用于在两个元素的位置相同的时候 比较两个元素是否相等。
   范例:重写hashCode().
   
public int hashCode(){       return this.name.hashCode()*age-age/100;    }
内容胡乱写就可以,前提是两个不同对象的hashCode返回值不同就可以。

HashSet的一个特性:元素存储位置是由元素的hash码来确定的。它是无序存放的。 TreeSet< E >和HashSet相比,此类多了一个自动排序的功能。  但是 TreeSet的自动排序功能是有条件的:    TreeSet<T> 中的 T 必须是实现了Comparable<T> 接口。    否则 程序运行时抛异常。范例:在Person类中实现Comparable<T>接口并重写方法。public int compareTo(Person arg0) {       if(this.age>arg0.age)           return 1;       else if(this.age<arg0.age)           return -1;       else{           return this.name.compareTo(arg0.name);       }    }   如果compareTo()方法返回0 则意味着正在比较的2个对象相等。 而两个对象相等在Set中是不允许出现的。 因此 重写compareTo()方法时 要将对象的所有字段都进行比较。 要保证只有在两个对象的各个属性的值都相同的情况下才返回0。否则就返回1或-1。 集合的输出范例1:Iterator遍历集合import java.util.*;public class Demo{    public static void main(String[] args){       Collection<String> array = new ArrayList<String>();       array.add("No.45");       array.add("No.15");       array.add("No.23");       array.add("No.14");       array.add("No.65");       array.add("No.12");       Iterator<String> iter = array.iterator();       while(iter.hasNext()){           System.out.println(iter.next());       }    }
} 范例2:使用foreach遍历集合
import java.util.*;public class Demo{    public static void main(String[] args){       List<String> array = new ArrayList<String>();       array.add("No.45");       array.add("No.15");       array.add("No.65");       for(String str : array)           System.out.println("☆"+str+"☆");    }
}

----------------------
android培训、java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息