本帖最后由 怀念黑海岸 于 2014-8-2 19:21 编辑
让我来给楼主好好讲讲吧,请容我做到沙发上,慢慢叙来:
Collection接口和Map接口都是两个顶层的容器接口。
前者下面有两个非常常用的子接口:List和Set,前者呢下面有三个实现类:分别是ArrayList(底层数据类型是数组,具有查询快但是插入删除数据慢的特点,是目前集合类的生力军。非常常用,相比于后面的那个家伙来说它是不同步的,因此在对其进行操作时,效率比较高,一般而言,当存入的数据不是太多但是也涉及到删除增加的操作的话还是建议使用ArrayList,历经考验),LinkedList(底层数据类型是链表,因此具有插入删除数据快但是查询速度慢的的特点,但是呢因为被同步了,所以比较苦逼的就是操作他的时候效率不是那么高,(ArrayList表示很高兴),但是呢在需要线程安全的地方,他还是能笑傲江湖那么一小会儿的。)和Vector(这玩意儿出来的很早,java刚出来的时候基本就是用它来存储元素了,但是江山代有才人出,一代集合替一代,现在基本用的不多了,因为吧他有的功能人家都有(我能保证线程安全,LinkedList冷笑道:老子也能,都还被ArrayList完爆,你算个屌。))。所以呢,List这个集合下最最常用的就是ArrayList集合,这也是Colleciton接口下用的最顺手的得力大将了。
Set集合下也有两个集合类不甘示弱:TreeSet和HashSet,高中都学过集合吧,集合有什么特点,不能有重复元素,而且元素是无序的。存入元素和取出元素的顺序不一定相同(这要好好批评下,看看上面的List老师的几个学生多乖,出入有序,集合和集合的差别怎么就如此之大呢。。。人心不古,哦集合心不古)。TreeSet集合的他的底层数据的实现呢是二叉树,大学学过数据原理的都知道这玩意儿,我也不多说了,这个集合有个特点,虽然出入混乱,但是他内部管理人员很给力,里面的数据都很听话的按照某种顺序(潜规则,对,这儿你可以定义你的潜规则哦。。)进行排序。但是,如果你存入的元素是个暴力分子,没有任何规则去制约它,那么他就发飙了(当你存入的元素不具备比较性(当前没有任何比较器使用于当前存入的元素)的话那么将会爆出类型转换异常,),因此你得马上制定你的潜规则,两种方法:一种依靠个人魅力(书写自己的比较器,这个比较器要实现comparator接口并重写里面的compareTo方法,并在你声明集合的时候将这个比较器传入,TreeSet下有构造函数允许你传入你自己定义的构造器,那么他在对元素进行排序的时候会使用你的比较规则)征服它;另外中就是对它碎碎念感化它,让它自己循规收据(即你传入对象所对应的类要实现comparable接口并重写compareTo方法)。这就是TreeSet,很蛋疼是吧,我刚接触到的时候也蛋疼。
HashSet呢和TreeSet就不同了。他的底层数据类型是哈希表,那我们亲爱的HashSet同学是怎么保持他能让元素保持唯一性呢,他有他的秘密。记得有个函数不:hashCode()方法,没错,就是这个玩意儿保证了他为别人的与众不同。但是呢重写hashCode()方法后还不能保证元素的唯一性,没办法只能顺带重写equals方法来区分下了。为什么呢,就不解释了,打字真心累。所以一般操作带有hash的集合,最好把HashCode方法和equals方法给重写了以避免元素重复。
再说Map接口,这个接口下呢有三个子集合。一个HashMap,一个是HashTabale,一个是TreeMap,前者呢你懂的,哈希表,其中他里面是怎么存放数据的呢?没错,他对存入的元素进行了黑箱操作,让存入的元素发生了某些不正当的,哦不正常的关系--键值对,来维持里面的元素。那么我们如何破坏这些不正常关系的野鸳鸯呢,恩,可以从《七夕秀恩爱-谁秀谁死》--『JDK API 1.6.0』--手册中查阅,保证让你满意。而且不是同步的哦,你是不是想到了ArrayList那个屌丝,没错,这儿这个后起的屌丝也逆袭了老牌高富帅HashTable,(HashTable泪牛满面,我线程同步也有错么。。)。这儿有点要注意,面试会在这儿问到的问题基本上是这两个集合有和区别:记好了,因为是屌丝,所以适应性更强,而且经常不穿内裤到处跑(允许空键空值),好不容易papapa都还不带套,不安全,很不安全。看人家高富帅HashTable,人家就很礼貌有安全感(线程同步的),从不挂空挡到处跑(不允许空键空值)。
再说TreeMap,不说了,二叉树你懂的。
主要是写太多,手累了(打飞机都没这么累的说)
|