---------------------- 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培训、期待与您交流! ----------------------