
Java基础
轻尘×
一念起,千山万水;一念灭,沧海桑田;生活,或许本该就有诸多遗憾;那些情,已散落天涯,那些未说完的话、未叙完的故事,终将被流年吹散
展开
-
解析知乎热榜
实现一个简单的需求,解析知乎热榜,主要涉及找到热榜接口、json解析、返回值中文乱码处理(Unicode编码)、RestTemplate配置等等。这只是简单的实现了功能,如果需要实际使用还有很多问题没有解决,比如自动获取的频率应该设置为多少,太频繁了可能导致被别人封禁,频率太低又没有时效性;如果要应对并发访问,可以将获取来了的数据存到自己的缓存系统中去,比如redis中,自己系统访问的时候优先访问本地缓存,缓存的过期时间就参照上面的分析来设置。...原创 2022-08-30 16:40:01 · 715 阅读 · 0 评论 -
将一个单向链表拆分成两个java实现
常见的一道笔试题:链表拆分,将一个单向链表和拆分成两个,如下所示:原始链表:1—>2—>3—>4—>5—>6—>7拆分后链表A:1—>3—>5—>7拆分后链表B:2—>4—>6思路:定义两个头节点,作为新链表的头,分别指向原链表的前两个元素再定义两个浮动,初始值分别指向新链表的头结点然后交替遍历原始节点,将各自的next赋值给新链表待遍历到最后,需要为两个新链表指定尾节点,即赋值为null最后退出循环。...原创 2022-07-14 18:25:54 · 896 阅读 · 0 评论 -
实例讲解ThreadPoolExecutor线程池任务执行过程
为了方便测试,设置核心线程数(corePoolSize)为2,最大线程数(maximumPoolSize)为3,任务队列长度为3。创建一个线程池,任务执行时长通过doSomeThing的sleep时长来决定。问题1启动线程池,还未提交任务,此时线程池有几个线程?答:0个,debug可以看出,创建线程池后,并没有往线程池添加线程。 提交第一个任务,待第一个任务执行完成之后,再提交第二个任务,此时线程池有几个线程?即在第一个任务执行完成后,提交第二个任务,是否会创建新线程?答:会创建新线程源码的注释上原创 2022-07-07 10:22:02 · 937 阅读 · 0 评论 -
java字节码层面逐行分析,解释i++和++i的区别
源码 public void testAdd(){ int a = 10; a = a++; System.out.println(a); } public void testAddAdd(){ int a = 10; a = ++a; System.out.println(a); }编译后生成的字节码testAdd()public void原创 2022-05-24 14:18:04 · 271 阅读 · 0 评论 -
java新特性之Stream,演变过程
遍历数组1.0 public static void ergodicList(List<Integer> list){ for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } }遍历List1.5 public static void ergodicList(List<Integer> ..原创 2022-05-10 13:43:43 · 242 阅读 · 0 评论 -
spring 事务传播机制总结
spring事务的传播机制定义在 TransactionDefinition 接口中,定义了如下传播类型PROPAGATION_REQUIRED支持当前事务,如果没有当前事务就创建一个新的事务,是默认的传播行为。外围方法未开启事务内部会创建新事务,若新事务回滚,不影响外围方法。外围方法开启事务内部方法会加入到外围方法的事务中,使用同一个事务,不管内外谁发生异常,整个事务都将回滚。/** * Support a current transaction; create a原创 2022-04-28 15:20:52 · 675 阅读 · 0 评论 -
玩大了,机试让写一段代码模拟OOM,结果电脑死机了,面试官脸都绿了
public static void testStackOutOfMemory(){ while (true) { Thread thread = new Thread(new Runnable() { public void run() { while(true){} } }); thread.start(); } }上面这个必死,下面这个没试过 public static void testStackOutOfMemory() { ..原创 2022-04-18 15:01:42 · 264 阅读 · 0 评论 -
Spring @Transactional注解失效场景重现
环境jdk1.8 + springboot 2.1.0.RELEASE+mysql 8 innerDB存储引擎正常在数据插入一条数据抛出checked异常 @Transactional public ApiResult updateUser(@RequestBody UserParams user) throws Exception { SysUser sysUser = new SysUser(); sysUser.se..原创 2022-04-15 17:02:07 · 1022 阅读 · 0 评论 -
免费的图片识别接口,百度ocr的SDK使用java版
申请使用,个人完成认证可获得一定的免费使用场景,用来测试或者简单的场景足够了百度智能云-登录https://console.bce.baidu.com/ai/?_=1649487753967&fromai=1#/ai/ocr/overview/index创建应用,获得APP_ID、API_KEY和SECRET_KEY参考文档进行测试https://ai.baidu.com/ai-doc/OCR/Ikibizxqlhttps://ai.baidu.com/ai-d...原创 2022-04-09 16:10:57 · 2527 阅读 · 0 评论 -
jdk1.8 HashMap哈希表底层采用何种算法计算hash值?如何确定元素在哈希表的下标
关键代码取hash自身hashCode 按位异或hashCode无符号右移16位当数组的长度很短时,只有低位数的hashcode值能参与运算。而让高16位参与运算可以更好的均匀散列,减少碰撞,进一步降低hash冲突的几率。并且使得高16位和低16位的信息都被保留了。static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h.原创 2022-03-23 18:52:31 · 1194 阅读 · 1 评论 -
jdk1.8HashMap扩容后链表拆分过程解析
源码拆分思路逐行解析原创 2022-03-12 16:37:15 · 975 阅读 · 0 评论 -
@Options(useGeneratedKeys = true, keyProperty = “id“, keyColumn = “id“,mybatis主键自增长,返回主键值配置问题
在很多场景下,会将某个实体的主键设为自增长,但在某些场景下,需要在实体插入数据的同时就获取该实体的主键值;例如在用户注册时,我们需要将用户信息插入用户表,同时,我们需要生成一条与用户关联的另一张表的记录,在同一段逻辑代码中,就需要用户信息插入的同时,返回自增长的主键用以关联其他信息,mybatis配置方式如下。实体类@Getter@Setter@ToString@TableName("acc_sys_t_user")public class SysUser implements S..原创 2022-03-07 09:51:24 · 2637 阅读 · 0 评论 -
一把锁引发的问题,synchronized方法与非synchronized方法共存产生数据脏读问题
模拟场景:写一段小程序,一个方法给某人账户充值,另一个方法查询某人的账户,如果两个方法都不加锁,并发情况下肯定会问题,现在只给充值方法加锁,查询方法不加,由于synchronized与非synchronized方法可以同时运行,所以查询方法可能产生脏读问题。public class Account { String name; double balance; public synchronized void setBalance(String name, do..原创 2022-01-27 17:28:55 · 410 阅读 · 0 评论 -
java实现三个线程按指定顺序执行
让前一个线程先执行,即Thread_after中调用Thread_before.jion()原创 2022-01-25 19:40:40 · 1151 阅读 · 0 评论 -
利用ClassLoad机制实现单例模式,安全省心
利用了 classloder的机制来保证初始化 instance 时只有一个线程原创 2022-01-24 10:12:30 · 2515 阅读 · 0 评论 -
一道面试题引出的Java加载、链接与初始化verification、preparation、resolution、initialization过程
背景试题case 1public class JavaLoading { private static int NUM = 3; private static JavaLoading INSTANCE = new JavaLoading(); private JavaLoading() { NUM++; } public static void main(String[] args) { System.out.prin原创 2022-01-10 11:17:18 · 451 阅读 · 0 评论 -
8位的能表示的范围是±2^7(最高位做符号位),也就是±128,为什么单精度浮点数的指数范围却是-126~127呢?
8个字节的能表示的范围是±2^7(最高位做符号位),也就是±128,为什么单精度浮点数的指数范围却是-126~127呢?我是在《计算机组成原理》一书中解开迷惑的按照IEEE754标准规定,浮点数的表示方式如下中间的8位数阶码是无符号数,原本它的范围是0~2^8,即0~256IEEE754规定只取1~254最为阶码的取值范围,255和0用于表示特殊值。阶码与实际指数之间满足如下关系:阶码=127+实际指数值所以实际指数的范围就是1-127~254-127,即-1..原创 2021-12-31 14:54:17 · 2138 阅读 · 2 评论 -
java堆与方法区、运行时常量池的关系
援引在《The Java Virtual Machine Specification Java SE 14 Edition》中描述对堆得描述The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arr原创 2021-12-31 14:30:53 · 530 阅读 · 0 评论 -
同样是32位,为什么float能表示的数据范围比int的大?
System.out.println("Float.MAX_VALUE:"+Float.MAX_VALUE); System.out.println("Integer.MAX_VALUE:"+Integer.MAX_VALUE); System.out.println("Integer.MIN_VALUE:"+Integer.MIN_VALUE);Float.MAX_VALUE:3.4028235E38Integer.MAX_VALUE:2147483647Integer.MIN_VALU..原创 2021-12-28 16:22:58 · 4386 阅读 · 0 评论 -
深度剖析JVM常量池,String字符串相关八股文,茴香豆的茴有几种写法?
最近看到一篇非常有深度的博文,用流行语说就是——整的我都不会了!有兴趣的可以来挑战一下,文末有原文链接!盲猜1String a="Mic";String b="Mic";assert(a==b);盲猜2String a =new String(new char[]{'a','b','c'}); String b = a.intern(); System.out.println(a == b);盲猜3 String x =new String("def");原创 2021-11-09 16:55:02 · 322 阅读 · 0 评论 -
走读源码探究HashMap的树化时机以及红黑树的操作机制
通过两篇文章:深入源码分析HashMap到底是怎样将元素put进去的 和 HashMap扩容后,元素是如何重新分布的,我们逐一分析了HashMap的初始化和扩容机制,在末尾还留下了一个悬念,就是HashMap的树化,即什么时候转化成红黑树,以及怎么转成红黑树的没有深入探究,今天我们就来通过走读代码,一步一步走进HashMap的红黑树。目的探究Node转化成TreeNode的时机以及TreeNode的操作机制说明本次探究使用的jdk版本:1.8HashMap结构示意图思路通过以往的两次分析,我原创 2021-04-15 15:02:16 · 580 阅读 · 1 评论 -
java正则表达式文本处理,将N个换行替换成单个
/** * 多个换行改成一个 * @param content * @return */ public static String replaceMultipleLineFeedsWithOne(String content){ Pattern p1 = Pattern.compile("(\r?\n(\\s*\r?\n)+)"); Matcher m1 = p1.matcher(content); r...原创 2021-03-11 10:54:12 · 950 阅读 · 0 评论 -
synchronized实现两个线程交替运行
背景用两个线程交替输出A-Z和1-26,即一个线程输出A-Z,另一个线程输出1-26而且是交替形式线程1输出A——线程二输出1线程1输出B——线程二输出2线程1输出C——线程二输出3以此类推分析主要考察线程之间的通信,思路就是创建两个线程在一个线程输出一个内容之后,自己进入阻塞,去唤醒另一个线程另一个线程同样,输出一个内容之后,自己进入阻塞,去唤醒另一个线程代码实现(一)public class AlternateCover { public static void m原创 2020-10-26 15:07:27 · 739 阅读 · 3 评论 -
关于java的switch接收字符串底层实现逻辑
看一段代码,这是一道试题,思考一下,结果是什么?为什么?package cn.com.suntree.utils.myself;public class SwitchTest { public static void main(String[] args) { String paramStr = null; switch (paramStr){ case "boy": break;原创 2020-09-24 18:24:35 · 673 阅读 · 0 评论 -
使用LinkedHashMap实现简单的LRU
LRU在很多缓存失效策略中会涉及,本质是一种节约更公平的节约资源策略,最近最少使用java中的LinkedHashMap就有自带的实现LRU简单说一下LinkedHashMap这种数据结构,本质是HashMap+双向链表,不仅有HashMap的特性,还能维护元素的顺序,示意图如下使用LinkedHashMap实现简单的LRUpackage cn.com.suntree.utils.myself;import java.util.LinkedHashMap;import java.util.M原创 2020-09-22 14:15:28 · 988 阅读 · 0 评论 -
探究java类的加载顺序
基类public class Father { private int i = testFather(); // 6 private static int f = method();// 1 static { System.out.println("父类静态代码块被加载");// 2 } private static int f2 = method2();// 3 Father(){ // 9 System.out.原创 2020-09-21 14:53:35 · 204 阅读 · 0 评论 -
阿里巴巴难度系数五颗星的试题,小白竟然说很简单
牛客网上有道阿里巴巴的面试题,网站显示该题难度系数五颗星代码如下:public class Base{ private String baseName = "base"; public Base(){ callName(); } public void callName(){ System. out. println(baseName); } static class Sub extends Base{原创 2020-09-19 16:09:20 · 447 阅读 · 0 评论 -
面试官问你HashMap为什么线程不安全,体现在哪?举个例子看看?
看过我HashMap系列教程的人都应该对HashMap的原理都有了比较深的理解深入源码分析HashMap到底是怎样将元素put进去的HashMap扩容后,元素是如何重新分布的”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“java的hashmap,如果确定只装载100个元素,new HashMap(?)多少是最佳的,why?读HashMap源码之tableSizeFor大家都知道HashMap是线程不安全的,可是为什么是不安全的呢?其实我们看一下源码就知道final V原创 2020-09-14 15:33:47 · 1356 阅读 · 1 评论 -
List<? extends T>和List<? super T>之间的区别
定义几个基础类// 动物类,一个吃方法public static class Animal { public void eat() { System.out.println("Animal eat"); } }// 鸟继承自动物,一个飞方法public static class Birds extends Animal { public void fly() { System.out.prin原创 2020-09-12 16:04:43 · 4889 阅读 · 4 评论 -
HashMap扩容后,元素是如何重新分布的
上文回顾在上文深入源码分析HashMap到底是怎样将元素put进去的我们着重分析了无参构造函数是如何创建map对象和HashMap是如何将第一个元素put进table的。此篇重点这篇我们将逐行代码分析1、有参构造函数是如何创建map对象的2、当元素增多导致扩容之后,元素是如何重新分布的同样,为了方便读者复盘,我截取源码是尽量将行号带上。jdk版本还是1.8结构图再重复一遍,HashMap的底层数据结构为数组+链表+红黑树的结构,放一个HashMap的结构示意图,有个大致印象。解剖思路原创 2020-09-10 11:39:08 · 6727 阅读 · 8 评论 -
深入源码分析HashMap到底是怎样将元素put进去的
说明此次深入源码解剖是为了搞明白几个问题1、HashMap是如何初始化的2、HashMap的扩容机制是怎样的3、元素是put进HashMap的,具体位置在哪(重难点)4、扩容后,元素是如何重新分布的(重难点)注:为了方便读者复盘,我截取源码时会将源码行号也带上。jdk版本:1.8在深入源码之前,应该先有个大致的了解,在JDK8里面,HashMap的底层数据结构已经变为数组+链表+红黑树的结构HashMap结构示意图数组就是源码中的table链表就是内部类Node红黑树就是内部类原创 2020-09-09 12:00:18 · 1456 阅读 · 4 评论 -
HashMap的resize()方法注释
/** * Initializes or doubles table size. If null, allocates in * accord with initial capacity target held in field threshold. * Otherwise, because we are using power-of-two expansion, the * elements from each bin must either stay at s.原创 2020-09-04 16:46:15 · 266 阅读 · 0 评论 -
ShiroConfig完整配置案例
package cn.com.suntree.treetask.config;import cn.com.suntree.common.ding.model.DingUserDo;import cn.com.suntree.common.entity.SysUser;import cn.com.suntree.common.entity.returnvo.PowerVo;import cn.com.suntree.common.entity.returnvo.RoleVo;import cn.原创 2020-09-04 09:33:55 · 1320 阅读 · 0 评论 -
openJDK各个版本的源码下载,方便查看native修饰的方法
openJDK的代码在github上也有,但下载速度堪忧,提供另一个下载方案地址:http://hg.openjdk.java.net/找到相应的版本以jdk8u为例,点击再选择细分版本,比如选择jdk8u-dev的jdk直接点zip下载就好了...原创 2020-09-02 18:31:00 · 964 阅读 · 0 评论 -
StringBuffer.append(str)之OutOfMemoryError打破砂锅问到底
众所周知StringBuffer是安全的,而StringBuilder是不安全的,他们都有append方法,但具体实现细节你了解过吗?为什么有时候用着用着就OutOfMemoryError,在哪报的以StringBuffer.append(str)为例上图可见,线程安全是因为synchronized,正真的实现调用的是父类犯法super.append(str)父类核心方法ensureCapacityInternal确保容量足够,是怎么确保的呢?ensureCapacityInternal(in原创 2020-09-02 10:55:26 · 1571 阅读 · 0 评论 -
如果对象中的String类型字段值为字符串"" ,则转为null
如果对象中的String类型字段值为字符串"" ,则转为null/** * 如果对象中的String类型字段值为字符串"" ,则转为null * * @param obj */ public static Object blankSpaceToNull(Object obj) { Class cls = obj.getClass()...原创 2020-04-07 17:14:31 · 747 阅读 · 0 评论 -
java运用CPU占用过高排查过程
java运用CPU占用过高排查过程1、top命令查询占用最大内存进程看看具体服务名称ps -ef | grep PID收集证据jstack -l PID>> logName.log查看具体线程情况top -Hp PID上图可知8843用的最多内存具体线程号printf "%x\n" PID查看相关日志 grep TID -A20 logNam...原创 2020-01-02 18:43:29 · 300 阅读 · 0 评论 -
-bash: jstack: command not found
-bash: jstack: command not found因为这是java的工具,请切换到java安装的bin目录下,即可原创 2020-01-02 18:18:02 · 6728 阅读 · 0 评论 -
Integer == 与 eques的坑以及避免NEP
先看一段代码 public static void main(String[] args) { Integer a = 100, b = 100, c = 600, d = 600; System.out.println(a == b); System.out.println(c == d); }结果是查看源码得知,以上四个变量都...原创 2019-12-25 15:56:56 · 666 阅读 · 0 评论 -
”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“
构造10000/** * Constructs an empty <tt>HashMap</tt> with the specified initial * capacity and the default load factor (0.75). * * @param initialCapacity the initial cap...原创 2019-11-04 17:59:48 · 1677 阅读 · 0 评论