自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 synchronized在1.6后的底层优化(锁升级)

JDK1.6 对锁的实现引入了大量的优化来减少锁操作的开销,如: 偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化 等等技术。锁主要存在四中状态,依次是: 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态 锁🔐会随着竞争的激烈而逐渐升级。另外,需要注意:锁可以升级不可降级,即 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁是单向的。 这种策略是为了提高获得锁和释放锁的效率。偏向锁引入偏向锁的目的和引入轻量级锁的目的...

2022-04-06 16:04:17 750

原创 java并发总结(面试常问题)

请简要描述线程与进程的关系,区别及优缺点?从 JVM 角度说进程和线程之间的关系图解进程和线程的关系下图是 Java 内存区域,通过下图我们从 JVM 的角度来说一下线程和进程之间的关系。​​从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的堆和方法区 (JDK1.8 之后的元空间)资源,但是每个线程有自己的程序计数器、虚拟机栈 和 本地方法栈。总结: 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为...

2022-04-05 17:43:20 317

原创 aqs原理及同步组件

常见问题:AQS 原理?;CountDownLatch 和 CyclicBarrier 了解吗,两者的区别是什么?用过 Semaphore 吗?1 AQS 简单介绍AQS 的全称为(AbstractQueuedSynchronizer),这个类在 java.util.concurrent.locks 包下面。AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 Re...

2022-04-04 21:07:56 265

原创 Java 并发进阶问题(syn、volatile面试常考)

1.synchronized 关键字1.1.说一说自己对于 synchronized 关键字的了解synchronized 关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在 Java 早期版本中,synchronized 属于 重量级锁,效率低下。为什么呢?因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原.

2022-04-04 19:26:08 442

原创 java创建对象全过程

java是一门面向对象的编程语言,在程序运行过程中无时无刻都有对象被创建。在语言层面上,创建对象通常(例外:复制、反序列化)仅仅是一个new关键字而已,而在虚拟机中对象的创建又是怎样的一个过程呢?1.检查当Java虚拟机遇到一条字节码new指令时,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。2.分配内存在类加载检查通过后,将为新生对象分配内存。对象所需的内存大小在类加载完成后便可

2022-04-04 10:43:11 508

原创 java并发编程艺术第四章解析

4.1 线程简介现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作 系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局 部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉 到这些线程在同时执行。使用多线 程的原因主要有以下几点。(1)更多的处理器核心:线程是大多数操作系统调度的基本单元...

2022-04-03 16:20:16 655

原创 JAVA并发编程艺术第三章读书笔记

3.1 Java内存模型的基础3.1.1 并发编程模型的两个关键问题在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的 线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程 中,线程之间的通信机制有两种:共享内存和消息传递。Java的并发采用的是共享内存模型3.1.2 Java内存模型的抽象结构Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享 变量的写入何时对另一个线程可见。从抽象的角度来看..

2022-04-02 16:50:02 114

原创 java并发编程艺术第二章读书笔记

2.1volatile的应用在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级synchronized(执行成本更低),它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程 修改一个共享变量时,另外一个线程能读到这个修改的值。我们也常说synchronized是读写安全的,volatile是读安全的。 synchronized不能修饰变量,volatile可以!我简单介绍一下这几个术语:1、内存屏障:简单理...

2022-04-01 23:38:50 406

原创 Tomcat详细实现原理

Tomcat需要main方法启动。Tomcat需要监听本机上的某个端口。Tomcat需要抓取此端口上来自客户端的链接并获得请求调用的方法与参数。Tomcat需要根据请求调用的方法,动态地加载方法所在的类,完成累的实例化并通过该实例获得需要的方法最终将请求传入方法执行。将结果返回给客户端(jsp/html页面、json/xml字符串)startup.sh->catalina.sh里面包含bootstrap先扫描webapps,遍历其中的java文件,拿到所有.class文件的路径.

2022-04-01 17:01:13 491

原创 synchronized锁的升级介绍

1.三种方式加锁1)修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁。2)静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。3)修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。2.无锁无锁是指没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。特点:修改操作会在循环内进行,线程会不断的尝试修改共享资源。如果没有冲突就修改成功并退出,否则就会继续循环尝试。如果有多个线程修改同一个值,必定会有

2022-03-29 17:12:39 143

原创 Java 核心集合容器全解

什么是集合?顾名思义,集合就是用于存储数据的容器。集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。集合的特点 对象封装数据,多个对象需要用集合存储; 对象的个数可以确定使用数组更高效,不确定个数的情况下可以使用集合,因为集合是可变长度 有哪些常用的集合类 Java 容器分为 Collection 和 Map 两大类,Collection 集合的子接口有 Set、List、Que

2022-03-29 16:54:34 1125

原创 动态规划力扣题复盘

动态规划力扣题复盘,这道题相较于普通的动态规划创建一个dp数组有更加简单的解法,如果碰到一个负数,则该位置应该等于上一个数字。截下来看一道比较典型的动态规划题首先遍历一下股票数组,在每一次遍历时查看当前数字是否为最小的,最小的我们当作买入的价钱,然后使用状态转移方程,判断dp数组当前位置应该是填入上一个位置的数字还是当前股票数组位置的价格减去买入价格。第11行判断最小买入价格,12行状态转移方程。....

2022-03-29 16:42:33 152

原创 TCP和UDP

TCPTCP协议是面向链接的,通过TCP协议传输的数据是通过字节流的形式传输,通过TCP传输是可靠的,不过也因此传输速率较慢。TCP一般用于文件传输,接受邮件,远程登录等场景TCP建立连接 三次握手四次挥手机制三次握手四次挥手TCP是如何保证数据的可靠传输的应用数据会被分割成TCP认为最适合发送的数据块TCP会给发送的每一个包进行编号,接收方会对数据包进行排序,将有序数据传送给应用层校验和 : TCP 将保持它首部和数据的检验和。如果收到的段校验和有差错的话,TCP将会丢弃

2022-03-26 21:26:37 128

原创 深入理解JVM之类加载机制

上一章我们学习了Class文件存储格式的具体细节,在Class文件中描述的各类信息,最终都需要加 载到虚拟机中之后才能被运行和使用。而虚拟机如何加载这些Class文件,Class文件中的信息进入到虚 拟机后会发生什么变化,这些都是本章将要讲解的内容。Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成 的(..

2022-03-18 18:12:30 1140

原创 深入理解jvm第六章笔记

Class类Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文 件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数 据,没有空隙存在。当遇到需要占用8个字节以上空间的数据项时,则会按照高位在前[2]的方式分割 成若干个8个字节进行存储。·无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个 字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成

2022-03-18 14:08:45 954

原创 判断对象已死两方法及应用

本文主要介绍判断对象已死的两个方法:引用计数算法在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的。但是,在Java 领域,至少主流的Java虚拟机里面都没有选用引用计数算法来管理内存,主要原因是,这个看似简单 的算法有很多例外情况要考虑,必须要配合大量额外处理才能保证正确地工作,譬如单纯的引用计数 就很难解决对象之间相互循环引用的问题。可达性分析这个算法的...

2022-03-13 23:23:59 117

原创 深入理解jvm第二章读书笔记

本文直接从第二章的主要内容开始记录(第一章主要是java的发展历程等内容 有兴趣可自查)上图运行时数据区中 方法区和堆是线程共享、虚拟机栈、本地方法去、程序计数器为私有程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器。如果线程正在执行的是一个Java方法,这个计数器...

2022-03-13 22:41:42 1807

原创 java类的初始化顺序

首先要明白各个部分的初始化顺序:(静态变量、静态初始化块)>(变量、初始化块)>构造器。这里要强调一点,程序从main方法进入,首先判断类是否加载过,如果没有加载则先进行类加载。从例子说明class Test{ public static String a="静态变量"; public static Test t1=new Test("t1"); public String b="非静态变量"; static { System.out.

2022-02-19 17:09:40 453

原创 Spring如何解决循环依赖 三级缓存

首先抛出问题 什么是循环依赖 举个例子 有两个类A和B,其中A类包含一个B类实例,B类包含A类实例,不用测试都能猜到会报错。在Spring项目中,很有可能发生这种相互依赖的情况,所以Spring对此有解决方案。@Servicepublic class TestService1 { @Autowired private TestService2 testService2; public void test1() { }}@Servicepublic

2022-02-19 16:03:14 255

原创 深入理解 MySQL 的 MVCC 机制

undo logundo log是回滚日志,有两个作用:提供回滚操作和多个行版本控制(MVCC)。在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。undo log和redo log记录物理日志不一样。undo log主要记录的是数据的逻辑变化,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记

2022-02-13 23:49:46 665

原创 MySql并发的四个问题及隔离等级

并发事务带来哪些问题在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。(读了未被提交的数据) 丢失修改(Lost

2022-02-13 23:09:17 152

原创 MVCC简单介绍

MVCC(Multi-Version Concurrency Control)即多版本并发控制。我们在了解MVCC之前,首先先了解一下几个比较常见的锁。读锁:也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。写锁:又称排他锁、X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。

2022-02-13 22:56:38 376

原创 缓存穿透及布隆过滤器

什么是缓存穿透?缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。举个例子:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库。一般解决缓存穿透我们会用到布隆过滤器,把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会走下面的流程。(加入布隆过滤器)实际上可以把它看作由二进制向..

2022-02-13 20:30:12 851

原创 剑指offer14-剪绳子 最简单方法

分析题目我们发现,在n<4的时候,最大乘积都是n-1(必须切一刀),等于4的时候切成2等分,乘积为2,但是大于4的时候,我们可以发现,切成多个长度为三,余数<=4的多个线段,乘积越大(因为只要大于4,只要切成带有一个3长度的一定比其他切法乘积大,比如5切成2 3,6切成3 3)比如 10我们分成3 3 4,乘积为36,17切成 3 3 3 3 3 2 乘积3^5*2。根据这个原理 我们很容易可以做个while循环实现class Solution { public int cut..

2022-01-24 23:37:32 197

原创 leetcode101对称二叉树的两种解法(递归、迭代)

这里所说的对称是轴对称,也就是说,左子树的左孩子要和右子树右孩子一样,左子树右孩子和右子树左孩子一样。下面是递归方法:class Solution { public boolean isSymmetric(TreeNode root) { if(root==null){ return true; } return deep(root.left,root.right); ...

2022-01-21 20:11:59 554

原创 大顶堆排序java实现

堆的性质:(1)性质:完全二叉树或者是近似完全二叉树;(2)分类:大顶堆:父节点不小于子节点键值,小顶堆:父节点不大于子节点键值;图展示一个最小堆:(3)左右孩子:没有大小的顺序。(4)堆的存储一般都用数组来存储堆,i结点的父结点下标就为(i–1)/2。它的左右子结点下标分别为2∗i+1和2∗i+2。如第0个结点左右子结点下标分别为1和2。(5)堆的操作建立:以最小堆为例,如果以数组存储元素时,一个数组具有对应的树表示形式,但树并不满足堆的条件,需要重新排列元素,可...

2022-01-21 00:51:32 442

原创 选择排序原理及java实现

原理:从所有记录中选出最小的一个数据元素与第一个位置的记录交换;然后在剩下的记录当中再找最小的与第二个位置的记录交换,循环到只剩下最后一个数据元素为止。稳定性:不稳定排序。时间复杂度:最坏、最好和平均复杂度均为O(n2),因此,简单选择排序也是常见排序算法中性能最差的排序算法。简单选择排序的比较次数与文件的初始状态没有关系,在第i趟排序中选出最小排序码的记录,需要做public class xuanze { public static void xuanze(int [] arr){.

2022-01-21 00:29:52 428

原创 插入排序java实现

原理:从待排序的n个记录中的第二个记录开始,依次与前面的记录比较并寻找插入的位置,每次外循环结束后,将当前的数插入到合适的位置。稳定性:稳定排序。时间复杂度: O(n)至O(n2),平均时间复杂度是O(n2)。最好情况:当待排序记录已经有序,这时需要比较的次数是Cmin=n−1=O(n)。最坏情况:如果待排序记录为逆序,则最多的比较次数为Cmax=∑i=1n−1(i)=n(n−1)2=O(n2)。public class charu { public void Insert(i

2022-01-21 00:24:04 311

原创 快速排序原理及java实现

算法原理:(1)从待排序的n个记录中任意选取一个记录(通常选取第一个记录)为分区标准;(2)把所有小于该排序列的记录移动到左边,把所有大于该排序码的记录移动到右边,中间放所选记录,称之为第一趟排序;(3)然后对前后两个子序列分别重复上述过程,直到所有记录都排好序。稳定性:不稳定排序。时间复杂度:O(nlog2n)至O(n2),平均时间复杂度为O(nlgn)。import java.util.Scanner;public class kuaisu { public st..

2022-01-21 00:22:06 197

原创 冒泡排序java实现

首先简单了解一下冒泡排序,从数组中第一个数开始,依次遍历数组中的每一个数,通过相邻比较交换,每一轮循环下来找出剩余未排序数的中的最大数并”冒泡”至数列的顶端。很容易就能想到用嵌套for循环可以实现。时间复杂度为O(n²)public class maopao { public void Bubble(int[]arr){ for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-i-

2022-01-20 22:18:50 280

原创 leetcode234回文链表

首先查看题目,所谓回文,就是正着遍历和倒着遍历都一样,很容易想到,如果我找到中间节点,从中间往后的每一个和从中间往前每一个结点的数字应该是一样的。这道题可以说是反转链表的升级版。 我们需要用到一个快慢指针的思想,如果我快指针每次前进两位,慢指针每次前进一位,快指针到最后时,慢指针一定在中间位置。如图 是长度为奇偶两种情况class Solution { public boolean isPalindrome(ListNode head) { if(head =..

2022-01-18 23:07:17 305

原创 校园导游图(数据结构 迪杰斯特拉 prime)

校园导游图1.1功能需求:1)为来访客人提供图中任意景点相关信息的查询。2)为来访客人提供图中任意2个景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。3)以尽可能低的造价建造景点间的通信网络把这些景点联系在一起,每条通信线路的造价与景点间的距离成正比。使用工具visualstudio2019实现。2.1概要设计:图结构基于邻接表实现,包括node型的邻接点域,vnode型的顶点域,构建一个vnode型的数组作为邻接表。包含三个方法分别是查找景点信息的messagefi

2022-01-18 20:21:30 1314

原创 01背包问题三种解决(贪心动态规划分支限界)

一、实验目的1、深入理解背包相关问题。2、能正确设计相应的算法,解决实际问题。 3、掌握算法时间复杂度分析。二、实验要求用3种方法求解0-1背包问题(贪心算法、动态规划、分支限界法),获得精确最优解或近似最优解均可。 通过一个规模较大的实例比较不同方法的求解速度,分析不同算法的时间复杂度,并分析是否能获得最优解。 实验结果跟实验设置的参数(如:背包容量、物品的体积)关系很大,简要分析参数对结果的影响。三、实验原理1.动态规划解0-1背包原理:动态规划基本思想是将带.

2022-01-18 20:05:41 21058 2

原创 利用栈和队模拟一个停车场(数据结构报告)

二.实验内容:题目:模拟停车厂管理问题描述:设停车厂只有一个可停放5辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。基本要求:以栈模拟停车场,以队列模拟车场外

2022-01-18 20:03:54 2832

原创 哈夫曼编码实验报告

二.实验内容:题目:哈夫曼编码/译码问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发编写一个哈夫曼码的编/译码系统。基本要求:接收原始数据(电文):从终端输入电文(电文为一个字符串,假设仅由26个小写英文字母构成)。(2)编码:利用已建好的哈夫曼树,对电文进行编

2022-01-18 20:01:41 16435 4

原创 JDK1.7HashMap源码详细解读

(本文的源码解析都存在与代码块的注释里面,请耐心观看)开始之前 我们先简单了解以下HashMap。HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。(其实所谓Map其实就是保存了两个对象之间的映射关系的一种集合)简单理解一下上面的图,假设我目前有一个数组,我想在数组中放入一个k-v结构的数据比如(“xmc”,“hansome”)它会根据数据的key也就是xmc,计算出一个hash码,根据hash码放入数组之中,这

2022-01-17 22:25:49 523

原创 IDEA搭建Spring Boot项目(引入Mybatis Plus)

打开idea,左上角文件》》新建》》项目》》文件路径与名字(路径尽量不出现中文》》完成等待右下角依赖性解析完成,随后打开左边pom.xml依赖,其中只包含保证运行的基本依赖和一个lombok <!-- Mybatis Plus整合--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-..

2022-01-15 23:39:40 2224

原创 String、StringBuffer、StringBuilder不同点

1.什么是字符串常量池?JVM为了减少字符串对象的重复创建,其维护了一块特殊的内存,这段内存被称为字符串常量池(存储在方法区中)。当代码中出现字符串时,JVM首先会对其进行检查。如果字符串常量池中存在相同内容的字符串对象,如果有,则不再创建,直接返回这个对象的地址返回。如果字符串常量池中不存在相同内容的字符串对象,则创建一个新的字符串对象并放入常量池,并返回新创建的字符串的引用地址。new String(“str”)时,首先也会去检查常量池是否存在“str”(存在则不创建、不存在则在常量池先创建一个)

2022-01-15 23:28:00 56

原创 final和static区别与联系

都可以修饰类、方法、成员变量。static可以修饰类的代码块,final不可以。static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块,只会被执行一次static不可以修饰方法内的局部变量,final可以。static修饰表示静态或全局,被修饰的属性和方法属于类,可以用类名.静态属性 / 方法名 访问static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,只会被创建一次static修饰的变量可以重新赋值,static修饰的变量如果修改,所

2022-01-15 21:54:25 132

原创 源码中看128陷阱及一个简单例子学懂

128陷阱涉及自动装箱内容,可先去(62条消息) 自动拆装箱_Edward_Mcc的博客-CSDN博客简单学习下。128陷阱所谓128陷阱就是,int自动装箱为Integer时,-128到127范围内的Integer对像相同的数字共用一块内存空间//public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high)//大于-128且小于127..

2022-01-15 21:46:25 80

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除