![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java专栏
文章平均质量分 89
java相关
The-Venus
这个作者很懒,什么都没留下…
展开
-
简单说明String类为什么是final的
声明为final类的目的主要目的就是保证String是不可变(immutable)。不可变就是第二次给一个String 变量赋值的时候,不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。下面看String类源码如何保证是不可变的:public final class String implements java.io.Serializable, Comparable<String>, CharSequence{ /** The value is used for原创 2020-07-28 10:14:45 · 20662 阅读 · 0 评论 -
聊聊接口重试机制的几种解决方案
接口请求重试机制是保证系统稳定性和容错能力的重要手段之一。当接口请求发生失败或暂时性错误时,通过重试机制可以提高请求的成功率。本文将详细介绍接口请求重试机制的几种常见方法。// 可在此处自定义重试逻辑});Spring Retry 为接口请求重试提供了完善和易用的解决方案,可以灵活控制各种重试参数,适用于复杂系统的容错要求。使用自定义的重试工具类来实现接口请求的重试机制,提高代码的复用性和可维护性。提供重试方法,参数包括请求函数、重试策略等在重试方法内部执行循环请求。原创 2023-11-06 08:00:00 · 16359 阅读 · 108 评论 -
BigDecimal详细解析
简介 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是(unscaledValue × 10-scale)。先运行一套代码public static void main(String[] args) ...原创 2020-05-01 22:29:07 · 45442 阅读 · 1 评论 -
基础面试题:深拷贝和浅拷贝详解以及实例
深拷贝 vs 浅拷贝浅拷贝概念复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针,不复制堆内存中的对象。如图: 特点 1.对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个。2.对于引用类型,比如数组或者类对象,因为引用类型是引用传递,所以浅拷贝...原创 2020-04-30 13:04:02 · 44561 阅读 · 1 评论 -
基础面试题:Arrays 工具类详解(超详细)
Aarry的几个常用函数:排序 : sort()查找 : binarySearch()比较: equals()填充 : fill()转列表: asList()转字符串 : toString()复制: copyOf()排序 : sort()1 void sort(Object[] o):对数组从小到大的排序(String类型的数组不宜使用)2.void sort(int[] ...原创 2020-04-29 21:14:25 · 44070 阅读 · 1 评论 -
基础面试题:Collections 工具类详解
对集合本体的操作线程同步集合的包装特征方法名为synchronizedXxx适用范围ListCollectionSetMap缺点每次读写都要加锁,锁的层级为对象,不利于多线程的同时操作在使用Iterator的遍历时修改元素ConcurrentModificationException建议使用java.util.concurrent的集合线程同步类返回...原创 2020-04-28 09:11:08 · 43960 阅读 · 1 评论 -
基础面试题: final,static,this,super详解
final 关键字final关键字主要用在三个地方:变量、方法、类。对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。使用final方法的原因有两个。第一个原因是把方法锁定,...原创 2020-04-27 08:38:43 · 43934 阅读 · 1 评论 -
Java创建多线程的四种方式以及优缺点
java有以下四种创建多线程的方式:1:继承Thread类创建线程2:实现Runnable接口创建线程3:使用Callable和FutureTask创建线程4:使用线程池,例如用Executor框架创建线程DEMO代码:package thread; import java.util.concurrent.*; public class ThreadTes...原创 2020-04-22 23:09:52 · 52493 阅读 · 2 评论 -
基础面试题:java内存区域
JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 Hotspot VM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。13/04/2018 Page 22 of 283线程共享区域随虚拟...原创 2020-04-11 21:41:10 · 43856 阅读 · 1 评论 -
基础面试题: JDK 和 JRE
1.定义JDK 是 Java Development Kit,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不...原创 2020-04-09 23:03:03 · 44092 阅读 · 1 评论 -
abstract 和Interface的共同点和区别以及应用场景
共同点A.两者都是抽象类,都不能实例化B.Interface实现类和abstract继承类都必须实现抽象方法不同点A.Interface需要实现,用implements;Abstract 需要继承,用exendsB.一个类可以实现多个Interface ;一个类只能继承一个AbstractC.Interface强调功能的实现;Abstract强调从属关系D.Interf...原创 2020-03-25 00:43:59 · 45049 阅读 · 1 评论 -
浅谈java集合类以及示例
聊一聊java 的集合类概述Java中集合分为两种类型第一种:以单个元素存储。其超级父接口是:java.util.Collection;第二种:以键值对存储。(类似于python的集合)其超级父接口是:java.util.Map;前者每个位置只能保存一个元素,后者可以保存两个元素。分类Collection又可分为List、Set、QueueList下常用的有ArrayList、Li...原创 2020-05-04 14:28:56 · 48704 阅读 · 1 评论 -
Get和Post的区别以及注意点
概念GET和POST是什么?HTTP协议中的两种发送请求的方法。HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,都是TCP链接。GET和POST能做的事情是一样一样的。如果给GET加上request body,活着给POST带上url参数,技术上是完全行的通的。区别1.Get是...原创 2020-05-05 12:10:07 · 47932 阅读 · 1 评论 -
深入解析HashMap和currentHashMap源码以及实现原理
深入解析HashMap和ConcurrentHashMapy源码以及底层原理前言HashMap 和ConcurrentHashMap,这两个相信大家都不陌生,在面试中基本上是必问的,以及在实际开发过程中也是比用的,那么看了这篇文章,无论在面试还是在实际开发中都可以顺手拈来,得心应手了。HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null 建和null 值, 因为key不允许重复,因此只能有一个键为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入的顺序并原创 2020-05-10 00:16:10 · 104859 阅读 · 1 评论 -
java对象结构以及对象大小计算示例(通俗易懂)
概念在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。具体如下图java 普通对象结构java 数组对象结构对象结构组成对象头HotSpot虚拟机的对象头包括两部分信息:Mark Word第一部分Mark Word,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚原创 2020-05-17 10:34:51 · 57213 阅读 · 1 评论 -
synchronized底层原理以及锁升级过程
概念:synchronized是Java提供的一个并发控制的关键字,作用于对象上。主要有两种用法,分别是同步方法(访问对象和clss对象)和同步代码块(需要加入对象),保证了代码的原子性和可见性以及有序性,但是不会处理重排序以及代码优化的过程,但是在一个线程中执行肯定是有序的,因此是有序的。synchronized 的特性1 原子性所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行被synchronized修饰的类或对象的所有操作都是原子的,因为在执原创 2020-05-17 22:01:52 · 59418 阅读 · 1 评论 -
HashTable原理以及源码解析(通俗易懂)
HashTable原理以及源码解析(通俗易懂)UML图概念HashTable也是一个散列表,它存储的内容是键值对映射。HashTable继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。HashTable的函数都是同步的,这意味着它是线程安全的。它的Key、Value都不可以为null。此外,HashTable中的映射不是有序的。HashTable的实例有两个参数影响其性能:初始容量和加载因子。容量是哈希表中桶的数量,初始容量就是哈希表创建原创 2020-05-24 17:35:41 · 55164 阅读 · 1 评论 -
ThreadLocal常见面试题剖析
ThreadLocalMap 和HashMap区别HashMap 的数据结构是数组+链表ThreadLocalMap的数据结构仅仅是数组HashMap 是通过链地址法解决hash 冲突的问题ThreadLocalMap 是通过开放地址法来解决hash 冲突的问题HashMap 里面的Entry 内部类的引用都是强引用ThreadLocalMap里面的Entry 内部类中的key 是弱引用,value 是强引用链地址法这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并原创 2020-05-30 18:07:20 · 47653 阅读 · 1 评论 -
volatile 底层原理以及特性详解
如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题, netty, spring boot,spring cloud等系列文章,一系列干货随时送达, 超神之路从此展开, BTAJ不再是梦想!概念1 volatile变量,用来确保将变量的更新操作通知到其他线程。2 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。3 volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,原创 2020-06-09 20:40:22 · 42252 阅读 · 1 评论 -
深入解析JMM原理
如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题, netty, spring boot,spring cloud等系列文章,一系列干货随时送达, 超神之路从此展开, BTAJ不再是梦想!概念 Java内存模型(Java Memory Model,JMM)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Worki原创 2020-06-12 00:16:07 · 39817 阅读 · 3 评论 -
Java中的锁[原理、锁优化、CAS、AQS]
1、为什么要用锁?锁-是为了解决并发操作引起的脏读、数据不一致的问题。2、锁实现的基本原理2.1、volatileJava编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。volatile在多处理器开发中保证了共享变量的“ 可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。image.png结论:如果volatile变量修饰符使用转载 2020-10-25 00:01:48 · 19146 阅读 · 0 评论 -
HashMap, ConcurrentHashMap 原理及源码,一次性讲清楚!
HashMap, ConcurrentHashMap 原理及源码,一次性讲清楚!Java7 HashMapHashMap 是最简单的,一来我们非常熟悉,二来就是它不支持并发操作,所以源码也非常简单。首先,我们用下面这张图来介绍 HashMap 的结构。这个仅仅是示意图,因为没有考虑到数组要扩容的情况,具体的后面再说。大方向上,HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。上图中,每个绿色的实体是嵌套类 Entry 的实例,Entry 包含四个属性:key, value,转载 2020-10-28 01:19:33 · 17266 阅读 · 0 评论 -
【面试宝典】聊聊ConcurrentHashMap的存储流程
ConcurrentHashMap的存储流程如下:根据key的hash值得到数组索引ConcurrentHashMap底层是由一个数组构成的,数组的每个元素是一个链表。第一个步骤是根据key的hash值通过hash算法得到在这个数组中的索引。CAS插入数组元素使用CAS(比较和交换)操作尝试将这个key-value插入到得到的数组索引位置。如果这个位置的元素为空,或者元素的key与要插入的key一致,那么插入成功。如果CAS失败,遍历链表如果CAS插入失败,说明这个位置的元素的key与要插入的key不一致,原创 2023-05-17 10:08:41 · 5284 阅读 · 0 评论