容器:用来存东西(数据/对象)的玩意儿(一系列方法 =》接口)
要掌握:
1136:
1图
1类(java.util.Collections–封装一系列List接口的方法)
3知识点(For、Generic、Auto-boxing/unboxing)
6接口(图4个+Iteration+Comparable)
容器API在 java.util (工具)包内。
1图:
6接口:
Collection接口:定义了存取一组对象的方法,祖宗接口。(不能存放int等基础数据类型,因为在栈里,容易被清空。 new出来的对象、字符串(引用)都是对象)
子接口Set、List定义了各种存储方式
Set:集合,无顺序不重复
List:有序可重复(equals-比较包含内容(包装类、基本数据类型–比较值;对象–比较地址))
Map:key(键)->value(值)映射对
对象的比较(用到contains、remove等方法时):用到equals、hashCode(索引、地址)方法
重写equals必须重写hashCode
hashCode:在使用索引的时候会用到
相等对象应该具有相同的hashCode
重写示例:
public class Name {
String firstName, lastName;
public Name(String firstName, String lastName) {
// TODO Auto-generated constructor stub
this.firstName = firstName;
this.lastName = lastName;
}
// 省略getter和setter了
public String toString(){
return firstName+" "+lastName;
}
//为了用remove、contains等需要比较对象的方法,要重写euqals和hashCode
public boolean equals(Object obj){
if(obj instanceof Name){ //判断是否是实例/派生类
Name n = (Name) obj; //强制类型转换
return (firstName.equals(n.firstName))
&& (lastName.equals(n.lastName)); //这里的equals是比较字符串的值
}
return super.equals(obj); //否则调用父类构造方法
}
public int hashCodes(){
return firstName.hashCode(); //只要一个成员变量的hashCode相等,则其他也相等
}
}
接口实现:一般用父类引用指向子类对象
例如:Collection c = new ArrayList();
原因:c并不能访问ArrayList的特有成员,所以如果需要改为LinkedList,可以直接修改
多态三要素:继承、重写、父类引用指向子类对象
Map接口:用来存储 键-值 对,键做标识,不能重复
(不能重复是指不能equals,但是比较equals效率太
低,故比较hashCode重写euqals也要重写hashCode)
实现类:HashMap和TreeMap
get方法返回值是object对象
例如:
Map m1 = new hashMap("one", new Integer(100));
int I = ((Integer) m1.get("one")).intValue(); //先把object强制转换为
//Integer对象,再取值赋值
Iterator接口:所有Collection容器都有的接口
所有实现了Iterator接口的容器,要返回实现了Iterator方法的对象,由该对象遍历容器内元素
Iterator对象在迭代过程会锁定对象,只能通过其对象的remove方法删除对象。
Collection c = new hashSet;
c.add(new Name("d1111", "d111"));
c.add(new Name("b1", "b11"));
c.add(new Name("a111", "a111"));
for(Iterator I = c.iterator(); i.hasNext(); ){
Name name = (Name) I .next(); //java1.4版本之前,next()返回的是object对象
if(name.getFirstName().length() < 3){
i.remove(); //此时不能用c.remove(name)
}
}
Comparable接口:java.lang.Comparable
比较容器内对象大小
例如用到sort()等方法时,需要比较
通过实现comparaTo()方法,确定排序方式
例如:姓名比较
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
Name n = (Name) o;
int lastComp = lastName.compareTo(n.lastName); //先比较姓
return lastComp != 0? lastComp : firstName.compareTo(n.firstName); //再比较名
}
3知识点:
增强版for循环(JDK.5之后)
for(类型 变量名 : 一组数据)
例如
Collection c = new ArrayList();
c.add(xxxx);
c.add(xxx);
c.add(xxxxx);
for(Object o : c){
//o会依次指向c中每个对象
泛型Generic:解决旧版本集合类型默认为object,之后使用要强制转换的问题
用集合时,尽量使用泛型
好处:增强程序可读性、稳定性
用法:List<String> l = new ArrayList<String>(); //<>是指定的类型
能用泛型的类:JDK里类名后面有<>的,<>填对应类型
JDK1.5版本之后:
Auto-boxing/unboxing自动打包/解包:基础类型《-》对象
自动打包: m1.put(“one”, 1); 等价于 m1.put(“one”, new Integer(1));
自动解包: ((Integer)m1.get(“one”)).intValue(); 等价于 (Integer)m1.get(“one”);
注意:自动解包仍要强制转换为对应对象
泛型与Auto-boxing/unboxing合用:
Map<String, Integer> m = new HashMap<String, Integer>(); //泛型
m.put("one", 1); //Auto-boxing,int->Integer
int I = m.get("one"); //unboxing和泛型,Integer->int,不用类型转换