名人名言

昨日翻译

“The first step toward success is taken when you refuse to be a captive of the environment in which you first find yourself.”——Mark Caine

当你开始认识你自己,并且不再被环境所束缚时,你已经开始走向成功了。——马克·凯恩


今日名言

“When one door of happiness closes, another opens; but often we look so long at the closed door that we do not see the one which has been opened for us.

——Helen Keller

问题及解析

2019.04.03问题及解析

2019/4/3的解析由于我的失误,编写出现了错误,因此今天重新整理,很多小伙伴也指出了错误,指出的小伙伴们都是真正学会了,这里给大家点一个赞!所以大家一定要看评论区呀!古话说的好,尽信书不如无书,小编也是人,也会犯错,我也在和你们同步做题,你们当中比我厉害的人也有很多,我也和你们一样会偷懒会犯错,犯了错就改正,每天坚持会让我们的知识库越来越丰富,大家一起继续坚持努力学习!

题目

关于HashMap与HashTable,下面哪种说法不正确()

A.Hashtable允许null值作为key和value,而HashMap不可以

B.迭代HashMap采用快速迭代机制,而Hashtable不是

C.两者都是通过key-value方式获取数据

D.HashMap不是同步的,而Hashtable是同步的。

答案与解析

1.相关知识

HashMap

①API中HashMap的第一句描述中就点出了它与Hashtable的一些重要区别

Hash table based implementation of the Map interface. This implementation provides all of the optional map operations, and permits null values and the null key. (The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.)

Hashtable基于Map接口的实现,这个实现提供了所有map的业务操作,并且允许空值和空键(HashMap类可以粗略的与Hashtable等价,除了Hashtable是不同步的并且能够允许使用空值)

上面是昨天的解读,我们一起来解析昨天到底是哪里错误了导致了我们判断错误,前两个单词的解读很关键,也是我昨天总体被误导的一个核心点,另外一方面也反应出了我对HashMap和Hashtable的不熟悉,昨天误把Hash table翻译成了Hashtable,它是两个单词,H的大写是因为是首字母

因此前两个单词应该是hash table它指的的是哈希表,而不是Hashtable类,因此这里说的是我们的HashMap类是由我们哈希表的数据结构基于Map接口的实现,而不是Hashtable类基于Map接口的实现。

这个实现(HashMap)提供了所有map的业务操作,并且允许空值和空键。(HashMap类可以粗略的与Hashtable等价,除了HashMap是不同步的并且允许空值)

②看看API中对于两者中关于迭代器的描述。(这里有一些断章取义,我们就整体的来看一看它,确实蛮偷懒的哈哈)

HashMap Note that this implementation is not synchronized. If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more mappings; merely changing the value associated with a key that an instance already contains is not a structural modification.) This is typically accomplished by synchronizing on some object that naturally encapsulates the map. If no such object exists, the map should be "wrapped" using the Collections.synchronizedMap method. This is best done at creation time, to prevent accidental unsynchronized access to the map: Map m = Collections.synchronizedMap(new HashMap(...)); The iterators returned by all of this class's "collection view methods" are fail-fast: if the map is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove method, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.

Note that the fail-fast behavior of an iterator cannot be guaranteed as it is, generally speaking, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification. Fail-fast iterators throw ConcurrentModificationException on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect bugs.

This class is a member of the Java Collections Framework.

需要注意这个实现是不同步的。(这句话在API中还加粗了,可见上期有多么一本正经的胡说八道。)如果多线程同时进入一个哈希图,其中一个线程修改了图的结构,它外部一定必须是同步的。(一个结构的修改是进行添加、删除一个或者多个映射;仅仅是改变一个实例已经包含的键值关联并不算是结构的修改)实现外部的同步通常是通过一些原本就包括Map成员的对象通过自身的同步来完成的。

如果没有这样的同步对象存在,最好在创建的时候这样做,来预防意外的不同步进入到我们的图中:

Map m = Collections.synchronizedMap(new HashMap(...));

所有的HashMap的“集合视图方法”返回的迭代器都是快速失败的:如果在迭代器创建完成之后对图的结构进行了修改,那么除非通过迭代其自身的移除方法,这个迭代器将会抛出一个ConcurrentModificationException。

因此在面对同时修改的问题时,让这个迭代器快速干净的失败,比起我们在不确定的时间执行不可预料的行为时发生不可预知的风险要好。

需要注意的是迭代器的快速失败行为是不能够保证的,通常来说,当存在不同步的同步修改时,它是不可能被明确保证的。

快速失败的迭代器会在最好的情况基础下抛出同步修改异常。因此程序为了程序的正确性,依赖于这个异常来编写程序是错误的:迭代器的快速失败行为应该仅仅在我们检测bug的时候进行使用。

这个类时java集合框架中的一个成员。


Hashtable

This class implements a hash table, which maps keys to values. Any non-null object can be used as a key or as a value.

这个类通过键到值的映射实现了一个哈希表,任何不为空的对象能够被作为键或者值。

The Enumerations returned by Hashtable's keys and elements methods are not fail-fast.

通过枚举返回Hashtable的建和值的方法都不是快速失败的。

总结

因此这里的这部分文段的目的是告诫我们要谨慎的编写修改map的结构的代码,以及当我们需要对HashMap操作时,最好通过同步类包裹的形式或者使用Collections中的synchroniazedMap来创建HashMap,这样就能避免发生同步的问题,同时因为异常的抛出是不能够明确保证的,所以我们应该避免编写依赖于同步异常的代码,而是只在检测bug的时候来使用它。

HashMap使用迭代器迭代,而Hashtable可以使用迭代器或枚举进行迭代,当使用枚举进行迭代时它就不是快速迭代的。

2.答案解析

A选项:

HashMap允许使用空值,Hashtable不允许。错误。(可以记一辈子了哈哈)

B选项:

Hashtable使用枚举迭代时没采用快速迭代的机制(其实这里题目都不算很严谨)

C选项:

两者都是通过键值对的形式使用获取数据的。正确

D选项:

Hashtable是同步的,HashMap是不同步的。正确

因此答案选A。

2019.04.04题目及解析

题目

public class ListTest {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(1);Set<Integer> set = new HashSet<>();set.add(1);set.add(2);set.add(1);System.out.println(list.size() + "," + set.size());}
}

请问运行后会输出什么结果?

A.2,2

B.2,3

C.3,2

D.3,3

答案与解析

1.相关知识

①ArrayList:

Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null. In addition to implementing the List interface, this class provides methods to manipulate the size of the array that is used internally to store the list. (This class is roughly equivalent to Vector, except that it is unsynchronized.)

实现了List接口的可变尺寸数组。实现所有的list操作方法,并且允许所有的元素,包括空值。除了实现List接口外,这个类提供了方法来修改数组的尺寸,便于内部的存储列表(这个类可以粗略的与Vector类等价,除了它是不同步的。)

也就是说ArrayList是一个可以改变尺寸的数组,因此我们可以通过下标来获取它的值,并且可以对它进行扩展,同时它是不同步的,但与它类似的Vector类是同步的,我们需要考虑多线程访问时可以考虑使用Vector

②HashSet:

This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. This class permits the null element.

这个类实现了Set接口,底层是一个哈希表(实际上是一个HashMap实例)。它不能够保证这个集合的迭代器顺序;特别是它不能够保证在一段时间过后还保留原来的顺序。这个类允许空值。

由于它的底层是一个HashMap,因此它允许空值空键。在底层HashMap中Set传递的值时作为键传递的,因此它重复添加是不会添加到HashSet中的,键必然只能存在一个。

2.源码分析

首先实例化了一个ArrayList类添加了元素1,2,1

实例化了一个HashSet类添加了元素1,2,1

输出两个集合中元素的个数。

3.答案解析

因为ArrayList中会完整的存储完整的1,2,1并且分别在0,1,2的位置

而HashSet中添加重复的键相当于并没有添加,因此最终存储了两个元素

因此集合中元素的个数分别为3,2

最终输出的结果也就是3,2,因此选C

2019.04.05问题

题目

(a != 1 && a != 2 && a != 3 && a!=4)

请问a的值为多少时,上面的表达式返回false

A.2

B.4

C.6

D.2,4

E.2,4,6

往期回顾

java每日一练(19_04_03)|HashMap、Hashtable

java每日一练(19_04_02)|instanceof关键字

java每日一练(19_04_01)

java每日一练(19_03_31)

java每日一练(19_03_30)

java每日一练(19_03_29)  (不定项选择题)

java每日一练(19_03_28)

java每日一练(19_03_27) (web服务器)

java每日一练(19_03_26) (程序的输出结果)

加入我们吧~

眼过千遍,不如手过一遍,一定一定要把自己的想法写出来(想法不论对错,写你所想就是进步),这样才会有所收获,你的每一个留言和分享小刀都会认真回复,彼此学习共同进步~

小刀和小伙伴在学习群里

等你来一起监督学习哦,坚持!加油!

进群请加小刀微信: best396975802

END

微信群请点击公众号菜单进微信群

文字|天堂

排版|花音

你点的每个在看,我都认真当成了喜欢

java每日一练(19_04_05)|逻辑表达式 !=、相关推荐

  1. java每日一练:面试题集合

    6.29:1.说一下jdk和jre的区别? JRE是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的 ...

  2. 【蓝桥Java每日一练】—————一周中的第几天

    ⭐️引言⭐️ 大家好啊,我是执梗.蓝桥杯已经定下今年4月9号开始省赛,为了和兄弟们一起锻炼,特意开启这个Java组每日一题专栏.每天和大家一起锻炼,也会时不时蓝桥真题专题序章,没了解过的兄弟可以看看- ...

  3. Java每日一练(1)

    1.实现一个数字加密器,加密规则是:     加密结果 = (整数*10+5)/2 + 3.14159,加   密结果仍为一整数 package first.day; import java.util ...

  4. java每日一练——第六天:输入3个整数,输出它们的1次幂、2次幂和3次幂

    文章目录 题目描述 问题分析 代码实现 运行结果 网上参考 结语 题目描述 输入3个整数,输出它们的1次幂.2次幂和3次幂. 输出3行,每行3个整数,分别是它们的1次幂.2次幂和3次幂,每个整数占9列 ...

  5. java 每日一练——英雄怪兽文字攻击实例(每步都有解释)

    游戏要求: 进入游戏后有3名英雄供玩家选择,玩家也可以手动选择或随机选择一个英雄. 技能分为:物理伤害技能和法术伤害技能. 每个英雄有三个技能.一把武器. 怪物有三个技能.一个能量盾(吸收物理或法术伤 ...

  6. Java每日一练(4)

    1.求1~100之间不能被3整除的数之和 package com.etc.four.day;public class Translation {public static void main(Stri ...

  7. java每日一练——第四天:输入两个整数num1和num2,请你设计一个程序,计算并输出它们的和、差、积、整数商及余数。

    文章目录 题目描述 问题分析 代码实现 运行结果 网上参考 结语 题目描述 输入两个整数num1和num2,请你设计一个程序,计算并输出它们的和.差.积.整数商及余数. 输入 输入只有两个正整数num ...

  8. java每日一练——第三天:对用户输入的任一整数,输出以下多项式的值。 y=2x2+x+8

    文章目录 题目描述 问题分析 代码实现 运行结果 网上参考 结语 题目描述 对用户输入的任一整数,输出以下多项式的值. y=2x2+x+8 问题分析 需要注意的是 Java中使用Scanner处理输入 ...

  9. C/JAVA 每日一练——零基础学习动态规划

                    目录 ​ 第一题:斐波那契数列 解题思路: 代码实现 2.爬楼梯 力扣https://leetcode-cn.com/problems/climbing-stairs/ ...

  10. java每日一练——第九天:美元和人民币

    文章目录 题目描述 问题分析 代码实现 运行结果 网上参考 结语 题目描述 美元越来越贬值了,手上留有太多的美元似乎不是件好事.赶紧算算你的那些美元还值多少人民币吧.假设美元与人民币的汇率是1美元兑换 ...

最新文章

  1. Kruskal HDOJ 1233 还是畅通工程
  2. MySQL基本操作——增删查改
  3. kubernetes(七)项目部署方式:蓝绿部署,灰度发布/金丝雀发布,滚动更新
  4. python对象的三个属性_Python 对象属性的访问
  5. html下移,jQuery实现元素的上移下移删除
  6. python内置高阶函数_map()函数~~内置的高阶函数
  7. Bailian3254 约瑟夫问题No.2【模拟】
  8. 解决Mac osx AirPort: Link Down on en1. Reason 8 (Disassociated because station leaving)
  9. tomcat普通用户启动不了
  10. win7托盘区没有蓝牙图标
  11. 王家林人工智能AI第15课:通过SVM进一步改进在Social Network上销售汽车推荐系统的精准性 老师微信13928463918
  12. LINUX IIO子系统分析之一 IIO子系统概述
  13. 使用NAT打造FTP服务新法
  14. 远程桌面全屏无法退出
  15. 双模控制器很耗电_电动车双电双核控制系统是在说什么?这个部件的发展一日千里!...
  16. 加速度传感器的应用(检测打滑)——利用传感器检测智能车加速度及速度全面解析方案
  17. 云信小课堂|如何实现音视频安全检测?
  18. python 从windows移植到linux后,ImportError:No module named xxxx
  19. Win32汇编环境配置
  20. 联想Miix5安装Linux后WIFI设备无法识别问题

热门文章

  1. 北上广深也不相信口水
  2. 【项目技术点总结之二】微信小程序中集成antvF2进行图表开发
  3. Java毕业设计——>SpringBoot+VUE实现的前后端分离小米手机商城系统
  4. 塔尔寺景点门票销售管理系统
  5. Linux里怎么打开pt文件,在 Linux 上安装 transmission 进行远程 PT 下载
  6. linux系统windows模拟器下载,Linux开源模拟器Wine 0.9.54版下载
  7. 《javascript设计模式与开发实践》——第一章(面向对象的javascript)学习记录
  8. java助理工程师主要做什么工作,Java助理工程师面试的惨痛教训
  9. C++实现推箱子游戏
  10. hao123.com 360浏览器等主页被劫持的解决方法