《day08集合【LinkedList、HashSet、Collection集合体系】》由会员分享,可在线阅读,更多相关《day08集合【LinkedList、HashSet、Collection集合体系】(8页珍藏版)》请在金锄头文库上搜索。
1、Comment 1: 与父接口相比,List 接 口多了一些有关索引的方法第第 8 天天_面向对象面向对象(集合集合)1.常见的四种数据结构常见的四种数据结构(见图见图)2.List 接口a.特点:1.有序(指的是存和取的顺序一致)2.有下标3.元素可重复回顾一下 List 接口中的常用方法增: add(E e);add(int index,E e);删: remove(Object obj);remove(int index);改: set(int index,E e);Comment 2: 注意返回值类型及内容查: size(),get(int index);b.具体子类ArrayList
2、:底层采用数组结构,特点查询快,增删慢(和 Vector 类似)常用方法:和 List 基本没区别LinkdList:底层采用链表结构,特点查询慢,增删快常用方法:1.除了和 List 共有的方法之外还有特有方法2.大量首位操作的方法()第一组:添加方法public void addFirst(E e);/向头部添加元素public void addLast(E e);/向尾部添加元素第二组:删除方法public E removeFirst();/删除头部元素,返回被删除的元素public E removeLast();/删除尾部元素,返回被删除元素第三组:获取方法public E getFi
3、rst();/获取头部元素public E getLast();/获取尾部元素第四组:public E pop();/弹出一个元素,返回值被弹出元素功能和 removeFirst 相同public void push(E e);/向集合中推入一个元素 功能和 addFirst 相同3.Set 接口a.特点1.无序(指的是存和取的顺序不一致)(LinkedHashSet,TreeSet)2.无下标3.元素不可重复b.具体子类HashSet:哈希集,底层采用哈希表结构,特点查询快增删也快LinkedHashSet:链式哈希集,底层采用 链表+哈希表,特点查询快增删也快Set 接口中的方法:1.首先
4、肯定是具有 Collection 中方法2.没有子类 HashSet,LinkedHashSet 中也没有特有方法Comment 3: String 类重写了 hashCode 方法4.扩展哈希表结构1.对象的哈希值对象.hashCode();/可以获取该对象的哈希值哈希值是 真正的地址值算出来(哈希算法)而我们打印对象的时候那个地址值,是哈希值的 16 进制2.字符串对象的哈希值由于 String 类中重写了 hashCode 方法那么当一个 String 对象调用 hashCode 方法时,调用自己的 hashCode 方法通过观察源码发现:String 类的 hashCode 方法只跟字
5、符串的内容有关系所以: 只要两个字符串的内容相同,那么计算出的哈希值必然相同问题: 如果两个字符串的内容不同,可能不可能哈希值计算出来是相同的?可能!3.哈希表结构的初识哈希表结构: 底层数组和链表的结合体HashSet: 无序,元素不重复,无下标LinkedHashSet:有序,元素不重复,无下标4.HashSet 如果判断要添加的元素是否重复呢?先比较 hash 值,在调用 euqals只有 hash 值相等,并且 equals 返回 true,才判定这个元素是重复的5.我们最后得出一条结论我们最后得出一条结论:在 HashSet 中如果你要保证是自定义元素的唯一性需要重写该元素所属类的
6、hashCode 和 equals 方法6.定义一个标准的类定义一个标准的类:a.封装封装 private+get/setb.构造构造:无参无参+全参全参c.toString:方便打印对象的信息方便打印对象的信息d.重写重写 hashCode 和和 equals,保存到保存到 hashSet 中可以保证唯一性中可以保证唯一性例如:例如:/* 每一个对象都有一个字符串表示:* Object 类中 toString 方法,默认表示格式: “包名.类名地址值“* * 每一个对象都有一个数字表示:* Object 类中 hashCode 方法,就能获取到对象的哈希值(数字)* 地址值是哈希值的 16
7、进制表示* 我们 java 中是看不见地址值的,能看见是哈希值,* 哈希值是通过真正的地址值计算出来的,怎么计算?不知道,你去百度,也是大牛自己猜的* 哈希值是通过一个散列算法(哈希算法)* * 总结: Java 中打印一个对象的地址值 ,打印出来是哈希值的 16 进制* * author yingpeng*/public class HashCodeDemo public static void main(String args) / TODO Auto-generated method stub/1.创建一个对象Person p = new Person();/2.获取该对象 p 的哈希值
8、int hc = p.hashCode();System.out.println(hc);/1System.out.println(p.toString();/3.那么对象 p 中保存的到底是什么? 真正的地址值, p1=p25.判断元素唯一性原理在 Collection 接口中有一个方法public boolean contains(Object obj);/判断集合中是否包含某一个元素ArrayList 中 contains 方法判断元素唯一的原理ArrayList arr = new ArrayList();arr.add(“abc“);Comment 4: 所谓有序与无序,是指 输入与
9、输出顺序是否一致。 并不是有没有索引。二者都是无下标 的,换句话说,是不能利用下标找到 某个元素的arr.add(“java“);arr.add(“php“);/判断是否包含arr.contains(“java“);/ArrayList 的 contains 方法,只会调用 equals 去判断HashSet 中 add 和 contains 方法判断元素唯一的原理HashSet arr = new HashSet();arr.add(“abc“);arr.add(“java“);arr.add(“php“);/判断是否包含arr.contains(“abc“);HashSet 中 conta
10、ins 方法和 add 方法判断原理是类似的先比较哈希值,再比较 equalsLinkedHashSet 和和 HashSet 有区别有区别:LinkedHashSet 有序:因为他底层 链式哈希表HashSet 无序:因为他底层只是哈希表举例:/* 使用 HashSet 练习* * author yingpeng*/public class HashSetDemo public static void main(String args) /1.创建 HashSet 集合对象HashSet hs = new HashSet();/无下标 从 API 就可以看出/2.无序的? 添加和取出的顺序不一致/3.不可重复/4.HashSet 如何判断 你要添加的元素是重复还是不重复/结论: HashSet 添加元素的时候,先比较哈希值,如果哈希值不同直接添加/ 如果哈希值相同,再调用 euqals 进行比较,如果返回 false 直接添加/只有 哈希值和 equals 都相同,才判定是重复元素hs.add(“php“);hs.add(“abc“);hs.add(“重地“);hs.add(“acD“);hs.add(“abc“);hs.add(“通话“);System.out.println(hs);6.总结7.预习Map 和 Collection 的区别Map 集合的两种遍历方式