转至:http://sllereak.blog.163.com/blog
--为什么有了数组还要使用容器
*最直观的认识,数组长度一旦固定就不能修改,而容器的长度是能动态增加和减少
*如果使用数组,当你需要修改数组长度的时候只能new一个新的数组出来,这样带来的效率问题是非常恐怖的
--API中容器的关系图
Map(Interface)(里面的单个元素一对一对的)
Object
Set(Interface)--无序的,不可以重复的(重复是通过是否equesl来判断的,自定义类是没有重写equals方法的,所以要注意咯)--下面还有很多层才到HashSet,注意不是直接实现关系
Collection(Interface)(里面的单个元素是一个一个的)
List(Interface)--有序的,可以重复的(重复是通过是否equesl来判断的,自定义类是没有重写equals方法的,所以要注意咯)--下面还有很多层才到ArrayList,注意不是直接实现关系
--Collection
*contains()方法,是否包含,用大腿都能猜出它的内部是用equals方式来判断的
*ArrayList中继承下来的ToString()方法返回这样的东西[第一个元素的.ToString(),第二个元素的.ToString()],是从父类继承的来的
*Collection中的add(Object o)只能接受引用类型的参数二不能使基础数据类型,为什么因为栈中的内容是随时会被清空的,但是编译器会给我们做一层自动的封装(JDK1.5才开始提供这样的编译功能),所以注意原理的东西就行了
--注意一个很重要的问题
*非使用HASH算法的集合等只用equals方法
*使用HASH算法的集合先使用hashCode然后在使用equals方法,这是为了提高索引速度
*是否重复的判等也是用上面两个原则,重复就会覆盖
*两个对象相互equals那么他们的hashCode因该相等,这只是经验之谈,避免作为key时出现的一些问题而已,并不是硬性要求的
只要掌握了这三条,就掌握了容器中元素判等的一切
--String 类的hashCode
String a="zhangsan";
String b=new String("zhangsan");
a和b虽然引用地址不一样,但是他们的hash码是一样的,不需要深究,这是字符串自身实现的hashCode用的一套算法
--HashMap中Key不能"重复",但是value是可以"重复"的
--Iterator接口
*是一种设计模式,提供了统一访问集合元素的方法
*所有实现了collection接口的类都有Iterator()方法,返回一个实现Iterator接口的对象,而且多以内部类方式实现这个接口
*Iterator接口提供三个方法hasNext().next(),remove()
*看下面ArrayList类的代码
class ArrayList implements Iterable{//Iterable提供一个方法Iterator iterator();(注意这里只是演示,实际上Collection接口的父接口就是Iterable)
class MyIterator implements Iterator{//内部类
public Object next(){}实现
public bool hasNext(){}实现
public void remove(){}实现
}
public Iterator iterator(){
return new MyIerator();
}
}
--List这个接口有get()这个方法,因为实现它的集合类中存放数据的类型是有序的,能用下标的方式来很快的访问元素
*ArrayList里面是用数组的形式存放的,它允许对元素进行快速随机访问(每个数组元素都是一个引用地址),但是向List中间插入与移除元素的速度很慢
*LikedList里面用链表的方式存放数据,所以向List中间插入与删除得开销不大,随机访问则相对较慢,通过get(index)虽然能访问到,但是每次都一个一个都在链中走,所以随机访问比较慢
*Vector: 底层用数组实现List接口的另一个类 ;特点:重量级,占据更多的系统开销 线程安全
--Set接口是没有get()这个方法的,所以在去Set集合中元素的时候需要使用迭代器,因为里面存放的东西是无序列的,所以不能用下标的方式访问,当然就没有get(index)这样的方法咯
*TreeSet:继承自实现SortedSet接口,在元素添加的同时,进行排序。也要给出排序规则 ,一个TreeSet中只允许存放同一类型的多个元素,这里要求不是自定义的类,(因为他要排序啊)
而对于自定义的类,它的对象只能存放一个,而且实现类不需要实现Comparable接口。
但是,如果想要存放多个自定义的类的对象,不实现Comparable接口就会发生java.lang.ClassCastException异常。因此,想要能够进行客户化排序,必须实现比较器。
也就是要实现Comparable接口,并且实现compareTo()方法。
*HashSet:无序的,使用Hash算法存数据的
--Map
*HashMap : 无序的,它的key就是HashSet
*TreeMap:继承自SortedMap接口,和Map类同,但对象按他们关键字的升序排列,它的Key就是TreeSet
--for( : )这种语法可以使用在数组和集合中,使用在集合中的时候也是调用Iteroter,所以如果自定义集合的会必须要实现iterable接口
--Collections类提供对List的操作,如果要对自定义类封装的集合排序,那么需要实现Comparable接口,或者传入Comparator接口的实现类实例
但是对多种不同类型组成的List又怎样排序呢?没办法,抛出异常,因为根本没有任何意思
--数据结构的权衡
*Array度快写慢
*Linked读慢写快
*Hash两者之间
--装箱和拆箱子
Object o=1;自动装箱
System.out.println(12);//自动装箱
int i=new Integer(1);//自动拆箱
int i=new Object();//无法自动拆箱
int i=((Integer)new Object());//可以自动拆箱
--泛型
java的泛型很简单,不要去申明它只需要拿来用就可以了,
用的时候把类型参数换成自己的类型就可以了