java.util包下的集合接口:
1.List
a.List集合的特点:
有序的,并且允许重复的数据存在,可以根据索引取值
b.常用的List集合框架:
ArrayList :数组集合 很像队列
Vector:线程同步(排队)
Stack
c.ArrayList与Vector的区别:
性能方面,ArrayList采取了线程异步处理方式,效率更高,而Vector则采取线程同步(排队)方式。
d.LinkedList表示的是一个链表的操作类,这个类不仅实现了List接口,同时也实现了Queue(队列操作)接口,即采用FIFO(先进先出)的方式操作,就像在排队,队头永远指向新加入的对象。
代码如下:
package 作业;
import java.util.LinkedList;
public class Test {
/**
* @param 测试LinkedList类
*/
public static void main(String[] args) {
LinkedList<String> link=new LinkedList<String>();
link.add("A");//向链表中添加数据
link.add("B");
link.add("C");
System.out.println("初始化链表"+link);//输出链表内容
link.addFirst("D");//在链表的表头增加内容
link.addLast("E");//在链表的表尾增加内容
System.out.println("增加之后的链表"+link);
System.out.println(link.element());//用element()方法找表头,输出
System.out.println(link);//找完之后的链表
System.out.println(link.peek());//用peek()方法找到表头,并且不删除
System.out.println(link);//找完之后的链表
System.out.println(link.poll());//找到并删除链表的头
System.out.println(link);//找完之后的链表
/**
* 用FIFO方式取出内容
*/
for(int i=0;i<link.size()+1;i++){
System.out.print(link.poll()+";");
}
}
}
2.Set
a.Set集合的特点:
无序的,数据不可重复,按值查找,所有重复的内容都靠hashCode()和equals()两个方法来区别。
b.常用的Set集合:
HashSet:迭代器操作,存放没有顺序 ,虽说是没有顺序,但是当输出的时候,按照一定的顺序,无论是什么类型的
迭代的意思:迭代输出就是将元素一个个进行判断,判断其是否有内容,如果有内容就将其取出
Iterator接口中的常用方法:
hasNext() 判断是否有下一个值
next()取出当前元素
LinkedHashSet:
TreeSet:有序的存放
Set接口的常用子类,HashSet,TreeSet。HashSet散列存放,TreeSet有序,但是TreeSet类排序说明:1,不能自定义类排序;2,需要指定顺序规则排序,验证代码:
package 作业;
import java.util.Set;
import java.util.TreeSet;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){//重写toString()方法
return "姓名:"+this.name+";年龄:"+this.age;
}
}
public class TreeSetDemo {
public static void main(String[] args) {
Set<Person> set=new TreeSet<Person>();
set.add(new Person("张三",30));
set.add(new Person("李四",33));
set.add(new Person("王五",35));
set.add(new Person("赵六",37));
set.add(new Person("孙七",38));
System.out.println(set);
}
}
会报错:
Exception in thread "main" java.lang.ClassCastException: 作业.Person cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at 作业.TreeSetDemo.main(TreeSetDemo.java:22)
所以必须要指定顺序,并且TreeSet中的每个对象所在的类都必须首先Comparable接口才可以正常使用,修正代码如下:
package 作业;
import java.util.Set;
import java.util.TreeSet;
/**
*
* 指定排列顺序
*
*/
class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){//重写toString()方法
return "姓名:"+this.name+";年龄:"+this.age;
}
public int compareTo(Person per){
if(this.age>per.age){
return 1;
}else if(this.age<per.age){
return -1;
}else{
return 0;
}
}
}
public class TreeSetDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
Set<Person> set=new TreeSet<Person>();
set.add(new Person("张三",30));
set.add(new Person("李四",33));
set.add(new Person("王五",35));
set.add(new Person("赵六",37));
set.add(new Person("孙七",38));
System.out.println(set);
}
}
怎样得到值?
根据key值取value,先得到Key的Set集合,用keySet()方法得到视图,这样才可以迭代输出所有的key,然后再用get()方法取得
c.常用的Map集合:
HashMap TreeMap HashTable LinkedHashMap
代码如下:
package 作业;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapTest {
/**
* @param args
*/
public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String>();
map.put("A", "wudi");
map.put("B", "zhuling");
map.put("C", "kejing");
map.put("D", "chenjingting");
String val=map.get("A");//根据key取出value
System.out.println("取出的内容是:"+val);
if(map.containsKey("B")){//查找指定的key是否存在
System.out.println("搜索的key存在");
}else{
System.out.println("搜索的key不存在");
}
/*输出全部的key*/
Set<String> keys=map.keySet();//得到全部的key
Iterator<String> iter=keys.iterator();//实例化Iterator
while(iter.hasNext()){
String str=iter.next();
System.out.println(str+"、");
}
/*输出全部的value*/
Collection<String> values=map.values();
Iterator<String> it=values.iterator();
while(it.hasNext()){
String st=it.next();
System.out.println(st+"、");
}
}
}
总的来说,三种集合接口的用法是基本一致的,只不过是每种方法可能不太一样,像Map取值的话,就要先用keySet()方法;像HashSet,取值的话,要先用迭代器。
另外:
Collection接口 Map与其是同一级的
只有List和Set是它的子接口
Queue<E>也是Collection的子接口
( <E>泛型 <>指定数据类型,不指定的话就可以是任何类型 )