Java_容器总结

 转至: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的泛型很简单,不要去申明它只需要拿来用就可以了,
 用的时候把类型参数换成自己的类型就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值