
Java面试题系列
文章平均质量分 51
面试题专栏
诗水人间
要想走的更远,就需要思考更深层次的问题。冷静、智慧、深沉是我所向往的
展开
-
运行时常量池的一道面试题(jdk8环境)
事先说明环境 在jdk8下,高版本的jdk可能找不到对应的Version类代码:public class TestDemo { @Test public void test01() { // String str1 = new StringBuilder("hello").append("World").toString(); System.out.println(str1.intern()); System.ou原创 2020-10-21 03:57:35 · 89359 阅读 · 4 评论 -
那些你还不熟悉的---类的初始化和实例化的初始化过程
面试题:如下两个类的代码/*父类对象*/public class Father{ private int i = test(); private static int j = method(); static{ System.out.print("(1)"); } Father(){ System.out.print("(2)"); } { System.out.print("(3)"); } public int test(){ System.out.pr原创 2020-06-27 01:04:17 · 114019 阅读 · 1 评论 -
Servlet+Session+Cookie登录、校验、退出的逻辑代码
登录逻辑的实例代码,逻辑在我加的注释上,阅读代码就能掌握整个完整的 输入用户信息,进行校验,登录成功后的逻辑操作,登录失败后的逻辑操作下面用到的依赖:(maven仓库地址直链):servlet-api 、fastjson登录逻辑import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.*;import java.io.BufferedRe原创 2021-01-05 00:20:01 · 715 阅读 · 0 评论 -
运行时常量池的再深入,从jvm的内存分配角度谈谈这道字符串常量池的面试题。
此前我写过另外一篇关于字符串常量池的面试题运行时常量池的一道面试题(jdk8环境)本篇博客的内容能证明我上一篇博客中的推论面试题原题:public class TestDemo { @Test public void test01() { String str1 = new StringBuilder("ja").append("va").toString(); String str2 = str1.intern(); Sys原创 2020-12-14 05:39:45 · 6373 阅读 · 5 评论 -
java8以后字符串常量池的位置,以及元空间的探秘,使用VisualVM进行实战验证
在网上看了很多博客,解释也比较多,关于字符串常量池的具体位置难以分辨谁真谁假。 对于jdk8以后的版本有人说字符串常量池在元空间中,也有人说字符串常量池存在堆中。 到底谁说的对?他们的说法有依据吗? 今天让我们来一起探讨一下这个问题有人说字符串常量池在java堆中,可又有人说常量池存在元空间中。分享几篇知乎文章 关于jvm运行时数据区的模型:1、面试官 | JVM 为什么使用元空间替换了永久代?2、Java方法区与元空间为了解决这个问题,下面我们通过Idea、VisualVm原创 2020-12-08 03:56:29 · 32812 阅读 · 12 评论 -
线程池ThreadPoolExecutor的七大参数
七个参数的构造方法如下public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnabl原创 2020-11-13 03:43:00 · 41675 阅读 · 1 评论 -
一道面试题关于 ReentrantLock中的 Condition接口的使用案例,以及LockSupport的方式处理
一道面试题如下:要求用三个线程完成如下操作,线程A打印5次A线程B打印10次B线程C打印15次线程A打印5次A线程B打印10次B…如此循环打印这道题考点在于控制3个线程依此按照顺序执行如果使用Condition接口来完成则代码大致可以这样解法一、主要使用Condition接口的 await、signal方法import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLo原创 2020-11-13 00:38:54 · 20577 阅读 · 0 评论 -
公平锁和非公平锁
看到一篇文章写的比较好,易懂。自认为不可能写的更好了,但为了弥补知识盲区,引用一下这篇关于公平锁和非公平锁的地址一张图读懂非公平锁与公平锁概括来说:公平锁的意思就是,当已有资源释放了锁,则下一个获得锁的线程是线程队列最前面的一个。非公平锁则不能保证,释放锁的时候刚好来了一个线程那么这个线程就会获得到锁,反而线程队列中等待的线程没有获得到锁,这种体现了非公平的机制故称作非公平锁。默认的ReentrantLock和ReadWriteLock都是非公平锁。ReentrantLock可以使用带参数的构造方法转载 2020-10-23 03:37:59 · 79155 阅读 · 0 评论 -
线程等待和唤醒的三种方式(Object、Condition、LockSupport)
Object中的wait()、notify()让线程等待和唤醒Object.wait()、Object.notify()方法必须再synchronized修饰的代码块中才能正常使用,否则会报异常(语法不会显示有错误)如下如果注释synchronized (obj)会报java.lang.IllegalMonitorStateException: current thread is not owner正常使用必须在synchronized中使用!public static void main(Stri原创 2020-10-23 03:29:02 · 66034 阅读 · 0 评论 -
可重入锁和不可重入锁的区别
不可重入锁示例(同一个线程不可以重入上锁后的代码段)如下是一个不可重入锁的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁后,由于没有释放锁,因此执行第一次lock后isLocked = true,这个时候调用doJob()内部又一次调用了lock()由于上个线程将isLocked = true,导致再次进入的时候就进入死循环。导致线程无法执行System.out.println("执行doJob方法过程中");这原创 2020-10-22 21:40:16 · 83464 阅读 · 3 评论 -
力扣第1题--(两数之和)的优解
力扣第一题(两数之和)class Solution { public int[] twoSum(int[] nums, int target) { HashMap<Integer, Integer> hashMap = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int tmp = target - nums[i];//原创 2020-10-21 04:25:27 · 61925 阅读 · 0 评论 -
JVM架构内存结构图
在线分享地址:JVM内存结构图原创 2020-09-14 03:40:54 · 89454 阅读 · 0 评论 -
JVM的生命周期
①虚拟机的启动–>②虚拟机的执行–>③虚拟机的退出虚拟机的启动java虚拟机的启动时通过引导类加载器(Bootstrap ClassLoader)创建一个初始类(initial class)来完成,这个类是由虚拟机的具体实现指定的。虚拟机的执行执行一个java应用程序的时候就会启动一个java虚拟机进程。程序开始则虚拟机的执行就开始,程序结束虚拟机的执行就结束虚拟机的退出虚拟机的退出由以下几种情况程序正常执行结束执行过程中抛异常或错误操作系统执行出错执行Runtime类或原创 2020-09-13 22:46:00 · 119775 阅读 · 0 评论 -
创建线程的4种方式
方式一:继承Thread类重写run方法class MyThread extends Thread{ @Override public void run() { System.out.println("启动自定义线程"); super.run(); }}//启动线程new MyThread().start();方式二:实现Runnable接口lambda表达式new Thread(()->{ System.out.pri原创 2020-08-09 14:42:10 · 113714 阅读 · 0 评论 -
ArrayList扩容机制的发展过程
jdk1.2中扩容算法是这样的。1.5倍+1public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if原创 2020-08-04 02:53:10 · 112294 阅读 · 0 评论 -
面试时别再回答ArrayList的初始容量为10了!!!这里有更好的答案!
使用过ArrayList或者背过面试题的小伙伴都知道ArrayList的初始容量为10。但这个答案不完全正确,在jdk1.2到jdk1.6中的ArrayList的源码中,在构造方法上的确是创建了一个初始容量为10的容器。摘录jdk_1.6的源码,1.2到1.6都是直接创建一个长度为10的数组但是在jdk_1.7中的源码是这样写的调用构造方法时,如下说明从jdk_1.7开始,当你进行new ArrayList();创建的是一个空数组初始容量就不是10了,而是一个空数组从jdk_1.2开始到原创 2020-08-04 02:01:39 · 135526 阅读 · 2 评论 -
ArrayList哪几种情况下会报java.util.ConcurrentModificationException吗?
ArrayList是一个很常用的集合类,底层是一个数组,只不过ArrayList封装了数组,实现了一些好用的方法例如add()方法,size()方法,get()方法等一系列的方法,并且实现了动态的扩容数组。new ArrayList();创建了一个空数组,那么它的容量起始为0,为什么面试过程中很多人都说ArrayList的初始容量为10呢?原因在于当你第一次调用add()方法添加元素的时候会进行一次扩容。这时候就会扩容到默认的初始容量10在ArrayList中定义了一个常量DEFAULT_CAPACIT原创 2020-08-03 19:11:58 · 112846 阅读 · 0 评论 -
JVM专题20道面试题和答案
一、内存模型以及分区,需要详细到每个区放什么。JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面, class 类信息常量池(static 常量和 static 变量)等放在方法区 new:方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字 节码)等数据堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要 在堆上分配栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操 作数原创 2020-08-02 13:29:57 · 117980 阅读 · 0 评论 -
一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之LinkedList
一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之ArrayList一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之LinkedList一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashMap一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashSet public class L原创 2020-07-29 04:44:50 · 100527 阅读 · 0 评论 -
一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashMap
一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之ArrayList一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之LinkedList一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashMap一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashSet 关于HashMap的源码是这原创 2020-07-29 04:44:29 · 100445 阅读 · 0 评论 -
一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashSet
### 总结 HashSet:HashSet的底层是HashMap并且HashSet中的set相当于在HashMap的key,而value则是`new Object`出来的常量扩容条件则是按照HashMap的扩容规则进扩容原创 2020-07-29 04:44:04 · 98942 阅读 · 2 评论 -
一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之ArrayList
一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之ArrayList一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之LinkedList一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashMap一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashSet 一、ArrayList 源码原创 2020-07-29 04:39:23 · 110228 阅读 · 0 评论 -
synchronized同步锁的各种情况(类锁和实例锁)
synchronized特点:在同一时刻内。只能有一个线程有锁 synchronized锁分Class锁(加了static修饰)和 Class实例锁(无static)两种 其中 Class锁 全局只有一把锁,锁实例变量 有多少个实例变量就有多少把锁 最为关键的是要搞懂synchronized修饰产生的锁在哪里。是锁this?(this可以有多个,因为实例变量不一定相同,thi...原创 2019-12-06 02:13:52 · 121603 阅读 · 0 评论 -
ArrayList和HashMap、Set
List、Set、Map都是线程不安全的ArrayList底层是数组,传的是一个Object泛型初始值长度10,jdk8是空(采用懒加载机制)扩容会变成10+10/2=15ArrayList 是线程不安全的ArrayList的故障现象导致原因解决方法优化建议异常:多个线程进行add可能会报java.util.ConcurrentModificationException异常导致原因:多个线程同时写入同一个位置解决方法:解决多线程并发写入异常使用优化建议:1.new V原创 2020-07-10 22:02:44 · 127016 阅读 · 0 评论 -
单例设计模式的6种常见设计模式
设计单例设计模式按照创建的时间分为 饿(比较急迫使用)汉式、懒(比较懒需要的时候才创建)汉式饿汉式常见的形式直接实例化(比较简介直观) 枚举式(最简洁) 静态代码块饿汉式(适合复杂实例化)懒汉式常见的形式线程不安全(适用单线程) 线程安全(适用多线程) 静态内部类形式(适用多线程)①饿汉式 直接实例化 示例代码public class Singlet...原创 2020-01-15 01:52:41 · 130159 阅读 · 0 评论 -
JAVA中 类初始化过程 和 实例初始化过程
类初始化 (static部分)执行clinit方法main方法所在的类需要 先加载和初始化 子类的初始化需要先初始化父类 类初始化就是指向<clinit>()方法 ①、<clinit>()方法由静态 类变量显示赋值代码和 静态代码块组成 ②、类变量显示赋值代码 和 静态代码块代码 从上到下 循序执行(<cliinit>()方法内顺...原创 2020-01-14 16:58:35 · 141562 阅读 · 1 评论 -
自旋方式
面试题:用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D5E.....26Z自旋方式:就是自己一直原地打转适用场景:代码比较短,短时间内效率特别高(执行在用户 态,不经过内核态。)特点:不经过操作系统public class Test02 { enum ReadytoRun {T1,T2}; static volatile Readyto...原创 2019-10-17 21:50:43 · 134419 阅读 · 0 评论 -
线程LockSupport类的park和unpark方法使用
面试题:用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D5E.....26ZLockSupport.park()让当前线程阻塞LockSupport.unpark(t2)解锁t2线程import java.util.concurrent.locks.LockSupport;public class Test { static Thread t1=null,t2=null; public static void main(String[] args) {原创 2019-10-17 21:08:16 · 116480 阅读 · 6 评论 -
JavaEE面试题----自增变量和单例设计模式
(1)、自增变量 考点。输出的结果是多少?public static void main(String[] args) { int i = 1; i = i++; int j = i++; int k = i + ++i * i++; System.out.println("i=" + i); System.out.println("j=" + j); Sy...原创 2019-09-27 21:25:41 · 152496 阅读 · 0 评论