Java基础-容器

容器:用来存东西(数据/对象)的玩意儿(一系列方法 =》接口)

要掌握
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,不用类型转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值