首页 > 代码库 > 第十天、十一天笔记总结

第十天、十一天笔记总结

1:HashSet集合的特点?它是如何保证元素的唯一性的?
元素顺序:元素唯一,但是无序
首先判断哈希值是否相同,如果不同,就直接添加到集合。
如果相同,继续执行equals(),看其返回值,
如果是false,就直接添加到集合。
如果是true,说明元素重复不添加。
         2:TreeSet集合的特点?它是如何保证元素唯一和排序的?
元素顺序:使用元素的自然顺序对元素进行排序,或者根据创建 set时提供的 Comparator进行排序(比较器排序),
 具体取决于使用的构造方法。
         3:针对Collection体系的集合,我们到底使用谁?
List:存储和取出元素顺序一致、元素可重复。
Set:元素的存储和取出顺序不一致、存储元素唯一。
1:Map集合的特点?
   Map:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
         2:Map集合和Collection集合的区别?
   Collecton中存储一组对象,Map存储关键字或值对。
         3:Map集合的两种遍历方式思路?
   集合遍历:1.获取建的集合 2.遍历键 3.根据键找值foreach()
1.foreach():根据丈夫找妻子(根据键找值)
2.entrySet():(Set<Map.Entry<K,V>> entrySet())先找到夫妻的结婚证,再从结婚证里面找到丈夫和妻子
(先找到键值对对象,再从键值对对象里面找到键和值),
         4:List,Set,Map是否都继承子Collection?
List set 是继承自collection,Map不是
         5:Collection和Collections的区别?
Collection是集合类的上级接口,而Collections是面向集合类的一个帮助类;
                           
         Map接口中的方法:
                   Vput(K key,V value)                                      将指定的值与此映射中的指定键关联(可选操作)。
                   Vremove(Object key)                                  如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
                   voidclear()                                                      从此映射中移除所有映射关系(可选操作)。
                   booleancontainsKey(Object key)              如果此映射包含指定键的映射关系,则返回 true。
                   booleancontainsValue(Object value)      如果此映射将一个或多个键映射到指定值,则返回 true。
                   booleanisEmpty()                                         如果此映射未包含键-值映射关系,则返回 true。
                   intsize()                                                           返回此映射中的键-值映射关系数。
                   Vget(Object key)                                          返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
                   Set<K>keySet()                                              返回此映射中包含的键的 Set 视图。
                   Collection<V>values()                                 返回此映射中包含的值的 Collection 视图。
                   Set<Map.Entry<K,V>>entrySet()              返回此映射中包含的映射关系的 Set 视图。
 
 
2.HashSet
 2.1 元素顺序:元素唯一,但是无序(它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变)
 案例:创建一个HashSet集合,添加元素(String元素),测试唯一性,无序性
 
 2.2如何保证元素的唯一性的呢(分析源码)?
          * 通过简单的分析,我们知道HashSet集合保证元素的唯一性和add()方法相关。
          * 如何我们想深入的了解,就必须看add()方法的源码,看它的底层依赖什么内容?
          *    if(e.hash == hash && ((k = e.key) == key || key.equals(k))) {...}
          *   
          *    左边:e.hash == hash
          *                  比较对象的哈希值。
          *   
          *    右边:((k = e.key) == key || key.equals(k))
          *                  左边:(k = e.key) == key
          *                           比较对象的地址值。
          *   
          *                  右边:key.equals(k)
          *                           比较的是对象的内容是否相同。默认情况下比较的是地址值
 
                   结论:
                   底层数据结构是哈希表。
                   哈希表依赖两个方法:hashCode()和equals()
                  
                   执行流程:
                            首先判断哈希值是否相同,如果不同,就直接添加到集合。
                            如果相同,继续执行equals(),看其返回值,
                            如果是false,就直接添加到集合。
                            如果是true,说明元素重复不添加。
        
                   使用:
                            如果你看到哈希结构的集合,就要考虑可能需要重写这两个方法。
                            如果真要重写,自动生成即可。
3.TreeSet
 3.1 元素顺序:使用元素的自然顺序对元素进行排序,或者根据创建 set时提供的 Comparator进行排序(比较器排序),
 具体取决于使用的构造方法。
 3.2 底层算法:二叉树
 3.3 元素要求, 加入自定义JavaBean
5.HashSet与TreeSet的相同点与不同点
相同点:
单列集合,元素不可重复
不同点
1. 底层存储的数据结构不同
    HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储
2.存储时保证数据唯一性依据不同
   HashSet是通过复写hashCode()方法和equals()方法来保证的,而TreeSet通过Compareable接口的compareTo()方法来保证的
3.有序性不一样
 HashSet无序,TreeSet有序
 
 
 * 这种情况的数据,属于一一对应的映射关系。这种关系的集合在java叫Map。
 * Map:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
 
 
 * Map接口中的方法概述(创建集合测试方法):
 *             A:删除功能
 *                      voidclear():移除集合中的所有键值对元素
 *                      Vremove(Object key):根据键移除键值对元素,并返回值
 *             B:判断功能
 *                      booleancontainsKey(Object key):判断集合中是否包含指定的键
 *                      booleancontainsValue(Object value):判断集合中是否包含指定的值
 *                      booleanisEmpty():判断集合是否为空
 *             C:获取功能
 *                      Set<Map.Entry<K,V>>entrySet():获取键值对对象的集合,遍历键值对对象,
            利用getKey(),getValue()取出键和值(理解即可)
 *                     
                            V get(Object key):根据键获取值
 *                      Set<K>keySet():获取所有的键
 *                      Collection<V>values():获取所有的值
 *             D:添加功能
 *                      Vput(K key,V value):集合添加键值对
 *             E:长度功能
 *                      intsize():键值对对数。
 
 2.HashMap
 2.1元素顺序:元素顺序不可预测
 2.2底层算法:哈希算法
 2.3对键没有要求(仅仅相对于TreeMap来说)
3.Treemap
 3.1元素顺序:元素顺序与键的排序规则有关
 3.2底层算法:Tree算法
5.HashMap与TreeMap的相同点与不同点
相同点:主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
不同点:
1.HashMap里面存入的键值对在取出的时候是随机的,也是我们最常用的一个Map.根据键可以直接获取它的值,
具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。 
2.TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
栈:先进后出,画图存储元素(A,B,C)(压栈),并取出(弹栈),画图进行演示
队列:先进先出,横向队列,存入取出,画图演示、
数组:查询快,增删慢(自己创建一个数组int[] arr = {11,13,45,67,34},
需求一:在45号元素后面增加一个元素23 
需求二:删除元素45
需求三:我要获取45这个元素
 
链表:通过一个链子把多个结点(元素)连接起来,由数据和地址组成的一个元素,
节点本身必须有一个地址值(就是下一个元素的地址值)
 
特点:查询慢,增删快
 
hash:一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,
变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,
不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的信息压缩到
某一固定长度的消息摘要的函数。
集合和数组的区别:数组不适应变化的需求,所有Java就提供了集合类供我们使用
数组:
1.长度固定
2.可以存储基本类型,也可以存储引用类型
3.存储元素类型一致
集合:
1.长度可变
2.只可以存储引用类型
3.可以存储多种类型
 
 3.2
 * 为什么出现集合类?
 *             面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,我们就需要对这多个对象进行存储。
 *             而目前为止我们学习过的可以存储多个元素的东西是数组,但是呢,数组长度固定,不能适应变化的需求,所以,Java
 *             就提供了集合类供我们使用.
 4.1
 * Java提供了集合类供我们使用,而我们的需求可能是这样的:
 *             我要求我的元素是有序的,
 *             我要求我的元素是无序的,
 *             我要求我的元素是唯一的,
 *             我要求我的元素是可以重复的。
 * 为了满足不同的需求,Java就提供了不同的集合类。
 * 而这些集合类由于数据结构不同,才可以满足这些条件的。
 * 数据结构:存储元素的方式。
 * 而无论这些集合的结构是什么样子的,都是要装水的,所以,他们应该有共性的内容。
 * 通过不断的向上提取,最终会形成一个集合的继承体系图。



第十天、十一天笔记总结