![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试_Java
文章平均质量分 90
java
-Sloth-
脚踏实地 仰望星空
展开
-
String、StringBuffer与StringBuilder之间区别
一、Java String 类——String字符串常量 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,这样不仅效率低下,而且大量浪费有限的内存空间,所以经常改变内容的字符串最好不要用 String 。因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC ...转载 2020-12-28 13:28:14 · 128 阅读 · 0 评论 -
线程创建的三种方式及区别
创建方式继承Thread类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 (2)创建Thread子类的实例,即创建了线程对象。 (3)调用线程对象的start()方法来启动该线程。package Thread;import java.util.concurrent.*;public class TestThread { public static void main(St..转载 2020-12-25 18:20:53 · 250 阅读 · 0 评论 -
类的初始化与实例化知识点
前言之前说了类加载的过程,但是有的读者表示还是有些面试题还是答不来,所以今天就来总结下类加载、对象实例化方面的知识点/面试题,帮助大家加深印象。全是干货,一网打尽类的基础知识!先看看下面的问题都能回答上来吗? 描述new一个对象的过程,并结合例子说明。 类初始化的触发时机。 多线程进行类的初始化会出问题吗? 类的实例化触发时机。 <clinit>()方法和<init>()方法区别。 在类都没有初始化完毕之前,能直接进行实转载 2020-12-25 11:35:59 · 652 阅读 · 0 评论 -
线程池回收工作线程
下面以JDK1.8为例进行分析1.runWorker(Worker w)工作线程启动后,就进入runWorker(Worker w)方法。里面是一个while循环,循环判断任务是否为空,若不为空,执行任务;若取不到任务,或发生异常,退出循环,执行processWorkerExit(w, completedAbruptly); 在这个方法里把工作线程移除掉。取任务的来源有两个,一个是firstTask,这个是工作线程第一次跑的时候执行的任务,最多只能执行一次,后面得从getTask()方法里.转载 2020-12-23 17:51:02 · 276 阅读 · 0 评论 -
Android线程池总结
使用线程池的好处: 1.重用已经创建的好的线程,避免频繁创建进而导致的频繁GC 2.控制线程并发数,合理使用系统资源,提高应用性能 3.可以有效的控制线程的执行,比如定时执行,取消执行等线程池的构造方法:public ThreadPoolExecutor(int corePoolSize, int maxi原创 2017-07-03 16:54:39 · 300 阅读 · 0 评论 -
Synchronized底层实现
本系列文章将对HotSpot的synchronized锁实现进行全面分析,内容包括偏向锁、轻量级锁、重量级锁的加锁、解锁、锁升级流程的原理及源码分析。一、synchronized简介Java中提供了两种实现同步的基础语义:synchronized方法和synchronized块, 我们来看个demo:public class SyncTest { public void syncBlock(){ synchronized (this){ Syst...转载 2020-10-11 20:21:40 · 89 阅读 · 0 评论 -
BigDecimal与精度丢失
为什么使用float或double会精度丢失?根本原因在于,数学意义上的小数不是每个都能用二进制在有限位数内精确的表示。像 0.1,1.1 这样的小数没有精确的二进制表示,然后求和就不是1.2了。BigDecimal为什么可以保证精度?BigDecimal保证精度的解决思路其实极其的简单朴素:十进制整数在转化成二进制数时不会有精度问题,那么把十进制小数扩大N倍让它在整数的维度上进行计算,并保留相应的精度信息。我们在使用BigDecimal时,使用它的BigDecimal(String)构造器创建原创 2020-10-11 14:57:56 · 456 阅读 · 0 评论 -
JAVA实现多个线程顺序执行的几种方式
题目描述:如何保证多个线程的顺序执行?join方式实现join方式即使用Thread.join方法来实现。Thread.join含义当前线程需要等待previousThread线程终止之后才从thread.join返回。简单来说,就是线程没有执行完之前,会一直阻塞在join方法处。join方式实现方式存在两种:主线程join和执行线程join。下面我们依次来分析一下:1.主线程join上面源码就是主线程join的实现方式,其原理就是保证执行线程执行完毕再start后续线程,从而.原创 2020-09-26 22:53:22 · 6826 阅读 · 0 评论 -
JAVA多线程中join()方法解析
首先给出结论:t.join()方法只会使主线程(或者说调用t.join()的线程)进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。之前对于join()方法只是了解它能够使得t.join()中的t优先执行,当t执行完后才会执行其他线程。能够使得线程之间的并行执行变成串行执行。public class TestJoin { public static void main(String[] args) throws InterruptedException {转载 2020-09-13 20:28:42 · 348 阅读 · 0 评论 -
Java垃圾回收机制与分代回收策略
什么是垃圾?所谓垃圾就是内存中已经没有用的对象。 既然是”垃圾回收",那就必须知道哪些对象是垃圾。Java 虚拟机中使用一种叫作"**可达性分析”**的算法来决定对象是否可以被回收。可达性分析可达性分析算法是从离散数学中的图论引入的,JVM 把内存中所有的对象之间的引用关系看作一张图,通过一组名为”GC Root"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,最后通过判断对象的引用链是否可达来决定对象是否可以被回收。比如上图中,对象A/B/C/D/E 与 GC R原创 2020-10-17 18:00:26 · 446 阅读 · 0 评论 -
Java内存区域划分
Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。下面描述了一个java 文件被 JVM 加载到内存中的过程:1. HelloWorld.java 文件首先需要经过编译器编译,生成 HelloWorld.class 字节码文件。2. Java 程序中访问HelloWorld这个类时,需要通过 ...原创 2020-12-28 16:49:17 · 141 阅读 · 0 评论 -
java中的深拷贝与浅拷贝
值类型 vs 引用类型这两个概念的准确区分,对于深、浅拷贝问题的理解非常重要。正如Java圣经《Java编程思想》第二章的标题所言,在Java中一切都可以视为对象!所以来到Java的世界,我们要习惯用引用去操作对象。在Java中,像数组、类Class、枚举Enum、Integer包装类等等,就是典型的引用类型,所以操作时一般来说采用的也是引用传递的方式;但是Java的语言级基础数据类型,诸如int这些基本类型,操作时一般采取的则是值传递的方式,所以有时候也称它为值类型。为了便于下文的讲述转载 2020-09-06 18:31:56 · 129 阅读 · 0 评论 -
ThreadLocal
1、ThreadLocal是什么?ThreadLocal 直译就是「线程本地变量」,意思是 ThreadLocal 中填充的变量属于「当前」线程,该变量对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用 ThreadLocal,就可能会导致内存泄漏。在 Android 的原创 2020-08-25 19:58:36 · 94 阅读 · 0 评论 -
HashMap、HashTable、ConcurrentHashMap
1.HashMap 的数据结构?A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过 8 时或是数组的长度达到64个,链表转换为红黑树。2.HashMap 的工作原理?HashMap 底层是 hash 数组和单向链表实现,数组中的每个元素都是链表,由 Node 内部类(实现 Map.Entry接口)实现,HashMap 通过 put & get 方法存储和获取。存储对象时,将 K/V 键值传给 put() 方法:①、调用 hash(K) 方法计算 K原创 2020-08-23 19:05:46 · 211 阅读 · 0 评论