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就提供了不同的集合类。 * 而这些集合类由于数据结构不同,才可以满足这些条件的。 * 数据结构:存储元素的方式。 * 而无论这些集合的结构是什么样子的,都是要装水的,所以,他们应该有共性的内容。 * 通过不断的向上提取,最终会形成一个集合的继承体系图。
时间: 2024-10-06 22:18:38