J2SDK所提供的容器API位于java.util包内
容器API的类图和结构如下图所示:
1个图,1个类,3个知识点,6个接口.
- Collection 接口定义了存取一组对象的方法,Set和List分别定义了存储方式
- set中的数据对象没有顺序且不可重复.
- List中的数据对象有顺序且可以重复.
- Map接口定义了存储"键(key)--值(value)映射对"的方法
Collection的方法举例
import java.util.*; public class TestCollect { public static void main(String[] args) { Collection c = new ArrayList(); //ArrayList()相当于是容器 c.add("hello"); c.add(new Name("f1","l1"));//添加,remove为删除,原理为先去equals,如果true那么,则去除掉add内容 c.add(new Integer(100)); System.out.println(c.size()); System.out.println(c); } } class Name { public String firstName,lastName; public Name(String firstName,String lastName){ this.firstName = firstName; this.lastName = lastName; } public String getfirstName(){ return firstName; } public String getlastName(){ return lastName; } public String toString() { return firstName + " " + lastName; //重写输出类型. } }
//add为添加.输出这个c的时候,打印这个c的时候,相当于调用了c.toString的方式.c.toString的输出形式.首先[],然后挨个输出盘里内容,中间用逗号隔开. 以上的程序解决了表格的添加问题,以及不断重复的效率低下.
重写equals
如果要重写equals这个方法的话,必须重写这个hashcode()索引方法..
Iterator接口
- 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象
- Interator对象称作迭代器,用以方便的实现对容器内元素的遍历操作
- Interator接口实现了如下方法;
- boolean hasNext;//判断右边是否有元素
- Object next(); //返回游标右边的元素并将游标移动到下一位置(substring)
- void remove //删除游标左边的元素,在执行完next之后该操作只能执行一次
List接口算法
- java.util.Collections.提供了一些静态方法实现基于List容器的常用算法
- void sort(List) 对List容器内的对象进行排序
- void shuffle(List) 对List容器内的对象进行随机排列
- void reverse(List) 对List容器内的对象进行逆序排列
- void fill(List,object) 用一个特定的对象重写整个List容器
- void copy(List dest,List src)将src容器内的内容拷贝到dest容器
- int binarySearch(List,Objcet)对于顺序的List容器,采用折半查找的方法查找特定对象.
Comparable接口
- 比较以上接口排序的时候需要怎样的判定容器中的对象大小.
- 所有可以排序的类都实现了java.lang.Comparable接口,Comparable接口只有一个方法,
public int comparabTo(object boj); - 该方法
- 返回值为0,表示this = obj;
- 返回正数表示this > obj;
- 返回负数表示this < obj;
实现了comparable 接口的类通过实现comparaTo方法从而确定该类对象的排序方式.
如何选择数据结构
衡量标准:读的效率和改的效率
- Array读快改慢
- Linked改快读慢
- Hash两者之间
MAP接口
- 实现MAP接口的类用来存储键--值 对.(key为索引)
- MAP接口的实现类有HashMap和TreeMap等.
- Map类中存储的键--之对通过建来标识,所以键值不能重复(依然为equals方法,但是比较equals的方法很慢,所以直接比较Hashcode因为为int类型.).
object put(Object key,Object value);//这个key和对应的value
Object get(Object key);//这个key对应的value
Object remove(Objcet key);//删除这个key和对应的value
boolean containsKey(Object key);//是否包含这个key
boolean containsValue(Object value);//是否包含这个value
int siza();//一共多少对
boolean isEmpty();
void putAll(Map t);//把t的key全部放到里面.
void clear();
//以上内容,在1.5版本以前需要将例如1的值,强行转换成Integer然后才能输入进去,而1.5之后,我们可以将1打包,输入进去.自动完成打包,解包.减少我们的代码数量
例如m1.put("one",new Integer(1));
现在为m1.put("one,1);自动将1打包成一个
JDK1.5之后新增加的东西,Auto-boxing/unboxing
- 在合适的实际自动打包,解包
- 自动将基础类型转换为对象
- 自动将对象转换为基础类型
import java.util.* public class TestArgewords{ private static final Integer One = new Integer(1); public static void main(String args[]) { Map m =new HashMap(); for(int i = 0;i <args.length;i++) { Integer freq = (Integer)m.get(args[i]); m.put{args[i],(freq == null? One : new Integer(freq.intValue() + 1))}; } System.out.println {m.size() + " "); System.out.println(m) } }
泛型
JDK1.4以前类型不明确;
- 装入集合的类型都被当做Objcet对待,从而失去本身的实际类型
- 从集合中取出时往往需要转型,效率低,容易出错
解决办法:
- 在定义集合的时候同时定义集合中对象的类型
- 示例:BasicGeneric.java
- 可以在定义Collcetion的时候指定
- 也可以在循环时用Iterator指定
好处:增强程序的可读性和稳定性.
总结1136
- 一个图.
- 一个类
- Collections
- 三个知识点
- for
- Generic泛型
- Auto-boxing/unboxing自动打包,解包
- 六个接口
- Collection接口
- Set List接口
- Map接口
- iterator接口(用数组模拟链条方法图记忆)
- Comparable(定义一个类的两个对象谁大谁小).