阿里Java研发面试题『八部曲』——从必须掌握的Hash table开始

告别Multisim!用ADS搞定NPN三极管(2N2222)的直流偏置与瞬态仿真 本文详细介绍了如何从Multisim迁移到ADS进行2N2222三极管的直流偏置与瞬态仿真。通过模型转换、参数映射和仿真环境配置,展示了ADS在共射放大器设计中的高级功能与优势,包括自动化偏置设计和更精确的瞬态仿真结果,助力工程师提升高频电路设计效率与精度。 阅读详情

1、HashMap、HashTable、ConcurrentHashMap的区别

HashMap和HashTable都实现了Map接口,里面存放的元素不保证有序,并且不存在相同元素;

区别(线程安全和保存值是否为null方面):

(1) HashMap和HashTable在功能上基本相同,但HashMap是线程不安全的,HashTable是线程安全的;

HashMap的put源码如下:

public V put(K key, V value) {
	if (table == EMPTY_TABLE) {
		inflateTable(threshold);
	}
	if (key == null)
	            return putForNullKey(value);
	//说明key和value值都是可以为null
	int hash = hash(key);
	int i = indexFor(hash, table.length);
	for (Entry<K,V> e = table[i]; e != null; e = e.next) {
		Object k;
		if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
			V oldValue = e.value;
			e.value = value;
			e.recordAccess(this);
			return oldValue;
		}
	}
	modCount++;
	addEntry(hash, key, value, i);
	return null;
}

(2)可以看到,HashMap的key和value都是可以为null的,当get()方法返回null值时,HashMap中可能存在某个key,只不过该key值对应的value为null,也有可能是HashM中不存在该key,所以不能使用get()==null来判断是否存在某个key值,对于HashMap和HashTable,提供了containsKey()方法来判断是否存在某个key。

HashTable的put源码如下:

public synchronized V put(K key, V value) {
	// Make sure the value is not null
	if (value == null) {
		//当value==null的时候,会抛出异常
		throw new NullPointerException();
	}
	// Makes sure the key is not already in the hashtable.
	Entry tab[] = table;
	int hash = hash(key);
	int index = (hash & 0x7FFFFFFF) % tab.length;
	for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
		if ((e.hash == hash) && e.key.equals(key)) {
			V old = e.value;
			e.value = value;
			return old;
		}
	}
	modCount++;
	if (count >= threshold) {
		// Rehash the table if the threshold is exceeded
		rehash();
		tab = table;
		hash = hash(key);
		index = (hash & 0x7FFFFFFF) % tab.length;
	}
	// Creates the new entry.
	Entry<K,V> e = tab[index];
	tab[index] = new Entry<>(hash, key, value, e);
	count++;
	return null;
}

(3)HashTable是不允许key和value为null的。HashTable中的方法大部分是同步的,因此HashTable是线程安全的。

拓展:
(1) 影响HashMap(或HashTable)性能的两个因素:初始容量和load factor;

HashMap中有如下描述: When the number of entries in the hash table exceeds the product of the load factor and the current capacity,

the hash table is rehashed (that is, internal data structures are rebuilt)

当我们Hash表中数据记录的大小超过当前容量,Hash表会进行rehash操作,其实就是自动扩容,这种操作一般会比较耗时。所以当我们能够预估Hash表大小时,在初始化的时候就尽量指定初始容量,避免中途Hash表重新扩容操作,如:

HashMap<String, Integer> map = new HashMap<String, Integer>(20);

(类似可以指定容量的还有ArrayList、Vector)

(2)使用选择上,当我们需要保证线程安全,HashTable优先选择。当我们程序本身就是线程安全的,HashMap是优先选择。

其实HashTable也只是保证在数据结构层面上的同步,对于整个程序还是需要进行多线程并发控制;在JDK后期版本中,对于HashMap,可以通过Collections获得同步的HashMap;如下:

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

这种方式获得了具有同步能力的HashMap。

(3)在JDK1.5以后,出现了ConcurrentHashMap,它可以很好地解决在并发程序中使用HashMap的问题,ConcurrentHashMap和HashTable功能很像,不允许为null的key或value,但它不是通过给方法加synchronized方法进行并发控制的。

在ConcurrentHashMap中使用分段锁技术Segment,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问,能够实现真正的并发访问。效率也比HashTable好的多。

2、TreeMap、HashMap、LinkedHashMap的区别

关于Map集合,前面几篇都有讲过,可以去回顾一下。而TreeMap、HashMap、LinkedHashMap都是Map的一些具体实现类,其关系图如下:

其中,HashMap和HashTable主要区别在线程安全方面和存储null值方面。HashMap前面讨论的已经比较多了,下面说说LinkedHashMap和TreeMap。

(1)LinkedHashMap保存了数据的插入顺序,底层是通过一个双链表的数据结构来维持这个插入顺序的。key和value都可以为null;
(2)TreeMap实现了SortMap接口,它保存的记录是根据键值key排序,默认是按key升序排列。也可以指定排序的Comparator。

HashMap、LinkedHashMap和TreeMap都是线程不安全的,HashTable是线程安全的。提供两种遍历Map的方法如下:

(1)推荐方式:

Map<String, Integer> map = new HashMap<String, Integer>(20);
for (Map.Entry<String, Integer> entry : map.entrySet()){
	//直接遍历出Entry
	System.out.println("key-->"+entry.getKey()+",value-->"+m.get(entry.getValue()));
}

这种方式相当于首先通过Set<Map.Entry<String,Integer>> set = map.entrySet();方式拿到Set集合,而Set集合是可以通过foreach的方式遍历的。

(2) 普通方式:

Map<String, Integer> map = new HashMap<String, Integer>(20);
Iterator<String> keySet = map.keySet().iterator();
//遍历Hash表中的key值集合,通过key获取value
while(keySet .hasNext()){
	Object key = keySet .next();
	System.out.println("key-->"+key+",value-->"+m.get(key));
}

3、Collection包结构,与Collections的区别。

Collection的包结构如下:

Statck类为Vector的子类。由于Collection类继承Iterable类,所以,所有Collection的实现类都可以通过foreach的方式进行遍历。

Collections是针对集合类的一个帮助类。提供了一系列静态方法实现对各种集合的搜索、排序、线程完全化等操作。

当于对Array进行类似操作的类——Arrays。

如,Collections.max(Collection coll); 取coll中最大的元素。

Collections.sort(List list); 对list中元素排序

4、OOM你遇到过哪些情况,SOF你遇到过哪些情况

OOM:OutOfMemoryError异常,

即内存溢出,是指程序在申请内存时,没有足够的空间供其使用,出现了Out Of Memory,也就是要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

内存溢出分为上溢和下溢,比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。

有时候内存泄露会导致内存溢出,所谓内存泄露(memory leak),是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光,举个例子,就是说系统的篮子(内存)是有限的,而你申请了一个篮子,拿到之后没有归还(忘记还了或是丢了),于是造成一次内存泄漏。在你需要用篮子的时候,又去申请,如此反复,最终系统的篮子无法满足你的需求,最终会由内存泄漏造成内存溢出。

遇到的OOM:
(1)Java Heap 溢出
Java堆用于存储对象实例,我们只要不断的创建对象,而又没有及时回收这些对象(即内存泄漏),就会在对象数量达到最大堆容量限制后产生内存溢出异常。

(2)方法区溢出
方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。

异常信息:java.lang.OutOfMemoryError:PermGen space

方法区溢出也是一种常见的内存溢出异常,一个类如果要被垃圾收集器回收,判定条件是很苛刻的。在经常动态生成大量Class的应用中,要特别注意这点。

SOF:StackOverflow(堆栈溢出)

当应用程序递归太深而发生堆栈溢出时,抛出该错误。因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。

栈溢出的原因:

  • 递归调用
  • 大量循环或死循环
  • 全局变量是否过多
  • 数组、List、Map数据过大

OOM在Android开发中出现比较多:

场景有: 加载的图片太多或图片过大时、分配特大的数组、内存相应资源过多没有来不及释放等。

解决方法:
(1)在内存引用上做处理,软引用是主要用于内存敏感的高速缓存。在jvm报告内存不足之前会清除所有的软引用,这样以来gc就有可能收集软可及的对象,可能解决内存吃紧问题,避免内存溢出。什么时候会被收集取决于gc的算法和gc运行时可用内存的大小。
(2)对图片做边界压缩,配合软引用使用
(3)显示的调用GC来回收内存,如:

if(bitmapObject.isRecycled()==false) //如果没有回收 
bitmapObject.recycle();

(4)优化Dalvik虚拟机的堆内存分配

增强程序堆内存的处理效率

//在程序onCreate时就可以调用 即可
privatefinalstaticfloat TARGET_HEAP_UTILIZATION = 0.75f;
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

设置堆内存的大小

privatefinalstaticintCWJ_HEAP_SIZE = 6* 1024* 1024;
//设置最小heap内存为6MB大小
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);

(5)用LruCache 和 AsyncTask<>解决

从cache中去取Bitmap,如果取到Bitmap,就直接把这个Bitmap设置到ImageView上面。

如果缓存中不存在,那么启动一个task去加载(可能从文件来,也可能从网络)。

5、Java面向对象的三个特征与含义,多态的实现方式

Java中两个非常重要的概念:类和对象。类可以看做是一个模板,描述了一类对象的属性和行为;而对象是类的一个具体实现。Java面向对象的三大基本特征:
(1)封装
属性用来描述同一类事物的特征,行为用来描述同一类事物可做的一些操作。封装就是把属于同一类事物的共性(属性和行为)归到一个类中,只保留有限的接口和方法与外部进行交互,避免了外界对对象内部属性的破坏。Java中使用访问控制符来保护对类、属性、方法的访问。
(2)继承
子类通过这种方式来接收父类所有的非private的属性和方法(构造方法除外)。这里的接收是直接拥有的意思,即可以直接使用父类字段和方法,因此,继承相当于“扩展”,子类在拥有了父类的属性和特征后,可以专心实现自己特有的功能。
(构造方法不能被继承,因为在创建子类时,会先去自动“调用”父类的构造方法,如果真的需要子类构造函数特殊的形式,子类直接修改或重载自己的构造函数就好了。)
(3)多态
多态是程序在运行的过程中,同一种类型在不同的条件下表现不同的结果。比如:

Animal a = new Dog();
// 子类对象当做父类对象来使用,运行时,根据对象的实际类型去找子类覆盖之后的方法

多态实现方式:

  • 设计时多态,通过方法的重载实现多态;
  • 运行时多态,通过重写父类或接口的方法实现运行时多态;

6、interface与abstract类的区别

abstract class 只能被继承extends,体现的是一种继承关系,而根据继承的特征,有继承关系的子类和父类应该是一种“is-a”的关系,也即两者在本质上应该是相同的(有共同的属性特征)。

interface 是用来实现的implements,它并不要求实现者和interface之间在本质上相同,是一种“like-a”的关系,interface只是定义了一系列的约定而已(实现者表示愿意遵守这些约定)。所以一个类可以去实现多个interface(即该类遵守了多种约定)。

很多情况下interface和abstract都能满足我们要求,在我们选择用abstract火interface的时候,尽量符合上面的要求,即如果两者间本质是一样的,是一种“is-a”的关系,尽量用abstract,当两者之间本质不同只是简单的约定行为的话,可以选择interface。

特点:

  • abstract类其实和普通类一样,拥有有自己的数据成员和方法,只不过abstract类里面可以定义抽象abstract的方法(声明为abstract的类也可以不定义abstract的方法,直接当做普通类使用,但是这样就失去了抽象类的意义)。
  • 一个类中声明了abstract的方法,该类必须声明为abstract类。
  • interface中只能定义常量和抽象方法。在接口中,我们定义的变量默认为public static final类型,所以不可以在显示类中修改interface中的变量;定义的方法默认为public abstract,其中abstract可以不明确写出。

7、static class 与non static class的区别

static class–静态内部类,non static class–非静态内部类,即普通内部类

普通内部类:

内部类可以直接使用外部类的所有变量(包括private、静态变量、普通变量),这也是内部类的主要优点(不用生成外部类对象而直接使用外部类变量)。如下例子:

public class OutClass {
	private String mName = "lly";
	static int mAge = 12;
	class InnerClass{
		String name;
		int age;
		private void getName(){
			name = mName;
			age = mAge;
			System.out.println("name="+name+",age="+age);
		}
	}
	public static void main(String[] args) {
		//第一种初始化内部类方法
		OutClass.InnerClass innerClass = new OutClass().new InnerClass();
		innerClass.getName();
		//第二种初始化内部类方法
		OutClass out = new OutClass();
		InnerClass in = out.new InnerClass();
		in.getName();
	}
}

输出:

name=lly,age=12

可以看到,内部类里面可以直接访问外部类的静态和非静态变量,包括private变量。在内部类中,我们也可以通过外部类.this.变量名的方式访问外部类变量,如:name = OutClass.this.mName;

内部类的初始化依赖于外部类,只有外部类初始化出来了,内部类才能够初始化。

私有内部类(包括私有静态内部类和私有非静态内部类):

如果一个内部类只希望被外部类中的方法操作,那只要给该内部类加上private修饰,声明为private 的内部类只能在外部类中使用,不能在别的类中new出来。如上private class InnerClass{…},此时只能在OutClass类中使用。

静态内部类:
静态内部类只能访问外部类中的静态变量。如下:

public class OutClass {
	private String mName = "lly";
	static int mAge = 12;
	static class StaticClass{
		String name = "lly2";
		int age;
		private void getName(){
			//            name = mName;    //不能引用外部类的非静态成员变量
			age = mAge;
			System.out.println("name="+name+",age="+age);
		}
	}
	public static void main(String[] args) {
		//第一种初始化静态内部类方法
		OutClass.StaticClass staticClass = new OutClass.StaticClass();
		staticClass.getName();
		//或者直接使用静态内部类初始化
		StaticClass staticClass2 = new StaticClass();
		staticClass2.getName();
	}
}

输出:

name=lly2,age=12

可以看到,静态内部类只能访问外部类中的静态变量,静态内部类的初始化不依赖于外部类,由于是static,类似于方法使用,OutClass.StaticClass是一个整体。

匿名内部类:

匿名内部类主要是针对抽象类和接口的具体实现。在Android的监听事件中用的很多。如:

textView.setOnClickListener(new View.OnClickListener(){
	//OnClickListener为一个接口interface
	public void onClick(View v){
		...
	}
}
);

对于抽象类:

public abstract class Animal {
	public abstract void getColor();
}
public class Dog{
	public static void main(String[] args) {
		Animal dog = new Animal() {
			@Override
			            public void getColor() {
				System.out.println("黑色");
			}
		}
		;
		dog.getColor();
	}
}

输出:黑色

对于接口类似,只需要把abstract class 改为interface即可。

Java_supermanNO1

  • 每天花十分钟提升自己

推荐阅读

《Java面试宝典17章204题》

java面试题——详解HashMap和Hashtable 的区别 本篇文章主要介绍了java中HashMap和Hashtable的区别,具有一定的参考价值,有需要的可以了解一下。 立即下载

相关推荐

HashMap和HashTable底层原理以及常见面试题

今天小编就为大家分享一篇关于HashMap和HashTable底层原理以及常见面试题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

面试题:介绍下HashTable

(1):在hashmap方法上很多方法都是用synchronized修饰 (2):不允许键值为null (3):容量:HashMap底层数组长度必须为2的幂,这样做是为了hash准备,默认为16;而HashTable底层数组长度可以为任意值,这就造成了hash算法散射不均匀,容易造成hash冲突,默认为11; (4)继承关系:HashTable继承自Dictionary类;而HashMap继承自AbstractMap类; ②ConcurrentHashMap: ...

qq_45283095的博客 392

Win11下Android模拟器报HAXM未安装?三步搞定虚拟化配置(附终端命令)

本文详细解析了Win11下Android模拟器HAXM报错的解决方案,从虚拟化配置到终端命令实战。通过检查BIOS设置、调整Windows功能及执行PowerShell命令,三步搞定虚拟化配置问题,有效提升模拟器性能。特别针对Win11与HAXM的兼容性问题提供了专业指导。

weixin_29215815的博客 143

【学习笔记】JDK源码学习之HashTable(附带面试题)

花开一千年,花落一千年,花叶永不见!

小宝的博客 1111

aistudio高效解压zip文件的实用技巧

本文详细介绍了在百度AI Studio平台上高效解压ZIP文件的实用技巧。针对深度学习项目数据准备中的常见痛点,重点讲解了使用Python zipfile库和Linux unzip命令两种核心方法,并提供了路径设置、大文件处理、中文乱码等关键问题的解决方案,帮助用户提升数据处理效率。

salt的博客 784

Matlab生成dsp程序——环境搭建(c2000系列[F28335、F2837x]都适用)

一、环境配置 (28377D的操作是一模一样就是硬件设置的时候需要选择28377d进行相应的设置) 1)matlab与ccs联合编译需要安装对应的matlab版本和ccs版本,且只有2016a以上的matlab支持c2000系列。具体对应关系参照: http://software-dl.ti.com/ccs/esd/documents/ccs_matlab.html 2)matlab版本确定之后,还需要安装有关于ccs的相关软件: I、TI Code Composer Studio xxxx(对应

qq_42151264的博客 2万+

备战2024秋招面试题-HashMap和Hashtable(附联想笔试真题)

HashMap和HashTable的比较,同时还有新鲜的联想真题

奔走的王木木Sir的博客 1420

VS2017中调用gdal(C#版)的方法二(含gdal下载地址,配置过程,代码测试,超详细!!)

VS2017中gdal(C#)版的配置与测试 上次记录了直接在VS2017中下载并应用gdal的方法,这次来记录一下网上下载的安装包配置与测试的方法。 一、环境、版本及下载地址 win10,vs2017社区版,gdal2.4.4 还是像之前在Unity中应用gdal一样,最好是下载已经编译好的C#版的gdal,不然自己配置真的很容易出错,我就是这样的,下面提供不同版本的gdal下载地址: 1.GDAL2.4.4(C#版、64位): https://download.csdn.net/download/che

chengbaola的博客 1365

再不用担心面试官问 HashTable 和 HashMap 的区别了,2024年最新面试官突击一问

文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)

2401_83977626的博客 1073

【智能制造】- APS系列|05 APS 排产的五大底层算法逻辑

很多人误以为APS只是给生产工单排先后顺序,实则整套系统依托成熟算法体系,完成多维度约束下的最优生产决策在制造业数字化排产普及的当下,依旧有不少制造管理者对APS存在认知误区,将其等同于简易工单排序工具。事实上,专业级高级计划与排程系统,早已脱离单纯按时间排序的基础功能,而是依托一整套成熟完善的底层算法逻辑,整合现场各类生产限制条件,在海量变量中自动推演、筛选、输出最贴合企业经营目标的生产方案。

qq_40821260的博客 434

深度强化学习在机器人控制中的应用

非常感谢您提供如此详细的任务要求和约束条件。作为一位世界级的人工智能专家和计算机领域大师,我将全身心投入到这篇技术博客的撰写中。 深度强化学习在机器人控制中的应用 1. 背景介绍 近年来,随着人工智能技术的飞速发展,深度学习和强化学习在各个领域都得到了广泛应用,尤其是在机器人

AI天才研究院 1324

Java面试题一:HashMap和HashTable以及ConcurrentHashMap的原理和区别

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

qd520_1314的博客 927

六、Tool 工具系统:让大模型拥有“手脚“

我问你一个问题:大模型能不能告诉你"北京今天天气怎么样"?能——它能用非常流畅的中文回答你不能——它不知道这个答案因为它没有联网能力,也没有实时数据。它可能会自信地编一个"今天晴,25 度"给你——这就是幻觉。问题出在哪?大模型是一个"推理引擎",不是一个"执行引擎"。它知道天气 API 怎么调用,但不能真的发出 HTTP 请求。它知道 Python 代码怎么写,但不能真的运行代码。它知道数学公式,但做不了精确的大数计算。Tool 工具系统解决的,就是这个"最后一公里"问题。

牛肉胡辣汤 159

阿里Java研发面试题『八部曲』——用实力提升自己

欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。 1、String的split(String regex)方法参数注意点 使用这个方法时,当我们直接以“.”为参数时,是会出错的,如: String str = "12.03"; String[] res = str.spilt("."); //出错!!!...

玩赚AI大模型的博客 207

番外篇 | 复现HIC-YOLOv5,助力小目标物体的检测

在本文中提出了一种改进的YOLOv5算法:HIC-YOLOv5,用于小目标检测,具有更好的性能和较低的计算成本。🌈

小哥谈 1130

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

哈希表--面试题50-I、-II

面试题50-I 第一个只出现一次的字符 在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 示例: s = "abaccdeff" 返回 "b" s = "" 返回 " " 题解: 模式识别:涉及次数要考虑用哈希表,一般字符为key,下标为值(或依据题意为其它)。 具体步骤: 代码: class Solution { public: char firstUniqChar(string s) { map<char,int> hashmap;

qq_42647047的博客 450

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java 面试题:对比 Hashtable、HashMap、TreeMap 有什么不同?

在 Java 集合框架中,理解 Hashtable、HashMap 和 TreeMap 之间的区别对于任何希望编写高效代码的开发者来说都是至关重要的。尽管这三个类都用于存储键值对,但它们在特性和使用场景上却有着显著的差异。 Hashtable 是最早实现的哈希表之一,提供了线程安全的操作,但其性能因此受到影响。HashMap 随后被引入,它通过放弃同步方法,提供了更高性能和灵活性的替代方案,因此在大多数单线程应用中更受欢迎。TreeMap 则不同于基于哈希的实现,它确保键以排序的顺序存储,背后采用红黑树结

栗筝i的博客 3128

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

面试题-HashMap和HashTable的区别,并说明其底层实现数据结构

然而,在多线程环境下,如果不进行同步处理,可能会出现数据不一致的问题,例如数据丢失、重复插入或错误的查询结果。每次操作都需要锁定整个哈希表,这在高并发场景下可能导致性能瓶颈,尤其是在单线程环境下,这种同步机制显得尤为多余,会显著降低程序的运行效率。的性能更高,因为它没有同步开销。然而,在多线程环境下,如果不进行同步处理,可能会出现数据不一致的问题。时,线程需要等待锁的释放,这可能导致线程阻塞,进而影响程序的整体性能。,它在保证线程安全的同时,能够提供更高的性能,尤其是在高并发场景下。

931

Java常见面试题含答案之HashMap和HashTable(第三期)

HashMap

weixin_45969711的博客 455

Hashtable的特点(面试题)

import java.util.HashMap; /* * A:面试题 HashMap和Hashtable的共同点 底层都是哈希算法,都是双列集合 HashMap和Hashtable的区别 Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高 Hashtable不可以存储null键和null值,HashMa...

Limerence的博客 1330

JAVA大厂面试题-------HashMap和HashTable

HashMap和HashTable

g13602484138的博客 329

BAT面试有关散列(哈希)表的面试题详解

阿里巴巴面试有关散列(哈希)表的面试题详解 HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化。 初始size为11,扩容:newsize = olesize*2+1 计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length 1、哈希冲突 题目描述 设有哈希函数 H ( key ) = key m

m0_57768035的博客 297

Java面试题(11)Hashtable&HashMap&ConcurrentHashMap

Hashtable 线程安全的对象 但效率低内部有上锁的控制 synchronized HashMap 线程不安全的对象 但效率高 ConcurrentHashMap 兼顾两者,保证线程安全和性能 分段锁,将锁的粒度变小 三者在开发中如何选择? 1、优先选择HashMap 如果不是多个线程访问同一个资源的情况,优先选择HashMap 局部变量,不是全局变量 2、是全局变量时,多个线程共享访问选择ConcurrentHashMap ...

qq_40432425的博客 212

Hashtable程序员面试五分钟被请出来了

你们可能会想,栈长这么菜的吗?5分钟都坚持不了? 本文说起来会有点尴尬,毕竟这是栈长我曾经经历过的故事。 那时候的栈长还真菜,每天写着 if/ for 及一些简单的业务逻辑代码,虽工作有些日子了,但技术水平还停留在刚毕业的起步阶段。 记得,那是一个周末,栈长去某知名互联网公司面试,好像不到五分钟,我就被面试官亲切地赶出来了,当时我那个尴尬,内心深受打击。 为什么会被赶出来?这道题我记得很清楚,我...

a6984021的博客 676

Java面试题(28)-HashMap和Hashtable的区别

HashMap在多线程环境下线程不安全,Hashtable线程安全,如果要使用HashMap的话就可以使用concurrent并发包下的concurrentHashMap。HashMap的扩容方式都是以2的幂次进行扩容的,而Hashtable是以原容量的2倍+1进行扩容的。,HashMap允许存储null值,Hashtable不允许存储null值,否则会报控制指针。HashMap不包含contains方法,Hashtable不包含contains方法。Hashtable继承的Dictionary类。...

weixin_65549694的博客 347
上一篇: 阿里架构师的架构设计——详解高可用架构设计
下一篇: 阿里Java研发面试题『八部曲』——详解多线程、锁
Java_supermanNO1
博客等级 码龄7年 1170粉丝 329原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值