曾经的学习课堂笔记课件_第1页
曾经的学习课堂笔记课件_第2页
曾经的学习课堂笔记课件_第3页
曾经的学习课堂笔记课件_第4页
曾经的学习课堂笔记课件_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、List 接口ArrayList LinkedListVector : 底层也是数组,所以增删效率低,查询效率高。线程安全(加同步了!)Stack: 继承自 Vector,是堆栈。 特点是:先进后出,后进先出。Stack 是一个失败品, 因为它的作者直接让 Stack 继承了 Vector是堆栈,只能说它想一个堆栈。下面的才是纯正的堆栈。搞得四不像。 不能说它Set 接口 : 整个 Set 分支的特点是无顺序,不能重复。 如下class Stack priva inkedList list = new LinkedList();public void push(Object obj) list

2、.addLast(obj);public Object pop() return list.pollLast();publicsize() return list.size();Set 的 api.增addaddAll删removeremoveAllclear() 略。改没有修改的方法。查iterator()获取迭代器, 其他的查方法略。Set|-HashSet|-TreeSet|-LinkedHashSetHashSet : 特点 增删效率高, 查询效率高。 缺点:占用空间大。知道,Set 的特点是 无顺序 不能重复。要保证集合 Set 中的元素不重复,可以这样做:拿着每次将要新加入 set

3、 集合中的元素,和 set 中已有的每一个元素进行比较,如果发现有相同的,则不添加,如果和 set 中已有的元素全家比较完毕以后,没有发现相同的元素,则新元素就加入 set 集合中。 这样虽然能保证元素不重复,但是效率太低,试想,如果集合中此时已经有 1000 个元素了,那么新元素的情况要比较 1000 次。所以上面提到比较方法不可取!Java 中,使用 HashSet 来解决这个问题,HashSet 使用“哈希“算法,使用”哈希”算法,无论集合中有多少个元素,都只需要比较几次,就知道新元素是否与旧元素重复。理解“哈希“算法1、 java 中的每一个对象,都有一个”哈希码” , 哈希码,其实就

4、是一个整数。2. HashSet,在添加一个对象到集合中时,是拿着对象的“哈希码“进行分配,也就是说,”哈希码“相同的对象,被分配到同一片区域,新对象只和同一片区域中的元素比较!3.两个对象的内容相同,则,哈希码相同两个对象的哈希码相同,则内容不一样相同。两个对象哈希码不同,则两个对象的内容肯定不相同。(联想宿舍)注意,系统内置的类没有问题,但是自己定义的类,在调用 hashCode 得到对象的哈希码时,因为自定义的类没有重写 Object 的 hashCode 方法,所以直接调用的是 Object 的 hashCode 方法。而 Object 的 hashCode 方法是直接返回对象在内存中

5、的地址的!也就是说, Object 的 hashCode 返回的内容与对象的内容无关!此时,如果把 p 和 p2 添加到 HashSet 中,因为 p 和 p2 的哈希码不同,所以进入了不同区域。所以没有引起比较,如下:为了解决这个问题首先要在类中重写 Object 的 hashCode 方法,保证 hashCode不再返回地址,而是根据对象的内容生成! 也就是保证内容相同的的哈希码!如下:对象,返回相同package com.xaeduask.test;import java.util.HashSet;import java.util.Set;classprivate String name

6、;privateage;public(String name,age) = name;this.age =age;public String toString() return name= + name + , age= + age + ;publichashCode() return name.hashCode() + age;public class Demo3 public sic void main(String args) Set set = new HashSet();结果发现,集合中仍然是 2 个元素.为什么呢?此时仅仅保证了内容相同的元素进入同一片区域,进而引起比较。 而关键就

7、在于比较!引起比较时,就是调用 equals 方法! 而此时又没有重写equals,所以调用的是 Object中的 equals 方法,所以就算此时引起比较了, 但是也比较的是地址呀!所以还要重写equals 方法! 保证 equals 不是比较地址,而是比较内容,如下:package com.xaeduask.test;import java.util.HashSet;import java.util.Set;classprivate String name;privateage;public(String name,age) = name;this.age =age;public Stri

8、ng toString() return name= + name + , age= + age + ;publichashCode() return name.hashCode() + age;publicequals(Object obj) System.out.prln(this + vs + obj); if(obj instanceof) p = ()obj;return name.equals() & age = p.age;return false;public class Demo3 p = new(a, 1);p2 = new(a, 1); System.out.prln(p

9、.hashCode(); System.out.prln(p2.hashCode(); set.add(p);set.add(p2);System.out.prln(set.size();什么时候需要重写 hashCode 和equals 方法? 当自己定义的类的对象,要加入 HashSet 集合中的时候,才去重写这两个方法。TreeSet: 特点, 能够对集合中的元素进行自然排序。如下,可以对数字排序如下,可以对字符串排序public sic void main(String args) Set set = new HashSet();p = new(a, 1);p2 = new(b, 2)

10、;p3 = new(c, 3); System.out.prln(p.hashCode(); System.out.prln(p2.hashCode(); System.out.prln(p3.hashCode(); set.add(p);set.add(p2);set.add(p3);System.out.prln(set.size();注意,TreeSet 中只能添加相同类型的数据。试试自定义的类的对象加入 TreeSet 中是否会排序? 不会,而且报错了!因为 TreeSet 根本不知道如何比较两个人!这样解决以上问题: 如果一个类的对象要加入 TreeSet 中,则该类就要实现一个接口

11、:parablepackage com.xaeduask.test;import java.util.Set;import java.util.TreeSet;classimplements Comparable private String name;privateage;public(String name,age) = name;this.age =age;public String toString() return name= + name + , age= + age + ;/ 返回 小于0 表示 当前对象小于参数/ 返回 等于0 表示 当前对象等于参数/ 返回 大于0 表示 当前

12、对象大于参数publiccompareTo(Object obj) System.out.prln(this + vs + obj); if(!(obj instanceof) throw new RuntimeException(这不是人!);p = ()obj;LinkedHashSet:和 HashSet 一样,只不过了顺序而已。Map 接口:如下:Map 分支的特点是,以键值对存放元素,其中键值不能重复,值能重复。Map 的 api.增put(Object key, Object value);r = neweger(age).compareTo(p.age);if(r = 0) re

13、turnpareTo();return r;public class Demo3 public sic void main(String args) p = new(a, 30);p2 = new(b, 20);p3 = new(c, 20); Set set = new TreeSet(); set.add(p);set.add(p2);set.add(p3); System.out.prln(set);putAll(Map )删remove(Object key)clear();改put,put 时,键值和已有键值重复,即是覆盖查containsKeyconstainsValueget(O

14、bject key) 根据键值获取值。如果键值不存在,则返回 nullisEmpty();size()获取 map 中键值对的对数values() 获取由 map 中所有值组成的集合,返回 Collectionkeyset ,获取由 map 中所有键组成的集合,返回 SetentrySet ,获取由map 中键值对,组成的集合。HashMap, 不用讲了, 其实是 HashSet 的底层实现。TreeMap,不同讲了,其实是 TreeSet 的底层实现。工具类CollectionsSort 专门对List 排序Reverse, 翻转集合中的元素 、shuffle 随机打乱元素顺序swap()

15、交换两个元素的位置Arrays 专门操作数组sort 排序asList, 生成一个只读List,并且初始化。泛型的使用泛型能把运行期的错误,转移到编译期,能让程序员快速改错。强制某个集合中的元素的类型!自定义泛型类。(挖坑)经典面试题.ArrayList 和 Vector 的区别当集合中的 元素放满时,ArrayList 每次增长为原来的一半,Vector 每次增长为原来的一倍。ArrayList 是线程不安全的,Vector 是线程安全的class Foo private T; private S second;public T get() return;public void set(T)

16、 this.=;public S getSecond() return second;public void setSecond(S second) this.second = second;ArrayList 和 LinkedList 的区别因为 ArrayList 底层是数组实现的,元素都是连续存放的,所以查询效率高,增删效率低。因为 LinkedList 底层是链表实现的,元素都是不连续存放的,所以查询效率低,增删效率高。Collection 和Collections 的区别Collection 是集合框架中的一个父接口,它有两个子接口,分别是List 和 Set Collections 是集合框架中的一个工具类,其中的方法都是静态方法。HashMap 和 Hashtable 的区别HashMap 可以用 null 作为键值或值,Hashtable 不能!

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论