首页 \ 问答 \ JAVA有多难学?

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是Map接口的实现类,其中HashTable的键或值不能为null,HashMap的键或值可以为null;HashTable是线程安全的,HashMap是线程不安全的,因此HashMap的效率要比HashTable高。HashSet是Set接口的实现类,它里面的元素都是无序的。 HashMap,HashTable 用法: Map map=newHashMap();或者HashMap map=newHashMap(); map.put("A","a");----> ...
  • map是一个接口,而HaspMap是它下面的一个实现类
  • map是一个接口,而HaspMap是它下面的一个实现类
  • 地图保存唯一的键。 当您使用映射中存在的键调用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.
  • 保持插入顺序与其相关的成本,无论是在需要更多的内存和额外的CPU周期: 您需要额外的内存来保留额外的链接, 您需要额外的CPU周期来维护它。 虽然渐近的复杂性是相同的,但增加的便利性不是免费的。 如果您不需要维护插入顺序,则不必为其付费,而是使用轻量级HashSet和HashMap 。 Keeping the insertion order has its associated costs, both in terms of needing more memory, and spending ...

相关文章

更多

最新问答

更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)