JAVA有多难学?
现在正在学JAVA。。JAVA难学吗?
更新时间:2023-06-05 11:06
最新回答
hashset: 此类实现 set 接口,由哈希表(实际上是一个 hashmap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。 此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此集合进行迭代所需的时间与 hashset 实例的大小(元素的数量)和底层 hashmap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。 注意,此实现不是同步的。 如果多个线程同时访问一个集合,而其中至少一个线程修改了该集合,那么它必须 保持外部同步。这通常是通过对自然封装该集合的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 collections.synchronizedset 方法来“包装”集合。最好在创建时完成这一操作,以防止对 hashset 实例进行意外的不同步访问: set s = collections.synchronizedset(new hashset(...)); 此类的 iterator 方法返回的迭代器是快速失败 的:在创建迭代器之后,如果对集合进行修改,除非通过迭代器自身的 remove 方法,否则在任何时间以任何方式对其进行修改,iterator 都将抛出 concurrentmodificationexception。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来在某个不确定时间发生任意不确定行为的风险。 注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器在尽最大努力抛出 concurrentmodificationexception。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误做法:迭代器的快速失败行为应该仅用于检测程序错误。 hashmap: 基于哈希表的 map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,hashmap 类与 hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现假定哈希函数将元素正确分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代集合视图所需的时间与 hashmap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)的和成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。 hashmap 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍。 通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 hashmap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地降低 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。 如果很多映射关系要存储在 hashmap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。 注意,此实现不是同步的。如果多个线程同时访问此映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。(结构上的修改是指添加或删除一个或多个映射关系的操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 collections.synchronizedmap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的不同步访问,如下所示: map m = collections.synchronizedmap(new hashmap(...)); 由所有此类的“集合视图方法”所返回的迭代器都是快速失败 的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器自身的 remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛出 concurrentmodificationexception。因此,面对并发的修改,迭代器很快就会完全失败,而不冒在将来不确定的时间任意发生不确定行为的风险。 注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出 concurrentmodificationexception。因此,编写依赖于此异常程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。 (以上内容全部copy自jdk5.0 doc)
HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。 public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。 什么是HashMap HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。 public Object put(Object Key,Object value)方法用来将元素添加到map中。 你可以阅读这篇文章看看HashMap的工作原理,以及这篇文章看看HashMap和HashTable的区别。 HashSet和HashMap的区别 *HashMap* *HashSet* HashMap实现了Map接口 HashSet实现了Set接口 HashMap储存键值对 HashSet仅仅存储对象 使用put()方法将元素放入map中 使用add()方法将元素放入set中 HashMap中使用键对象来计算hashcode值 HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false HashMap比较快,因为是使用唯一的键来获取对象 HashSet较HashMap来说比较慢
相关问答
更多-
请教高手Hashtable、HashMap、HashSet的用法与区别?[2022-07-11]
他们的区别:HashTable和HashMap是Map接口的实现类,其中HashTable的键或值不能为null,HashMap的键或值可以为null;HashTable是线程安全的,HashMap是线程不安全的,因此HashMap的效率要比HashTable高。HashSet是Set接口的实现类,它里面的元素都是无序的。 HashMap,HashTable 用法: Map map=newHashMap();或者HashMap map=newHashMap(); map.put("A","a");----> ... -
map与HashMap的区别[2023-07-15]
map是一个接口,而HaspMap是它下面的一个实现类 -
map与HashMap的区别[2022-11-22]
map是一个接口,而HaspMap是它下面的一个实现类 -
php break后面跟的数字是什么意思[2022-04-15]
区别 -
Java HashSet vs HashMap(Java HashSet vs HashMap)[2023-09-01]
地图保存唯一的键。 当您使用映射中存在的键调用put ,该键下的对象将替换为新对象。 因此大小1。 两者之间的区别应该是显而易见的: 在Map存储键值对 在一个Set你只存储钥匙 事实上, HashSet有一个HashMap字段,每当调用add(obj) , put方法都会在底层映射map.put(obj, DUMMY)上被调用map.put(obj, DUMMY)其中虚拟对象是private static final Object DUMMY = new Object() 。 所以地图用你的对象作为关键字 ... -
它们是完全不同的结构。 一个HashMap是Map一个实现。 地图将键映射到值。 使用哈希进行键查找。 另一方面, HashSet是Set一个实现。 A 集被设计为匹配一个集合的数学模型。 如你所说, HashSet确实使用HashMap来支持其实现。 但是,它实现了完全不同的界面。 当您正在寻找什么将是您的目的最好的Collection ,本教程是一个很好的起点。 如果你真的想知道发生了什么, 那还有一本书 。 They are entirely different constructs. A HashM ...
-
你对HashMap的行为是正确的,但你对HashSet的实现是错误的。 HashSet在内部由HashMap支持,但是您添加到HashSet的元素将用作支持HashMap的键。 对于该值,使用虚拟值。 因此, HashSet的contains(element)只是调用后备HashMap的containsKey(element) 。 You are correct regarding the behavior of HashMap, but you are wrong about the implementa ...
-
谈论他们打算使用的实际方式,不! 对于关系A-> B 但是,当我需要创建“一对多”关系时,我会诉诸于 HashMap> 这样做确实对关系的来源施加了独特的限制。 为了避免这种情况,可以使用HashMap反向映射它 HashMap 在多对多关系中,没有可用于访问一对元素的唯一键。 所以这基本上意味着整个数据集只是一个数据对列表。 List<{A,HashSet}> WrapperObject具有属性标识符HashSet <>。 这里的标识符不一定是唯一的 ...
-
因为HashSet使用HashMap。 它必须承担使用HashMap的成本,加上HashSet本身的开销。 Because HashSet uses a HashMap. It must incur the cost of using a HashMap, plus the overhead of the HashSet itself.
-
LinkedHashMap vs HashMap,LinkedHashSet vs HashSet(LinkedHashMap vs HashMap, LinkedHashSet vs HashSet)[2022-10-31]
保持插入顺序与其相关的成本,无论是在需要更多的内存和额外的CPU周期: 您需要额外的内存来保留额外的链接, 您需要额外的CPU周期来维护它。 虽然渐近的复杂性是相同的,但增加的便利性不是免费的。 如果您不需要维护插入顺序,则不必为其付费,而是使用轻量级HashSet和HashMap 。 Keeping the insertion order has its associated costs, both in terms of needing more memory, and spending ...