![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
掘客DIGGKR
生活是一座大山,每天挖掘才能有所收获。掘客是一种生活态度!
展开
-
10个HashMap问题搞定面试官
废话不多说,看题:1:HashMap 的数据结构?JDK1.7使用的是数组+ 单链表的数据结构。JDK1.8及之后时,使用的是数组+链表+红黑树的数据结构。当阈值是默认阈值0.75,链表的深度大于等于8,数组容量大于等于64时,扩容的时候会把链表转成红黑树,时间复杂度从O(n)变成O(logN);当红黑树的节点深度小于等于6时,红黑树会转为链表结构。...原创 2020-09-10 19:15:11 · 283 阅读 · 0 评论 -
大厂面试题:JDK1.7和1.8的HashMap有哪些区别?
我们了解过了JDK1.7和1.8的HashMap源码,今天来总结下JDK1.7和1.8的Hashmap有哪些区别?这个问题是大厂面试中最常问到的问题。一、JDK1.7和1.8的Hashmap有哪些区别?1、JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后使用尾插法,能够避免出现逆序且链表死循环的问题。2、扩容后数据存储位置的计算方式不一样在JDK1.7的时候是直接用hash值原创 2020-09-09 13:56:00 · 1855 阅读 · 2 评论 -
JDK1.8 ConcurrentHashMap源码解析
ConcurrentHashMap是conccurrent家族中的一个类,由于它可以高效地支持并发操作,以及被广泛使用,经典的开源框架Spring的底层数据结构就是使用ConcurrentHashMap实现的。与同是线程安全的老大哥HashTable相比,它已经更胜一筹,因此它的锁更加细化,而不是像HashTable一样为几乎每个方法都添加了synchronized锁,这样的锁无疑会影响到性能。本文的分析的源码是JDK1.8的版本,与JDK1.7的版本有很大的差异。实现线程安全的思想也已经完全变了,它摒弃转载 2020-09-08 19:09:27 · 359 阅读 · 0 评论 -
Java中的天使和魔鬼sun.misc.Unsafe
Java是一个安全的编程语言,它能最大程度的防止程序员犯一些低级的错误(大部分是和内存管理有关的)。但凡事不是绝对的,使用Unsafe程序员就可以操作内存,因此可能带来一个安全隐患。这篇文章是就快速学习下sun.misc.Unsafe的公共API和一些有趣的使用例子。1、Unsafe 实例化在使用Unsafe之前我们需要先实例化它。但我们不能通过像Unsafe unsafe = new Unsafe()这种简单的方式来实现Unsafe的实例化,这是由于Unsafe的构造方法是私有的。Unsafe有一个翻译 2020-09-04 12:58:45 · 358 阅读 · 0 评论 -
JDK1.7 ConcurrentHashMap源码分析
HashMap是java编程中最常用的数据结构之一,由于HashMap非线程安全,因此不适用于并发访问的场景。JDK1.5之前,通常使用HashTable作为HashMap的线程安全版本,HashTable对读写进行全局加锁,在高并发情况下会造成严重的锁竞争和等待,极大地降低了系统的吞吐量,ConcurrentHashMap应运而生。相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,并且读操作转载 2020-09-02 23:54:25 · 466 阅读 · 0 评论 -
HashMap默认负载因子0.75和泊松分布有关系吗?
我们在看HashMap源码时,知道HashMap默认的负载因子是0.75。那这个0.75是怎么来的呢?/** * The load factor used when none specified in constructor. */static final float DEFAULT_LOAD_FACTOR = 0.75f;通常,加载因子需要在时间和空间成本上寻求一种折衷。加载因子过高:例如为1,虽然减少了空间开销,提高了空间利用率,但同时也增加了查询时间成本。加载因子过低:例如0.5,原创 2020-08-29 12:24:19 · 948 阅读 · 1 评论 -
JDK1.8 HashMap源码剖析
上篇我们介绍了JDK1.7版的HashMap,今天我们来讲解下JDK1.8版的HashMap。JDK1.7的实现大家看出有没有需要优化的地方?其实一个很明显的地方就是:当 Hash 冲突严重时,在桶上形成的链表会变的越来越长,这样在查询时的效率就会越来越低;时间复杂度为 O(N)。因此JDK1.8 中重点优化了这个查询效率。1、JDK1.8 HashMap 数据结构图我们会发现优化的部分就是把链表结构变成了红黑树。原来jdk1.7的优点是增删效率高,于是在jdk1.8的时候,不仅仅增删效率高,而转载 2020-08-28 22:54:22 · 168 阅读 · 0 评论 -
JDK1.7 HashMap源码剖析,循环链表是如何产生的
Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据。众所周知 HashMap 底层是基于 数组 + 链表 组成的,不过在 JDK1.7 和 1.8 中具体实现稍有不同。今天我们只讲解JDK1.7版本的HashMap。1、HashMap的数据结构图是一个数组+链表结构2、HashMap成员变量/** * The default initial capacity - MUST be a power of two. */static final int DE转载 2020-08-25 14:40:38 · 1115 阅读 · 1 评论 -
面试官:说一下这头牛COW,Copy-On-Write
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。1、什么是CopyOnWrite容器Co转载 2020-08-20 13:59:50 · 206 阅读 · 0 评论 -
为什么会出现ConcurrentModificationException异常,如何解决?
在前面一篇文章中提到,对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。下面我们就来讨论以下这个异常出现的原因以及解决办法。1、异常出现的原因先看下面这段代码:public class Test { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList转载 2020-08-19 23:10:58 · 2697 阅读 · 0 评论 -
同步容器讲解
为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列、Synchronizer(比如CountDownLatch)。今天我们就来讨论下同步容器。1、为什么会出现同步容器?在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。List、Set、Queue接口分别继承了Collection接口,Map本身是一个接口。注意Collection和Map是一个顶层接口,而List、Set、Queue则继承了Collection转载 2020-08-19 11:56:12 · 158 阅读 · 0 评论 -
面试官都爱问这个:ThreadLocal与内存泄漏
https://www.cnblogs.com/dolphin0520/p/3920407.htmlhttps://blog.csdn.net/JAck_chen0309/article/details/105257331https://blog.csdn.net/puppylpg/article/details/80433271https://blog.csdn.net/zzg1229059735/article/details/82715741?utm_medium=distribute.pc_r转载 2020-08-18 18:03:00 · 152 阅读 · 0 评论 -
大厂面试必问的CAS,你了解吗
我们在【大厂面试必问:volatile关键字详解】这篇文章中已经知道:volatile关键字可以保证有序性、可见性、防止指令重排,但是不能保证原子性。多线程并发修改volatile变量时,如果线程1读取volatile变量后,这时线程2读取并修改了这个变量,并写入了主内存,设置线程1工作内存中的缓存行失效。由于线程1已经读取过volatile变量了,此时不会再去缓存行读取了(此时缓存行已失效),也不会去主内存读取了,而是直接修改变量,写入主内存。这样就导致了并发修改的错误!正是由于这种错误,导致了CA转载 2020-08-13 15:16:21 · 211 阅读 · 0 评论 -
大厂面试必问:volatile关键字详解
volatile关键字是面试中必问的一个知识点,今天我们来剖析下。volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。1、内存模型的相关概念大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很转载 2020-08-12 17:34:30 · 199 阅读 · 0 评论 -
校长发奖状了,要排排队领取哦,Java Lock简述
在小时候,校长发东西时,要我们一个一个排好队绝对不敢抢,不然后果很严重。这个多人排队领取东西的场景和编程中的多线程访问共享资源的场景很像。今天我们结合Java Lock来讲解下。在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。这时候有朋友就会问了,既然都可以通过synchronized来实现同步访问了,那么为什么还需要转载 2020-08-09 14:31:55 · 169 阅读 · 0 评论 -
老师发糖了,要排排队领取哦,Java synchronized关键字
在小时候,老师发东西时,要我们一个一个排好队不准抢,不然打屁屁。这个多人排队领取东西的场景和编程中的多线程访问共享资源的场景很像。今天我们结合Java synchronized关键字来讲解下。1、什么时候会出现线程安全问题?在单线程中不会出现线程安全问题,而在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等,而当多个线程同时访问同一个资源的时候,就会存在一个问题:由于每个线程执行的过程是不可控的,所以很可能导致最终的结果转载 2020-08-08 14:19:33 · 199 阅读 · 0 评论 -
Java Thread类简述
今天我们来看下java.lang.Thread这个类。在学习Thread类之前,先看下线程相关知识:线程的几种状态、上下文切换,然后介绍Thread类中的方法的具体使用。1、线程的状态线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting、waiting、消亡(dead)。当需要新起一个线程来执行某个子任务时,就创建了一个线程。但是线程创建之后,不会立即进入就绪状态转载 2020-08-07 23:19:45 · 168 阅读 · 0 评论 -
漫画图解进程与线程,形象生动
初学程序的时候,很多人搞不清进程和线程的关系,今天整理了下网友们的答案,希望对大家有所帮助。先看漫画:1、计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。2、假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。3、进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。4、一个车间里,可以有很多工人。他们协同完成一个任务转载 2020-08-06 22:30:15 · 585 阅读 · 0 评论 -
看连环画,Java垃圾回收机制
今天我们看一下的Java的垃圾回收机制。上图是oracle官网给出的GC描述,热心网友进行了翻译,图文并茂,简单易懂。翻译内容如下:什么是自动垃圾回收?自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存转载 2020-08-05 13:42:03 · 124 阅读 · 0 评论 -
面试加分项:Java引用还有分类?强引用、弱引用、软引用、虚引用
众所周知,Java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样操心内存),但同时也是它的缺点(不够灵活)。为了解决内存操作不灵活这个问题,Java采用了软引用等方法。在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走。一般说来,如果物品已经被扔到垃圾箱,想再把它捡回来使用就不可能了。原创 2020-08-04 23:22:23 · 114 阅读 · 0 评论 -
简述JVM内存区域划分
我们在Java编程时少不了程序优化,而程序优化的前提是知道JVM的内存是如何划分的,那么我们今天来大体了解下。在看JVM内存区域划分之前,先来看一下Java程序具体执行的过程:如上图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM会用一块空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Are原创 2020-08-03 22:53:42 · 229 阅读 · 0 评论 -
我异常了,快来捕获我,Java异常简述
在我们日常编程中,异常处理是必不可少的,异常处理是否得当关系到程序的健壮性和后续维护成本。试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻找出错的根源?但是如果一个项目异常处理设计地过多,又会严重影响到代码质量以及程序的性能。因此,如何高效简洁地设计异常处理是一门艺术,今天我们来讲解一下。...原创 2020-08-02 23:06:34 · 130 阅读 · 0 评论 -
我有心上人了,Java内部类
在我们日常Java编程中,内部类用到的相对比较少,但是也有必要了解下。1、内部类简述在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。内部类一般来说分为四种:成员内部类、局部内部类、匿名内部类和静态内部类。(1)成员内部类...原创 2020-08-01 19:09:31 · 157 阅读 · 0 评论 -
Java重写equals方法时为什么要重写hashCode方法
在我们平时编写Java代码时,重写equals方法时一定要重写hashCode方法,这是为什么呢?在讨论这个问题前,我们先看下Object类中hashCode方法和equals方法。hashCode方法:翻译如下:equals方法:翻译如下:1、hashCode方法的作用在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。为什么这么说呢?考虑一种情况,当向集合中插入对象时,如何原创 2020-07-31 11:37:29 · 2424 阅读 · 2 评论 -
面试中常被问到的Hash表
Hash表在面试中经常被问到,今天我们来了解下。Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。这个源于Hash表设计的特殊性,它采用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。1、Hash表的设计思想对于一般的线性表,比如链表,如果要存储联系人信息:张三 13980593357李四 158286623原创 2020-07-30 17:48:59 · 550 阅读 · 0 评论 -
Java小白对equals和==,傻傻分不清楚
Java的初学者经常会用到equals和==,两者傻傻分不清楚,今天我们来讲解一下。先看个例子:String str1 = new String("hello world");String str2 = new String("hello world"); System.out.println(str1==str2);System.out.println(str1.equals(str2));输入结果是:falsetrue一.关系操作符“==”到底比较的是什么?下面这原创 2020-07-28 17:32:00 · 159 阅读 · 0 评论 -
常见易错的Java Static面试题,你不一定都能答对
1、public class Test extends Base{ static{ System.out.println("test static"); } public Test(){ System.out.println("test constructor"); } public static void main(String[] args) { new Test(); }}class Base原创 2020-07-28 16:38:05 · 274 阅读 · 1 评论 -
我们高中class里有一个static女神
static关键字在Java编程中经常用到,今天我们来讲解一下。在《Java编程思想》P86页有这样一段话:“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:方便在没有创建对象的情况下来进行调用(方法/变量)。显然,被原创 2020-07-27 22:01:01 · 138 阅读 · 0 评论 -
我有一个final GirlFriend,之后就不再换了,final GirlFriend会越来越有钱的。Java final讲解
final关键字在Java编程中我们并不陌生,但是你真正理解吗?今天我们来讲解一下final关键字。一、final的用法Java中final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。1、修饰类 当用final修饰一个类时,表明这个类不能派生出子类。也就是说,如果一个类你想让他被继承,就可以用final来修饰。 final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。在使用final修饰类的时候,要注意谨慎选原创 2020-07-26 14:36:15 · 142 阅读 · 0 评论 -
常见易错的Java String面试题
下面说明一些String相关的面试题,加深理解,助你面试成功一臂之力。1、下面这段代码的输出结果是什么?String a = "hello1024";String b = "hello" + 1024;System.out.println((a == b));输出结果为:true。因为:“hello”+1024在编译期间就已经被优化成"hello1024",因此在运行期间,变量a和变量b指向的是同一个对象。我们反编译下代码可以看到,“hello”+1024在编译期间就已经被优化成"hello1原创 2020-07-24 10:41:59 · 167 阅读 · 0 评论 -
探秘Java面试中问的最多的:String、StringBuffer、StringBuilder
String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方。今天我们就来讲解一下。本文测试中JDK版本是:1.71、先看下String类String源码如下:public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */原创 2020-07-23 22:10:04 · 173 阅读 · 0 评论 -
Java实现多线程的方式,啊四种
小伙伴们基本上都知道Java实现多线程有两种方式:1、继承Thread类,重写run()方法;2、实现Runnable接口,实现run()方法实际上还有两种方式:3、实现Callable接口,实现call()方法;4、通过线程池创建线程接下来一个一个说明:1、继承Thread类,重写run()方法...原创 2020-07-22 17:46:53 · 133 阅读 · 0 评论 -
面向对象的六原则一法则,而现实中只需要一个原则:老婆,我错了
1、 单一职责原则:一个类只做它该做的事情单一职责原则想表达的就是”高内聚”,写代码最终极的原则只有六个字”高内聚、低耦合”,就如同葵花宝典或辟邪剑谱的中心思想就八个字”欲练此功必先自宫”。所谓的高内聚就是一个代码模块只完成一项功能,在面向对象中,如果只让一个类完成它该做的事,而不涉及与它无关的领域就是践行了高内聚的原则,这个类就只有单一职责。我们都知道一句话叫”因为专注,所以专业”,一个对象如果承担太多的职责,那么注定它什么都做不好。这个世界上任何好的东西都有两个特征,一个是功能单一,好的相机绝对不原创 2020-07-20 20:07:25 · 139 阅读 · 0 评论 -
我的对象Girl会分身,浅克隆、深克隆
在这个神奇的星球上,有这样一个群体,比较呆萌,天天沉浸在代码的世界。这个代码的世界里他们天天面向对象Coding,而且这个对象还会克隆,进行分身。1、什么时候会用到Clone呢?一般是想对一个对象进行处理,又想保留原有的数据进行接下来的操作,这时候就需要克隆了。好比来了一件事,复制一个分身,分身去处理;自身还是继续干自己的事,分身和自身的行为和状态互不干扰影响。2、既然Clone这么有用,那如何实现Clone呢?Java提供了一个Cloneable接口,这只是一个标示接口,没有定义方法。定义一个女原创 2020-07-19 14:46:14 · 212 阅读 · 0 评论 -
南极的冰疙瘩如何通过细管运到北极呢?序列化、反序列化
1、引出序列化、反序列化假如有这样一个场景:南极到北极有一根细管,南极的一块大冰块如何运到北极呢?显然南极大冰块需要先化成水,通过细管流到北极,到北极之后再收集起来冻成大冰块。这是一个虚拟的场景,但是和现实生活中的网络数据传输有些相似。比如现实中一台客户端要发送信息,一个Person对象,需要先变成数据流(这个和刚才的水流相似),再通过网络链路(细管)到达服务器端,服务器端接收到后将数据流转换成Person对象。这样一个过程就实现了消息的传输,其中涉及到了两次数据的转换,称之为:序列化和反序列化。原创 2020-07-16 20:23:07 · 334 阅读 · 0 评论 -
一道简单面试题引出的Java数据类型连环问
题目如下:public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; Integer i3 = 150; Integer i4 = 150; System.out.println(i1 == i2); System.out.println(i3 == i4);}你想好答案了吗?答案是:truefalse为什么不都是true呢?这就需要我们看看Integer i1 = 10原创 2020-07-15 13:16:35 · 216 阅读 · 0 评论 -
蚂蚁、小鸟、大象 引发的面向对象问题
(1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。抽象包括行为抽象和状态抽象两个方面。例如,定义一个Person类,如下: class Person{ Str原创 2020-07-14 10:54:27 · 348 阅读 · 0 评论 -
RMI简单实例
分布式对象技术主要是在分布式异构环境下建立应用系统框架和对象构件。在应用系统框架的支撑下,开发者可以将软件功能封装为更易管理和使用的对象,这些对象可以跨越不同的软、硬件平台进行互操作。目前,分布式互操作标准主要有Microsoft的COM/DCOM标准、Sun公司的Java RMI标准和OMG组织的CORBA标准。 Java RMI简介 远程方法转载 2014-05-12 16:26:26 · 730 阅读 · 0 评论 -
java模拟---遍历链表
public class TestList { private static final int len = 10; public static void main(String[] args) { Student[] array = new Student[len]; Student stu = new Student(); stu.setName("name " + 0);原创 2012-06-06 17:39:17 · 725 阅读 · 0 评论 -
位运算实现整数加减乘除
1. 位运算实现整数加下面代码为网友所写. public int AddWithoutArithmetic(int num1,int num2) { if(num2==0) return num1;//没有进位的时候完成运算 int sum,carry; sum=num1^num2;//完成第一原创 2012-03-12 15:27:39 · 655 阅读 · 0 评论