1.List本身属于一个接口,要想取得接口的实例化对象,那么应该通过子类实例化接口,它有两个常用子类:
ArrayList【数组实现,查询快,增删慢,线程不安全,轻量级】、 Vector【数组实现,线程安全,重量级 】。
1.1 List接口中,get()方法非常重要
List<String>all=new ArrayList<String>(); all.add("hello");//List是有序列表,允许存放重复的元素 all.add("hello"); all.add("world";) for(int x=0;x<all.size();x++){ String str=all.get(x); Sysout.out.println(str); }
1.2 List接口中提供有contains()、remove()的操作方法,这两个方法都需要实现equals()方法。
public class TestList { public static void main(String[] args) { List<Dept>list=new ArrayList<Dept>(); list.add(new Dept(10,"财务部","Beijing")); list.add(new Dept(20,"技术部","Shenzhen")); list.add(new Dept(30,"财务部","HongKong")); list.remove(new Dept(30,"财务部","HongKong")); for(int x=0;x<list.size();x++){ Dept d=list.get(x); System.out.println(d); } } } class Dept{ private int dno; private String dep; private String loc; public Dept(int dno,String dep,String loc){ this.dno=dno; this.dep=dep; this.loc=loc; } @Override //如果没有覆写equals操作,将删除(第8行)不了。 public boolean equals(Object obj) { // TODO Auto-generated method stub if(this==obj)return true; if(obj==null)return false; if(!(obj instanceof Dept))return false; Dept dept=(Dept)obj; return this.dno==dept.dno&&this.dep.equals(dept.dep)&&this.loc.equals(dept.loc); } @Override public String toString() { // TODO Auto-generated method stub return "编号"+this.dno+" 部门:"+this.dep+" 地点:"+this.loc; } }
1.3 一个面试题:ArrayList与Vector的区别。
1.4 LinkedList是一个真正的链表实现类,其功能比ArrayList更加丰富,但大部分使用不到。(附一张重要的图)。
2. Set是Collection的一个接口,里面的数据不允许出现重复,允许使用null。它有两个重要的子类,HashSet(无序)、TreeSet(有序)。一般使用HashSet。
只要在java中牵扯到一组对象的比较操作永远都使用Comparable接口来完成。
public class TestTreeSet { public static void main(String[] args) { Set<Person>set=new TreeSet<Person>(); set.add(new Person("wa",20)); set.add(new Person("xi",10)); set.add(new Person("li",10)); System.out.println(set); } } class Person implements Comparable<Person>{ private int age; private String name; public Person(String name,int age){ this.age=age; this.name=name; } @Override /* * 当年龄相同时,后面的对象会覆盖掉前面的。所以compareTo()方法不能像之前那样写 * return this.age-o.age; */ public int compareTo(Person o){ if(this.age>o.age)return 1; if(this.age<o.age)return -1; else return this.name.compareTo(o.name); } @Override public String toString() { // TODO Auto-generated method stub return "名字:"+this.name+" 年龄:"+this.age; } }
2.2 关于重复元素的说明
对于使用Comparable消除重复元素,只适合于TreeXxx类型的集合。大部分类型的集合,消除重复元素是利用Object类中的两个方法来完成。
取得hash码: public int hashCode()
对象比较:public boolean equals(Object obj)
(PS:知道即可,开发中很少使用。)
3. Map
3.1 几个常见方法:
public V put(K key,V value)
public V get(Object key)
public Set<K> keySet() //返回Map中所有的key,key不能重复
public Set<Map.Entry<K,V>> entrySet() //将map转换为Set集合
3.2 在Map接口中有两个重要的子类,HashMap、HashTable。
Map几乎不需要进行排序,因为Map集合的目的不是输出,而是查询。如果在Map集合中使用了重复的key保存,将使用新的内容替换旧的的内容。
在HashTable集合之中key或者是value都不允许保存null,会出现NullpointException。
在HashMap中允许key或者value为null。
在Map接口下还存在一个TreeMap子类,这个子类保存的数据可以实现key的排序操作。它的value可以保存null,key不能保存null,因为排序依靠key。
3.3 Map.Entry
是一个内部类 public static interface Map.Entry<K,V>,要想用Iterator输出Map集合的数据,首先要解决的问题就是Map.Entry接口的定义。
Map接口基于Iterator输出的步骤:
1)利用Map接口中的entrySet()方法将Map集合变为Set集合;
2)Set集合中定义有iterator()方法,可以为Iterator接口实例化;
3)利用Iterator接口的迭代输出,找出每一个Map.Entry接口对象,并且利用getKey()、getValue()输出数据。
Set<Map.Entry<Integer,String>>set=map.entrySet(); Iterator<Map.Entry<Integer,String>>iter=set.iterator(); while(iter.hasNext()){ Map.Entry<Integer,String>me=iter.next; System.out.println(me.getKey()+" "+me.getValue()); }