大家好,又见面了,我是你们的朋友全栈君。 JAVA中的HashMap面试题整理 JDK1.7版本,HashMap的数据结构是什么? 数组+单向链表 什么叫做Hash桶 数组中的单向链表 HashMap的数组长度为什么必须是2的幂? 计算元素存在数组中下标的算法:hash值 & 数组长度-1 如果数组长度不是2的幂,减1后二进制的某一位有可能出现0,导致数组某个位置永远存不到数据 HashMap的默认负载因子是多少,作用是什么? 因为数组长度必须是2的幂并且HashMap数组最大长度的变量为int类型,所有1<<30 什么叫做Hash碰撞/冲突? 两个对象的hash值一样,导致在数组中的下标一样 HashMap何时扩容? 元素个数>=阈值,并且存入数据的位置不等于null HashMap扩容机制是什么? 原来的2倍 HashMap存入null键的位置? hash数组下标为0的位置 什么叫做Hash回环?
对于Scanner的进一步理解还是在LeetCode的一道算法题上,题目大意是输入一组分式加法构成的字符串,要求输出分式相加的结果。首先是输入”-2/3+2/3-4/5″,接着求其和。 首先第一步需要解析字符串为所需的数据,我使用了split()的方式,有位大哥就使用了`scanner.useDelimiter(pattern)`方法,直接将数据解析到了Scaner对象中。 # Scanner的工作方式 Scanner的分隔符模式将输入分割到令牌(token,就是临时存储区域),默认情况下以**空格**分割。然后可以使用各种next方法将得到的令牌转换成不同类型的值。 `pattern的模式`,并返回一个新的Scanner对象。 **总结:使用Scanner+正则的组合可以简化很多字符串的处理,而无需使用大量的代码分割字符串和数值转换。
领8888元新春采购礼包,抢爆款2核2G云服务器95元/年起,个人开发者加享折上折
一个例子 Object类是所有类的父类,如果你去查看java.lang.Object类的源码,你会发现里面有个finalize方法,这个方法没有默认实现,需要子类根据实际情况重写这个方法,但是如果不恰当使用 类里也有一个引用队列,这个引用队列是JVM和垃圾回收器打交道的唯一途径,当垃圾回收器需要回收该对象时,会把该对象放到引用队列中,这样java.lang.ref.Finalizer类就可以从队列中取出该对象 $100(Finalizer.java:14) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160) 这个线程唯一的职责就是不断的从 java.lang.ref.Finalizer.ReferenceQueue队列中取对象,当一个对象进入到队列中,finalizer线程就执行对象的finalize方法并且把对象从队列中删除,因此在下一次 histo:live 8700|head -n 10命令强制触发一次GC,结果和前面的分析一致,Finalizer对象都放到引用队列中,并依次调用了对象的finalize方法,内存中java.lang.ref.Finalizer
大家好,又见面了,我是你们的朋友全栈君。 展开全部 代码块是一种常见的代码形式。 代码块的格式如下: 1、普通代码块:是最常见的代码块,在方法里用一对“{}”括起来的数据,就是普通的代码块, 2、构造代码块:是在类中直接定义的,用“{}”括起来的代码。 3、静态代码块:他在类中的成员位置,用“{}”括起来的代码。 所以他会执行class Nihaoa类下的静态块,在执行 main方法,编译class GouZao类,然后执行代码,静态的执行一次,构造方法块每次执行 java中“:” 如果是switch 中的,是它的一种固定写法。
大家好,又见面了,我是你们的朋友全栈君。 Java反射学习 所谓反射,可以理解为在运行时期获取对象类型信息的操作。 1,获得类型类 我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。 类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。 可以看到,对象a是A的一个实例,A某一个类,在if语句中使用a.getClass()返回的结果正是A的类型类,在Java中表示一个特定类型的类型类可以用“类型.class”的方式获得,因为a.getClass 特别注意的是,类型类是一一对应的,父类的类型类和子类的类型类是不同的,因此,假设A是B的子类,那么如下的代码将得到 “unequal”的输出: A a = new A(); if(a.getClass(
大家好,又见面了,我是你们的朋友全栈君。 JAVA提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。 这个String类提供了不可改变的字符串。 而这个StringBuffer类提供的字符串可以进行修改。 String: 为不可变对象,一旦被创建,就不能修改它的值. 对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. ;//error 对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer 中付值的时候可以通过它的append方法. ss.append(“w!”) 而String是不能被修改的,只能重复的去创建对象来实现修改。——如果频繁的对字符串进行追加、替换、修改、插入、删除操作,最好使用StringBuffer。
前言 我们都知道对于有符号数据类型,二进制最左端的数字为符号位,0代表正,1代表负,这里先介绍几个概念 逻辑左移=算术左移:高位溢出,低位补0 逻辑右移:低位溢出,高位补0 算术右移:低位溢出,高位用符号位的值补 比如一个有符号位的8位二进制数10101010,[]是添加的数字 逻辑左移一位:0101010[0] 逻辑左移两位:101010[00] 算术左移一位:0101010[0] 算术左移两位:101010 [00] 逻辑右移一位:[0]1010101 逻辑右移两位:[00]101010 算术右移一位:[1]1010101 算术右移两位:[11]101010 算术左移和算术右移主要用来进行有符号数的倍增 、减半 逻辑左移和逻辑右移主要用来进行无符号数的倍增、减半 Java中是没有无符号数据类型的,C和C++中有 符号 例子 解释 << num<< n 算术左移 相当于 num*(2的n次方) > > num>>n 算术右移 相当于num/(2的n次方) >>> num>>>n 逻辑右移,当num为正数和算术右移一个效果 例子 public static void main(String[] args
Java是利用 管程解决并发编程问题的,那么究竟什么是 管程?而它又是如何解决并发问题的呢? 什么是管程 管程,英文名是 Monitor ,因此有的时候会被翻译为 监视器。 我的理解是:我们通过管程管理 Java 中的类,使得类是线程安全的。 这应该是 管程最终要达到的效果,那么,它是怎么做到的呢? 管程模型 管程这个概念最早来源于操作系统,操作系统发展了那么多年,管程的实现也有多种方式,主流的有三种:Hasen模型、 Hoare模型和 MESA模型, Java 中借鉴的是 MESA模型,让我们来重点看一下 等待队列,当线程发现自己的 条件变量不满足时,就进入相应的 等待队列中排队,直至 条件变量满足,那么其 等待队列中的线程也不会是立马执行,而是到最开始 共享变量对应的 等待队列中再次排队,重复之前的过程 ); /** * 最大容量 */ private int capacity; /** * 当前容器中存储的数量
关注我们 注:下面讲到的初始化就是赋值的意思 变量 基本概念 我们通过变量来操纵存储空间中的数据,变量就是指代这个存储空间!空间位置是确定的,但是里面放置什么值不确定! 编号就对应于我们变量的变量名,里面存什么对应于我们变量的值。 Java 是一种强类型语言,每个变量都必须声明其类型。 Java 变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。 可以在一行中声明多个变量: int i ,j; 不提倡这种风格,逐一声明每一个变量可以提高程序可读性。 可以将变量的声明和初始化放在同一行中,例如: int age = 18; float e = 2.718281828f; 变量分类: 局部变量( lacal variable): 方法或语句块内部定义的变量 注:对于局部变量 java 虚拟机并不会给它自行初始化,也就是并不会给它赋上该类型的默认值,局部变量需要自己去初始化。
3)); //打印的结果是:2^3运算的结果是 :1} 那么这个1是怎么来的,我们要知道^、<<、>>等位运算符主要针对二进制,算异或的时候相同的为0,不同的为1 2转换成二进制是0010 //2<<3运算的结果是 :16} 在运算的时候同样要把十进制转换成二进制, 2的二进制是0010 ,向左移3位后面用000不齐,结果是10000 二进制的10000转换成十进制是16(从右往左分别是1,2,4,8,16,32 3)); //2>>3运算的结果是 :0} 原理和左移是一样的,先转成二进制0010,再向右侧移动三位,向右侧移动的时候在左侧不齐0,移动几位不齐几位,移动后的二进制是0000 转成十进制就是0了 &运算 按位“与”的计算是把两个数字分别写成二进制形式,然后按照每一位判断,&计算中,只要有一个是0就算成0 看下例子:System.out.println(1&2);打印0 , System.out.println (1&1);打印1 下面解释下原因 1的二进制为:0001 2的二进制为:0010 运算的结果为:0000 ->0 同理两个1的&运算的二进制结果为0001->结果为1
注解(Annotation)简介 Annotation(注解)是Java JDK5及其以后版本中引入的一个特性。 注解是Java的一个新的类型(与接口类似),它与类、接口、枚举是在同一个层次,它们都称为Java的一个类型(TYPE)。 1.java文件 当在一个注解类前定义了@Retention(RetentionPolicy.SOURCE)的注解,那么说明该注解只保留在一个源文件当中,当编译器将源文件编译成class文件时,它不会将源文件中定义的注解保留在 class文件中。 方法的返回值可以为8中基本类型,String、Class、枚举、注解以及这些类型的数组。
下面我们看一下Lock接口提供的方法,便于更好的阅读,请读者可先查看java.util.concurrent.locks.Lock中的源码,跟着源码中的注释一起理解接口中的方法。 2.7.2 队列同步器AQS 本章节是介绍Java中的锁,也可以换个说法是讲Java中的同步组件,典型代表有ReentrantLock、CountDownLatch、ReentrantReadWriteLock 2.7.3 显示锁 本小结介绍Java中两个比较重要的显示锁的使用,一个是ReentrantLock,另一个是ReentrantReadWriteLock。 可能读者会有疑问,因为几乎所有资料都会把ReentrantLock视为重入锁,没错,从名字上看他确实是可重入性的锁,之所以小标题使用显示锁是因为,我们知道在JAVA中ReentrantLock 和synchronized 源码中释放锁的方法大家可以自行去源码中阅读,篇幅原因,不贴出。
在java中用来描述具有共同性质的一组事物的自定义的复合数据类型—类。 复合数据类型的本质—【根据自己的需求制作自己需要的数据类型的模式/规则/公式】 4.2.如何编写一个Java类? { } 4.3.Java类中可以编写什么? 基本属性——变量 基本功能—–方法 变量–是用来在类中描述事物的基本属性 方法–是用来在类中描述事物的基本功能 4.4.Java类中变量的分类及其基本特征? 变量—保存数据 1.数据类型【不一定就是之前的基本数据类型,也有可能是自定义的复合数据类型】 2.变量名称【合法标识符–全字母小写】 3.初始值 4.作用域 按照在类中编写变量的位置划分 在同一个类中成员变量与某一个方法中的局部变量的名称相同,这是我们在方法中使用这个成员变量的时候,得到的结果是局部变量的值,此时就是方法中的局部变量将类中成员变量的值隐藏了,这就是成员变量的隐藏。
(以下的文件图片是我自己对反射功能所创建的类) 代码案例如下: Hello类: package com.zking.reflect.entity; import java.io.Serializable return new Integer(a.intValue() + b.intValue()); } } Demo1类: package com.zking.reflect.util; import java.lang.reflect.Constructor ; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method :"+field.getModifiers()); System.out.println("获取属性类型:"+field.getType());*/ //2)获取单个公共的、私有的、受保护的、最终的等等属性 、私有的、受保护的、最终的等等 //Method method=cls.getDeclaredMethod("add", Integer.class,Integer.class); //3)获取公共的方法
Java语言提供了volatile,在某些情况下比锁要更加方便。 volatile在多处理器开发中保证了共享变量的“ 可见性”。 ” 先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。 具体表现为以下3种形式。 对于普通同步方法,锁是当前实例对象。 2.2.3 锁存放的位置 锁标记存放在Java对象头的Mark Word中。 2.2.4 锁的优缺点对比 image.png 2.3、CAS ★CAS,在Java并发应用中通常指CompareAndSwap或CompareAndSet,即比较并交换。 3、Java中的锁实现 3.1、队列同步器(AQS) ★队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架。
点击上方 好好学java ,选择 星标 公众号 重磅资讯、干货,第一时间送达今日推荐:用好Java中的枚举,真的没有那么简单! ” 先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。 具体表现为以下3种形式。 对于普通同步方法,锁是当前实例对象。 2.2.3 锁存放的位置 锁标记存放在Java对象头的Mark Word中。 ? Java对象头长度 ? 32位JVM Mark Word 结构 ? 32位JVM Mark Word 状态变化 ? 2.2.4 锁的优缺点对比 ? image.png 2.3、CAS ★CAS,在Java并发应用中通常指CompareAndSwap或CompareAndSet,即比较并交换。 3、Java中的锁实现 3.1、队列同步器(AQS) ★队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架。
Java中的异常 异常:直观的理解就是不正常,不完全正确,可能存在某些问题。在实际编写程序的过程中,往往可能出于疏忽而导致程序出现bug。 合理的处理异常,会使得程序的健壮性,可读性以及可维护性得到大大的提高。 在java中,提供了优秀的异常机制,当程序出现在运行时期的异常和编译阶段的异常,提供解决错误的方法。 错误:是指系统出现错误或运行环境出现的错误,此类错误非常严重。即使捕捉到也不能够有效的处理,由java虚拟机生成并抛出,通常这类型的错误是由系统错误引起的。 下图是java中异常的层次结构: 在程序中显式的进行异常的处理 1.捕获可能存在的异常。 使用自定义的异常 有时候,系统的提高的异常并不能完全够实际的开发使用,由于java的继承机制,可以很好的提高代码复用。
如果对应的key被回收,则这个key指向的对象会被从Map容器中移除。 中的a将自动被回收掉。 b对象虽然指向了null,但HashMap中还有指向b的指针。 在get方法中,也是优先从eden中找对应的v,如果没有则进入longterm缓存中查找,找到后就加入eden缓存并返回。 参考文献 WeakHashMap的使用场景Java中的WeakHashMap
在这篇文章中,我们对 Java 中的 NaN 进行一些简单的描述和说明和在那些操作的过程中可以尝试这个值,和可以如何去避免。 什么是 NaN NaN 通常表示一个无效的操作结果。 例如,你尝试将数字 0 去除以 0,这个在数学中是不存在的,同时在 Java 中定义 NaN 也确实就是通过这个不存在的操作来定义的。 我们通常也使用 NaN 来表示不能显示的变量值。 在 Java 中没有针对其他数据类型定义的 NaN 了。 NaN 在绝大部分情况下都不是一个有效的输入参数,因此在 Java 的方法中,我需要对输入的参数进行比较,以确保输入的参数中的值不是 NaN,然后我们能够对输入参数进行正确的处理。 ,我们对 NaN 的情况进行了一些简单的讨论,同时我们也讨论了在实际的计算中可能会有哪些情况会导致产生 NaN,同时对如何进行 NaN 在 Java 中的比较和计算也提供了一些实例。
单行注释 写法: //此行后面均是注释内容 例如://我是一行注释|´・ω・)ノ 多行注释 写法: /* 我是注释内容1 我是注释内容2 */ 单/多行注释的作用: 增强代码的可读性 文档注释 写法: /** *我是文档注释内容 */ 文档注释的作用: 注释允许你在程序中嵌入关于程序的信息。 你可以使用 javadoc 工具软件来生成信息,并输出到HTML文件中。 说明注释,使你更加方便的记录你的程序信息。 javadoc标签 在开始的 /** 之后,第一行或几行是关于类、变量和方法的主要描述。 之后,你可以包含一个或多个各种各样的 @ 标签。 每一个 @ 标签必须在一个新行的开始或者在一行的开始紧跟星号(*). 多个相同类型的标签应该放成一组。例如,如果你有三个 @see 标签,可以将它们一个接一个的放在一起。 示例:
扫码关注腾讯云开发者
领取腾讯云代金券