「java面试map」java面试冒泡排序
本篇文章给大家谈谈java面试map,以及java面试冒泡排序对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、面试中如何回答HashMap的工作原理
- 2、java中HashMap和HashTable面试题问题,为什么hashmap是属于异步的呢?并且异步的hashmap为什么适合单线程
- 3、从一个面试开始来谈Map 的初始容量
- 4、如果你是一个 Java 面试官,你会问哪些问题?
- 5、润和java开发实习面试问什么
- 6、求Java面试时List,Map,异常的经典回答!
面试中如何回答HashMap的工作原理
用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们
内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何
设计。
有没有有顺序的Map实现类,如果有,他们是怎么保证有序的。
hashmap的实现原理,
下面是自己的总结:
存储结构:
里面存储的是一个entry数组,每个数组元素中的结构是一个entry链表
Entry是map中的一个静态内部类,其中的变量有:key,value,hashcocd,下一个Entry
什么是hash?
又称散列,将任意长度的输入通过散列算法转换成固定长度的输出,该输出就是散列值。这是一种压缩映射,散列值的空间通常远小于输出的空间。不同的输入有可能会散列出相同的输出,因此不能从散列值来确定唯一的输入值。这也是为什么比较两个对象不能仅仅使用hashcode方法比较的原因。
hash碰撞:
对不同的值进行hash运算生成了相同的散列值。这个是不可避免的,但是我们需要尽量的减少其带来的损失。
(1)设计好的hash算法让其尽可能的分布均匀
hashmap中的hash算法解析
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h 16);
}
让key的hashcode本身与它右移16位异或,是为了让它的高位与低位混合,增加低位的随机性,同时也变相保持了高位的特征
计算元素位置的算法:
int index = hash (arrays.length-1);
那么这也就明白了为什么HashMap的数组长度是2的整数幂。比如以初始长度为16为例,16-1 = 15,15的二进制数位00000000 00000000 00001111。可以看出一个基数二进制最后一位必然位1,当与一个hash值进行与运算时,最后一位可能是0也可能是1。但偶数与一个hash值进行与运算最后一位必然为0,造成有些位置永远映射不上值。
对于null值的处理
hashmap是接受null值的,null值被放在数组的第一个元素当中,取出来的时候怎么处理呢?
hashmap的工作原理?
它的里面有一个Entry数组,在put时我们先根据key值计算出hashcode,进而计算出该元素在数组中的位置,将健值对封装在Map.Entry对象中,然后存储在数组中
若产生hash冲突怎么办?
每个数组元素的位置都是一个链表结构,若计算出来的hashcode相同则将元素追加到该链表当中,这是hashmap的处理方式
在取元素的时候,先计算key值对应的hashcode ,找到元素所在的位置,然后调用key的equals方法去遍历链表,最后找到元素
还有哪些解决hash冲突的方法?
开放定址法
这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。
再哈希法
这种方法是同时构造多个不同的哈希函数:
Hi=RH1(key) i=1,2,…,k
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。
链地址法
这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
建立公共溢出区
这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
默认的负载因子0.75
当map的大小超过当前容量的百分之75时会进行自动扩容,会将原来的对象重新放到新的数组中
rehash 的过程是什么样子的?
说白了就是先resize,生成一个新的Entry数组,再transfer将原数组中的值重新计算index放入新的数组中,然后改变阈值为新的长度x负载因子
如果key为null,这始终会被散列到table[0]的桶中,即使是rehash的过程也是一样。非null的key也有可能会被散列到table[0]的位置,例如上图中key=“f”,而且相同的key在在不同的时间可能会被散列到不同的位置,这与rehash有关。
这个过程中容易发生什么问题呢?
容易产生条件竞争,如果在扩容的过程中put数据,会造成意想不到的结果。或者如果两个线程都触发了扩容,也会存在问题
这块有没有遇到过什么比较好的例子?
jdk1.8以后改成了红黑树,为什么?说一下红黑树的原理?
hashmap与hashtable的区别?
HashTable和HashMap的实现原理几乎一样,差别无非是
HashTable不允许key和value为null
HashTable是线程安全的
但是HashTable线程安全的策略实现代价却太大了,简单粗暴,get/put所有相关操作都是synchronized的,这相当于给整个哈希表加了一把大锁。
多线程访问时候,只要有一个线程访问或操作该对象,那其他线程只能阻塞,相当于将所有的操作串行化,在竞争激烈的并发场景中性能就会非常差。
篇幅有限,未完待续
java中HashMap和HashTable面试题问题,为什么hashmap是属于异步的呢?并且异步的hashmap为什么适合单线程
摘抄的,学到了
HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分。Hashtable和HashMap在Java面试中相当容易被问到,甚至成为了集合框架面试题中最常被考的问题,所以在参加任何Java面试之前,都不要忘了准备这一题。
这篇文章中,我们不仅将会看到HashMap和Hashtable的区别,还将看到它们之间的相似之处。
HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
HashMap不能保证随着时间的推移Map中的元素次序是不变的。
要注意的一些重要术语:
1) sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。
2) Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出IllegalArgumentException异常。
3) 结构上的更改指的是删除或者插入一个元素,这样会影响到map的结构。
我们能否让HashMap同步?
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);
结论
Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap吧。
原文链接: Javarevisited 翻译: ImportNew.com - 唐小娟
译文链接:
从一个面试开始来谈Map 的初始容量
从一个面试开始的Map
以下是面试我的面试题。
1、你使用java多久了,在使用java过程中,你和我说一下java 的基本类型,int占用几个字节,它的最大值是多少(用幂指函数形式表示就可以)为什么?
答:byte、short、int。。。。布拉布拉。4个字节,最大是2^31-1(其他的同学面试者回答多少的都有,还有回答是-128--127 的,这个让我真的是一口老血喷出来啊,当时我就说那就是说int a = 1000,这样赋值是不对的喽?)
3、那你在工作中使用过HashMap吗?你可以和我谈谈它吗?
答:key-value形式,线程不安全等等,key可以为null,等等xxxxx
4、那你知道它的初始容量是多少吗?那要是我使用Map map = new HashMap(12);这个在什么时候开始扩容的?
答:初始容量是16,在 12*0.75=9的时候开始扩容 ,这个同学开始一顿 什么加载因子啦一大堆开始了。
5、接着我又问 如果要是 Map map = new HashMap(11);这个在什么时候开始扩容,这时候面试者语塞了,因为他发现11*075 好像是不知道是多少了,乘出来的不是一个整数,这下子就完全懵逼了。其实的话面试过程中Map这个类有很多的问题要问,但是今天我先和大家来一起讨论以下这个
接下来开始上答案,以jdk1.8版本为例。
其实我们在初始创建一个HashMap 的时候,当我们不给任何参数的时候,各个参数都会使用默认的值。
当我们在初始化 HashMap 的时候,传入相应容量的时候,其实这时候会在 调用 tableSizeFor(int cap) 这个方法,这个方法总会返回2^n 的值。
从下面这个方法可以看出来,你自己可以定义一个扩容因子,例如:MapString,Object map = new HashMapString,Object(11,0.45f); 但是建议是使用默认的0.75,在这里不做解释为什么,可以自己出门左转 输入 之后查查为什么使用0.75。
例如一个数字5,在 二进制中的表示方式是 00000000 00000000 00000000 00000101 ,通过下面的方法是 首先将本上的值减去1,然后不停的右移或上本身的值,这样就是所有的位上都是会1,然后在在通过n+1之后一定是一个2^n 的结果。这就是为什么在开始的时候要减去1的原因。
这样即使是你传入的是一个11,或者是一个其他数的值,那么它开始扩容的时候一定是 2^n * 0.75(这里假如你用的是默认的扩容因子)。
如果你是一个 Java 面试官,你会问哪些问题?
1、谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?考点分析:对于这类笼统的问题,你需要尽量表现出自己的思维深入并系统化,Java 知识理解得也比较全面,一定要避免让面试官觉得你是个“知其然不知其所以然”的人。毕竟明白基本组成和机制,是日常工作中进行问题诊断或者性能调优等很多事情的基础,相信没有招聘方会不喜欢“热爱学习和思考”的面试者。回归正题,对于 Java 平台的理解,可以从很多方面简明扼要地谈一下,例如:Java 语言特性,包括泛型、Lambda 等语言特性;基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库。对于我们日常工作应用较多的类库,面试前可以系统化总结一下,有助于临场发挥。2、对比Hashtable、HashMap、TreeMap有什么不同?考点分析:上面的回答,只是对一些基本特征的简单总结,针对Map相关可以扩展的问题很多,从各种数据结构、典型应用场景,到程序设计实现的技术考量,尤其是在Java 8里,HashMap本身发生了非常大的变化,这些都是经常考察的方面。很多朋友向我反馈,面试官似乎钟爱考察HashMap的设计和实现细节,所以今天我会增加相应的源码解读,主要专注于下面几个方面:理解Map相关类似整体结构,尤其是有序数据结构的一些要点。从源码去分析HashMap的设计和实现要点,理解容量、负载因子等,为什么需要这些参数,如何影响Map的性能,实践中如何取舍等。理解树化改造的相关原理和改进原因。除了典型的代码分析,还有一些有意思的并发相关问题也经常会被提到,如HashMap在并发环境可能出现无限循环占用CPU、size不准确等诡异的问题。我认为这是一种典型的使用错误,因为HashMap明确声明不是线程安全的数据结构,如果忽略这一点,简单用在多线程场景里,难免会出现问题。理解导致这种错误的原因,也是深入理解并发程序运行的好办法。对于具体发生了什么,你可以参考这篇很久以前的分析,里面甚至提供了示意图,我就不再重复别人写好的内容了。3、Java 提供了哪些 IO 方式? NIO 如何实现多路复用?考点分析:在实际面试中,从传统 IO 到 NIO、NIO 2,其中有很多地方可以扩展开来,考察点涉及方方面面,比如:基础 API 功能与设计, InputStream/
润和java开发实习面试问什么
关于Java面试,一般应该会问到下面这些问题。
[编程工具]
你常用的编程工具有哪些?这个问题主要是考察你工作的专业性,你是不是具有大型项目的工作经验.
一般好的,Java的编程工具,你比如说,Eclipse, netbeans, Intelli J 等等。
[局部变量和类变量的区别]
这个问题主要是考察选手对于scope的概念。回答这个问题,
就是局部变量是在方法里面定义的。这个变量只能在方法内部才可以被调用。
类变量呢,可以在类的内部,任何地方都可以被调用。类变量还可以添加一些修饰符,限制或者允许外部类调用。
[什么是继承? ]
继承就是说子类可以享有父类的一些定义。
[什么是封装?]
封装是通过类定义的方式,把一些方法和数据包裹起来。
[什么是多态?]
多态是指一个对象可以通过具体的引用类型来调用父类和子类的一些方法。
这三个问题主要是考察选手对于面向对象编程的概念。
[ Overriding 和 overloading的区别]
这两种方法在编程中会经常用到。被问的可能性非常大。
Overriding主要用在子类要使用父类的一些方法定义。方法名必须相同,方法参数必须相同, 返回值类型必须相同。使用这种方法, 子类既可以调用父类的方法也可以添加自己个性化的实现。
Overloading主要用在方法这一层次上。具有同样的方法名,不同的参数类型, 可能会返回不同的数据类型。
[接口和抽象的区别?]
这个问题在面向对象编程里面也是经常被问到的一个问题。
在Java中,无法实现多类继承,所以就引入了接口的概念。接口中,主要是类的声明,没有实现内容。
抽象类中至少要含有一个抽象方法。这个抽象方法只有声明没有实现。抽象类的非抽象方法,需要有实现内容。
[说一下访问修饰符]
这也是面向对象编程里面非常重要的一个概念。
private, protected, public。没有修饰符,就是default。
private只能在本类内部访问。
protected在本类和子类中访问。
public在其他类中都可访问。
default在包内可访问。
[数组和数组列表的区别?]
[String, StringBuilder, StringBuffer的区别? ]
string不可修改。
string builder可修改,线程不安全的。
string buffer可修改,线程安全的。
[HashMap, HashTable 的区别? ]
都是字典类型。
hash map 是线程不安全的。
hash table 是线程安全的。
[Set 相关的问题]
Set里面的数据是唯一的。
sorted set是可排序的。
[Queue 相关的问题]
priority queue先进先出。
[Map相关的问题]
有hash map, linked hash map, tree map.
求Java面试时List,Map,异常的经典回答!
List有序key和value都能重复;
List --其中的值允许重复,因为其为有序的数据结构;
List按对象进入的顺序保存对象,不做排序或编辑操作。
Map无序(除treeMap) key 必须唯一 value 可以重复 ;
Map--成对的数据结构,健值必须具有唯一性(键不能同,否则值替换);
Map同样对每个元素保存一份,但这是基于"键"的,Map也有内置的排序,因而不关心元素添加的顺序。
关于java面试map和java面试冒泡排序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-29,除非注明,否则均为
原创文章,转载请注明出处。