您好,欢迎来到刀刀网。
搜索
您的当前位置:首页Java之Collection总结

Java之Collection总结

来源:刀刀网
集合

一:集合简介:

1:作用和定义:用来管理对象的容器对象,也可以叫做集合。每一个元素里面装的本质上是一个对象的地址:本质上是对底层数据结构的一种封装,方便编程人员方便调用。而不用考虑数据结构实现的细节。

2:集合的遍历:

(1)迭代器(Iterator及其子接口ListIterator):用于操作容器中对象的一种特殊的对象,他由容器自

己提供。

注意:它只是依附于某一个集合对象的一个遍历工具。(2)二者的区别:

iterator:只能从前往后遍历

Listiterator:可以任意方向的遍历注意:map不属于collection.(3)书写格式:

Collectionc=newCollection();Iteratorit=c.iterator();

二:管理单个对象容器分类

Collection(接口)List(接口)Set(接口)ArrayList(实现类)LinkedList(实现类)Vector(实现类)HashSet(实现类)TreeSet(实现类)SortedSet(子接口)1:List:是有顺序(加入的顺序)的,用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。可以重复;

2:Set:(集合)无顺序的,元素不可以重复。

3:ArrayList:特点:轻量级的用数组实现的(可以用下标进行删除和查找),线程不安全,查询快,增删慢(实现搜索引擎的最优选择).

4:LinkedList:双向循环链表实现,查询慢,增删快(实现栈的最优选择)5:Vector:数组实现,重量级的。线程安全6:HashSet:无序的判断相同对象的步骤:(1):覆盖这个对象的hashCode()方法,自己规定什么时候hashCode相同,

(2):覆盖equals()方法。

注意:不同的对象也由可能有相同的hashCode,这个我们不能避免,但是应该尽可能使相同的对象有相同的hashCode。不同的对象有不同的hashCode;7:SortedSet(接口):按照某一个规则对Set进行排序8:TreeSet:(sortedset的实现类)有序的

(1)要求每一个对象都要实现Comparable接口,并且覆盖comparaTo()方法

(2)没有利用hashCode来判断,只是根据排序规则,来进行判断两个对象是否相同,9:Collections(工具类)

跟Collection没有关系,主要提供一些操作集合对象的方法。10:特例:容器中装容器

每个Collecton都有一个addAll()方法,可以把一个集合完全装载到另外一个集合里面:例如:

Setset=newSet();Listls=newList();

Ls.addAll(set);//把Set装载在list里面。三:管理的每个元素是两个对象的容器(MAP)

Map(接口)SortedMap(接口)HashTable(实现类)HashMap(实现类)1;Map定义(key--value):通过一个key值得到一个value,一般用作八种基本类型和字符串作为一个map集合的key值,key值不能重复

2:SortedMap:一般是按照key值得升序排序,如果需要自己规定,那么就需要key对象所对应的类覆盖comparable接口。

2:HashMap(实现类):对key保持唯一。如果用自定义的key,那么就要覆盖hashclode()和equals()方法;

3:HashTable:(实现类):4:二者比较:

HashMap轻量级的,线程不安全,键值可以有空指针。

HashTable:重量级的,线程安全的,键值都不能有空指针。5:properties:

主要是用来存取配置文件的信息。本质上两个参数都是一个字符串型的。

一:由集合排序引出的两个比较接口:comparable(java.lang包中),comparator(java.util包中)1:二者使用目的:

如果一个类的不同对象之间需要比较大小,那么就需要实现这两个接口。根据业务需要定义比较规则。2:使用区别

(1)comparable接口

是需要比较的类自己实现,例如:定义的Student类需要进行比较,那么就需要由Student类自己实现这个接口,实现comparaTo()方法。(2)comparator接口

自定义一个比较器类,去实现这个接口的compare,然后在在集合对象生成的时候,用一个比较器对象做参数,跟集合绑定。例如:

ClassAimplementsComparator{}//定义一个比较器类Aa=newA();//生成一个比较器对象

Setset=newTreeSet(a);//在构造一个集合对象时,传入比较器二:集合中混装类型的异同:

1:需要对对象进行排序的集合中,只能装入同一种类型的对象,否则在对象之间进行比较的时候,会抛出类型转换异常。例如:

Setset=newTreeSet();set.add(newStudent());

set.add(“hello”);//因为类型不一致,在强制类型转换的时候抛异常2:对于不需要比较对象之间大小集合,可以装入不同类型的对象。Setset=newHashSet();set.add(newStudent());

set.add(“hello”);//可以正常编译

Set接口学习笔记(20090212)

一、Set总结

数据存储规则:无序存放、不允许重复。

底层实现:哈希散列表重要实现类:HashSet

重要子接口:SortedSet(可对元素自动排序的集合,放入无序,取出是从小到大排列)二、SortedSet接口的实现类的总结

重要实现类:TreeSet底层实现结构:二叉树

自动排序的实现:通过二叉树的中序遍历就可以得到从小到大的排列(实现Comparable)

特别注意:TreeSet不能直接添加int值,原因是对象和int值无法比较(例如hello无法与5进行比较)结论:TreeSet存入的对象必须不统一类型的,要么都是字符串对象、要么都是包装类对象等。

演示:1.分别存放字符串对象和包装类对象,看看报的异常信息

Exceptioninthread\"main\"java.lang.ClassCastException:java.lang.Stringatjava.lang.Integer.compareTo(UnknownSource)//说明String对象不能转换成Integer对象

atjava.util.TreeMap.compare(UnknownSource)//说明类型不统一无法进行比较排序atjava.util.TreeMap.put(UnknownSource)

atjava.util.TreeSet.add(UnknownSource)//说明出错的方法

atset.TreeSetTest.main(TreeSetTest.java:18)//连接到具体出错的位置如何遍历TreeSet集合中的元素:1.迭代器/**

*2.迭代输入元素*/

Iteratorit=set.iterator();while(it.hasNext()){

System.out.println(it.next());}

关于集合中存放的对象排序问题?

(1)当add到集合中的所有元素都是String类型的时候,系统会自动按照String比较器进行自然排序。

问题:什么时候才需要覆盖一个对象的HashCode方法和equals方法?

答:只有当你将此对象放入到的集合底层结构是使用哈希散列表实现的集合的时候才需要进行覆盖(记住TreeSet是二叉树实现底层数据结构因此无需覆盖)

情景:教室TreeSet学生Student门口站的人Iterator*Comparator比较器的作用:比较任意两个对象的大小三、TreeSet之API方法使用的练习

publicclassTreeSetTest{

/**

*TreeSet之API常用方法*/

publicstaticvoidmain(String[]args){

SortedSetset=newTreeSet();/**

*1.往集合中添加对象【add(Objectobj)】*/

set.add(\"hehe\");//set.add(5);set.add(\"wowo\");//set.add(3.12);set.add(\"heihei\");

/**

*2.迭代输入元素*/

Iteratorit=set.iterator();

System.out.println(\"---使用Iterator遍历TreeSet所有元素---\");while(it.hasNext()){

System.out.println(it.next());}/**

*3.获取集合中第一个和最后一个元素--【first()、last()】

*/

System.out.println();

System.out.println(\"当前TreeSet集合中第一个元素是:\"+set.first());System.out.println(\"当前TreeSet集合中最后一个元素是:\"+set.last());System.out.println();

/**

*4.判断给定的元素是否在集合中存在【set.contains(obj)】*/

if(set.contains(\"wowo\")){

System.out.println(\"(*^__^*)嘻嘻……,你指定wowo在该集合列表中存在!\");}}})

四、像TreeSet集合放入自定义类的练习(核心使用ComparTo自己定义比较方案)

流程:1.定义一个Student类,包含nameage属性,并生成构造、get/set

2.编写测试类,生成一个TreeSet实例,然后使用add方法往集合中存入元素3.在Student类中覆盖publicStringtoString()方法返回属性内容4.在测试类使用Iterator接口遍历集合中保存的学生信息。演示代码1./**

*自定义一个学生类

*@authorAdministrator**/

publicclassStudentForSet{

privateStringname;privateintage;

//省掉自动生成的构造和get/set方法/**

*覆盖toString方法为了获取Student对象中属性的内容*/

publicStringtoString(){

return\"name:\"+name+\"\"+\"age:\"+age;}

publicstaticvoidmain(String[]args){SortedSetset=newTreeSet();

set.add(newStudentForSet(\"eiok\",23));//行10set.add(newStudentForSet(\"zhangsan\",21));//行11set.add(newStudentForSet(\"wangwu\",24));//行12set.add(newStudentForSet(\"bak\",25));//行13

/**

*1.遍历TreeSet集合中的Student对象的信息*/

Iteratorit=set.iterator();

while(it.hasNext()){

System.out.println(it.next());}}

}

注释上面的代码运行结果如下:

Exceptioninthread\"main\"java.lang.ClassCastException:set.StudentForSet

atjava.util.TreeMap.compare(UnknownSource)//报的是Student对象无法比较atjava.util.TreeMap.put(UnknownSource)atjava.util.TreeSet.add(UnknownSource)

atset.StudentForSetTest.main(StudentForSetTest.java:11)原因:

从异常信息可以看出异常出在set.add(newStudentForSet(\"zhangsan\",21));//行11

其根本原因在于:TreeSet实现类的底层是二叉树,添加元素的规则是第一个元素最先放进去作为跟节点且无需比较,当放入第二个对象放入的时候就要和跟节点就行比较大小(String是个特例默认实现了Comparable接口可以比较),但是Students这个类是属于我们自己定义,所以默认是无法比较。因此当运行到11行的时候报异常,程序终止运行。

解决方案:将自定义的Student类在放入TreeSet集合之前实现Comparable接口,实现此接口的作用是强行对实现该接口的类对象进行整体排序。还有既然实现此接口,那么则需要实现其publicintcompareTo(Objectarg0方法。修改后的方法:

publicclassStudentForSetimplementsComparable{privateStringname;privateintage;

//省掉自动生成的构造和get/set方法/**

*覆盖toString方法为了获取Student对象中属性的内容*/

publicStringtoString(){

return\"name:\"+name+\"\"+\"age:\"+age;}/**

*覆盖toString方法目的是获取Student对象中属性的内容*/

publicStringtoString(){

return\"name:\"+name+\"\"+\"age:\"+age;}/**

*compareTo()方法定义的目的是比较两个对象大小的标准*关于返回值的说明:

*this.age-student.age=0代表两个对象相等*this.age-student.age>0说明当前对象大*this.age-student.age<0说明当前对象小*/

publicintcompareTo(Objectobj){

//在此方法体自己实现比较的标准,或者说是怎么确定那个对象大、那个对象小//例如在此处我根据学生的年龄决定那个对象大那个对象小

StudentForSetstudent=(StudentForSet)obj;//将参数对象强转成当前类类型returnthis.age-student.age;

}

此时运行的正确结果:(输出结果是根据compareTo方法的定义的按年龄从小到大比较的)name:zhangsanage:21name:eiokage:23name:wangwuage:24name:bakage:25

思路扩展1:如何实现按年龄从大到下怎么去排列,或者说怎么去写comparTo方法?

呵呵,改变写减法的位置就可以了returnstudent.age-this.age;(你试试看)

思路扩展2:如果我加入集合中的学生信息有同年龄的对象,那么我希望同年纪时候用姓名拼音的先后顺序排列?/**

*compareTo()方法定义的是比较两个对象大小的标准*关于返回值的说明:

*this.age-student.age=0代表两个对象相等*this.age-student.age>0说明当前对象大*this.age-student.age<0说明当前对象小

*最终实现:按年龄从小到大排列,当年龄相同时候,将这两个对象按姓名拼音先后排列*/

publicintcompareTo(Objectobj){

//在此方法体自己实现比较的标准,或者说是怎么确定那个对象大、那个对象小//例如在此处我根据学生的年龄决定那个对象大那个对象小

StudentForSetstudent=(StudentForSet)obj;//将参数对象强转成当前类类型s

if(this.age==student.age){

returnthis.name.compareTo(student.name);//Stirng的compareTo比较两

个字符串大小(这个一定要记住啊,常用)

}else{

returnthis.age-student.age;//年龄不相等就按年龄大小排列}}结果:

name:eiokage:23name:wangwuage:24name:bakage:25name:Alphaage:28name:zhangsanage:28

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务