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

来源:互联网 发布:苹果电脑怎么删除软件 编辑:程序博客网 时间:2024/05/16 12:22

---------------------- 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

原创粉丝点击