黑马程序员java培训就业班笔记day17(集合框架Set)总结

上传人:宝路 文档编号:23923962 上传时间:2017-12-04 格式:DOC 页数:8 大小:121.01KB
返回 下载 相关 举报
黑马程序员java培训就业班笔记day17(集合框架Set)总结_第1页
第1页 / 共8页
黑马程序员java培训就业班笔记day17(集合框架Set)总结_第2页
第2页 / 共8页
黑马程序员java培训就业班笔记day17(集合框架Set)总结_第3页
第3页 / 共8页
黑马程序员java培训就业班笔记day17(集合框架Set)总结_第4页
第4页 / 共8页
黑马程序员java培训就业班笔记day17(集合框架Set)总结_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《黑马程序员java培训就业班笔记day17(集合框架Set)总结》由会员分享,可在线阅读,更多相关《黑马程序员java培训就业班笔记day17(集合框架Set)总结(8页珍藏版)》请在金锄头文库上搜索。

1、Day17 总结1、LinkedList:特有方法:1、增加:addFirst()addLast()JDk1.6 之后出现了替代方法Boolean offerFirst()Boolean offerLast()实现代码:Public static void main(String args)LinkedLis link=new LinkedList();Link.addFirst(abc1);Link.addFirst(abc2);Link.addFirst(abc3);Link.addFirst(abc4);While(!link.isEmpty()/此方法可以按照顺序取出元素,但是被删除,

2、可以去模拟一些简单的数据结构Sop(link.removeLast();/abc1、abc2、abc3、abc4重点:模拟堆栈、队列这两种常见的数据结构;实现代码:队列:先进先出Public static void main(String args)DuiLie d=new DuiLie();d.myAdd(abc1);d.myAdd(abc2);d.myAdd(abc3);While(!d.isNull()/判断是否有元素Sop(d.myGet();Class DuiLiePrivate LinkedList link;DuiLie()Link=new LinkedList();提供添加元素

3、的方法Public void myAdd(Object obj)link.addFirst(obj);/这里修改为 link.addLast()就是堆栈提供获取元素的方法Public Object myGet()Return link.removeLast() ;判断集合中是否有内容Public boolean isNull()Return link.isEmpty();2、获取:Object getFirst()获取对象,不删除,如果集合中没有元素会抛出NoSuchElementException;Object getLast();JDK1.6 后Object peekFirst()Obje

4、ct peeklast()3、获取对象:Object removeFirst()获取到元素,但是删除了。Object removeLast();Object pollFirst()Object pollLasr()2、Set 集合:无序、不重复、该接口中的方法和 Collection 接口中的方法一致。|-HashSet:低层哈希表数据结构,不同步的,它保证元素唯一性的方式:根据元素的两个方法来完成的,一个是 hashCode、一个 equals。只有当 hashCode 方法算出的哈希值相同时,会再次判断两个元素的 equals 方法是否为 ture;如果是 true 说明两个元素相同,不存

5、储,所以往 hashSet 集合中存储自定义对象时,要覆盖 hashCode、equals 方法,通过自定义独享具备的特有数据来定义 hashCode、equals的具体实现。哈希结构表分析:Hash 表和数组表的比较,哈希表数据结构是按照元素的特征通过指定的功能算出该元素的位置,这种方式查找时候比较快,不 用去遍历整个数组,直接用要查找的数据进行元素即可,存入其他的数据类型也可以,比如说字符串,只要定义一个功能算法对其进行运算即可,注意:哈希值冲突,比如 31%10 和 21%10 最后的值都是 1,只是往 1 角标中存储就冲突了,怎么去解决这个问题呢?哈希表有种特殊的方式:再散列方式(就是

6、再把这个数据进行取模,算出其他的位置) ,除此之外还有另外一种方式:当算到相同的值时,就在该冲突的位置的基础上向下顺延一个位置出来,这时候便不再冲突了,如过还有值冲突就继续向下顺延,上图结构通过 equals 方法来判断对象是否想用,这个方法只有在哈希值一样的时候才会用到。实现代码:需求:存储自定义对象,比如 Person,同姓名和同年龄视为同一个人,是相同元素。hashSet hs=new hashSet();Hs.add(new Person(lisi1,20);Hs.add(new Person(zhangsan,20);Hs.add(new Person(wangwu,20);Hs.a

7、dd(new Person(sunba,20);Hs.add(new Person(zhangsan,20);取出来Iterator it=hs.iterator();While(it.hasNext()Person p=(Person)it.next();Sop(p.getName()+p.getAge();Class Person()Private String name;Private int age;Person(String name,int age)This.name=name;This.age=age;Public void setName(String name)This.na

8、me=name;Public void getName()Return name;Public void setAge()This.age=age;Public int getAge()Return age;Public String toString()Return Person:+name+:+age;定义一个比较方式,按照年龄进行自然排序Public int compareTo(Object o)Person p=(Person)o;Int temp=this.age-p.age;Return temp=0?pareTo(p.name):temp;/*按照姓名进行自然排序Int temp

9、=pareTo(p.name)Return temp=-0?this,.age-p.age:temp;*/覆盖 hashCode()方法Public int hashCode()Final int NUMBER=28;/为什么要定义常量,是因为避免哈希值冲突的情况,比如说一个姓名取哈希值为 20,年龄取哈希值为 40.另外一个人的姓名取哈希值为 40 年龄哈希值为 20;两个的和都是 60,用它进行哈希运算,可能得到的值都是相同的,这样的话再哈希结构表中的数据存储都是冲突的。所以才定义这样一个常量类避免这种冲突。Return name.hashCode()+age*NUMBER;覆写 equa

10、ls 方法其实就是建立对象自身特有的判断对象是否相同的依据。Public boolean equals(Object o)If(!(Obj instanceof Person)Throw new ClassCastException(数据错误):Person p=(Person)obj;Return this.name.equals(p,.name)&this.age=p.age;|-TreeSet:用于给 Set 集合中的元素按照指定的顺序进行排序,低层是二叉树数据结构,线程是不同步的。如何保证元素的唯一性呢?就是用过元素对象的比较方法返回值来确定的,如果为0,视为两个元素为相同的元素,不存

11、储。两种排序方式:1、让元素自身具备比较功能,就是强制让元素去实现 comparable 接口,覆盖compareTo 方法。这时元素具备的自然排序。可是如果元素自身不具备比较的功能,获取具备的比较功能不是所需要的。这时该排序方式就不能用了。2、让集合自身具备比较功能,需要定义比较器,其实就是将实现了 Comparator 接口的子类对象作为参数传递给 TreeSet 集合的构造函数,让 treeSet 集合一创建就具备了比较功能。该子类必须要覆盖 compare 方法。二叉树数据结构分析:二叉树数据结构的特点,当第一个元素存入时,后面存入的数据都要跟它进行比较,如果小则存储在这个元素的左边的

12、位置,如果大就存储在这个元素的右边的位置,依次下去,它在对元素进行遍历的时候,不是从上到下,而是跟你要遍历的元素与它进行比较。实现代码:TreeSet ts=new TreeSet(new ComparatorByName();Ts.add(new Person(lisia,29);Ts.add(new Person(lisic,30);Ts.add(new Person(lisiz,21);Ts.add(new Person(lisi11,41);Iterator it=ts.iterator();While(it.hasNext()Person p=(Person)it.next();So

13、p(p.getName()+p.getAge();当元素自身没有比较功能的时候要定义实现 Comparator 接口的方法,让对象具备有比较功能,这时候要覆盖 comparator 接口的 compare 方法实现代码:Class ComparatorByName implements ComparatorPublic int compare(Object o1,Object O2)Person p1=(Person)o1;Person p2=(Person)o2;Int temp=p1.getName().compareTo(p2.getName();Return temp=0?p1.get

14、Age()-p2.getAge():temp;3、查阅集合的技巧List|-Vector|-ArrayList|-LinkedListSet|-HashSet|-TreeSet在 JDk1.2 集合框架出现后,名称的阅读性非常强,通过名称就可以识别。明确所属的子体系,只要看后罪名,到底具体这个集合是什么结构,有什么特点,只要看前缀即可。看到 Array:数组结构,就要想到角标,有序,可重复,查询快看到 link:链表结构,想到增删快,同时可以明确操作 first last 的方法、看到 hash:哈希表结构,就要想到无序,不可以重复,必须要想到元素依靠的hashCode 和 equals 方法

15、来保证唯一性。看到 Tree:二叉树,就要想到比较的功能和排序,必须要想到两个接口,Comparable-compareTo Comparator-compare集合中常用的集合对象都是不同步的。4、泛型:1、由来:在 jdk1.4 版本之前,定义容器可以存储任意类型的对象,但是取出时,如果使用了具体元素的方法,需要向下转型的动作,因为元素类型的不一致,会导致运行时类型转换异常。原因是:在定义集合时,并没有明确集合中的元素的具体类型,借鉴数组的定义方式就可以避免这个问题。在 JDk1.5 版本以后出现了一个解决机制,忽悠事故在定义容器时,直接明确容器中的元素的类型,这既是泛型的表现,用的类和接口时,传递需要操作的对象类型就可,其实就是传递类型参数。2、什么时候写泛型?最简单的而一种体现,只要使用了带有的类和接口,就指定具体对象类型、3、泛型的好处:1、将运行时出现的类型转换异常问题在编译时期给解决了,运行就安全了.2、避免了强制转换的麻烦.所以泛型就是 JDK1,5 后出现一个安全机制。泛型擦除:泛型是编译时期的安全机制,编译时通过泛型机制,编译器多了对元素类型进行检查的步骤,如果检查通过,差生的 class 文件是不带有泛型的。泛型补偿:在对元素存储的时候,可以完成类型的判断,怎么用指定的类型来接收呢?JVM 在运行时,会获取元素的类型,并用该类型对元素进行转换即可。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号