java基础
文章平均质量分 81
java基础
码上得天下
这个作者很懒,什么都没留下…
展开
-
Java8中的方法引用与构造器引用
本节我总结结合Lambda表达式使用的方法引用,本质上还是Lambda表达式!当要传递给 Lambda 体的操作,已经有实现的方法了,可以使用方法引用!方法引用可以看做是 Lambda 表达式深层次的表达。换句话说,方法引用就是 Lambda 表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是 Lambda 表达式的一个语法糖。要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!转载 2024-02-28 19:01:43 · 24 阅读 · 0 评论 -
java8 多重注解
在Java中,注解(Annotation)是一种用于为代码元素(类、方法、字段等)提供元数据的方式。注解可以帮助我们在不改变源代码的情况下,向代码添加一些额外的信息或行为。在Java 8之前,我们只能在一个元素上应用一个注解。但是,在Java 8中,我们可以在一个元素上应用多个相同类型的注解,这就是多重注解的概念。多重注解的引入为我们提供了更大的灵活性。我们可以将多个注解应用于同一个元素,并且每个注解都可以提供独特的元数据。转载 2024-02-28 18:56:26 · 228 阅读 · 0 评论 -
java程序cpu占用过高的原因和解决方法
Java程序的 CPU 占用过高意味着该程序在运行过程中消耗了大量的中央处理器(CPU)资源。这可能会导致系统性能下降、响应变慢以及其他正在运行的应用程序受到影响。CPU 占用过高通常是一个需要关注和解决的问题,因为它可能影响整个系统的稳定性和性能。转载 2024-02-23 11:09:59 · 8474 阅读 · 0 评论 -
java中内存泄露8种情况的总结
当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄露。简单而言,长生命周期的对象持有短生命周期对象的引用,尽管短生命周期的对象不再使用,但是因为长生命周期对象持有它的引用而导致不能被回收。转载 2024-02-23 11:00:29 · 204 阅读 · 0 评论 -
Java内部类持有外部类导致内存泄露的原因与解决方案详解
本文介绍Java内部类持有外部类导致内存泄露的原因以及其解决方案。非静态内部类会持有外部类,如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类(即使外部类已经没有其他地方在使用了)。1.不要让其他的地方持有这个非静态内部类的引用,直接在这个非静态内部类执行业务。2.将非静态内部类改为静态内部类。内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到static类型的引用。转载 2024-02-23 10:41:34 · 94 阅读 · 0 评论 -
java模块热插拔/热加载原理
Java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被Java虚拟机直接使用的Java类型,这就是虚拟机的类加载机制.JVM中用来完成上述功能的具体实现就是类加载器.类加载器读取.class字节码文件将其转换成java.lang.Class类的一个实例.每个实例用来表示一个java类.通过该实例的newInstance()方法可以创建出一个该类的对象.对于Java应用程序来说,热部署就是在运行时更新Java类文件。转载 2024-02-20 12:35:09 · 226 阅读 · 0 评论 -
HashMap为什么要先插入再扩容JDK1.8
我们知道 HashMap 的底层是由数组,链表,红黑树组成的,在 HashMap 做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算 hash 值,因为长度扩大以后,hash值也随之改变。如果是简单的 Node 对象,只需要重新计算下标放进去就可以了,如果是链表和红黑树,那么操作就会比较复杂,下面我们就来看下,JDK1.8 下的 HashMap 在扩容时对链表和红黑树做了哪些优化?转载 2023-10-19 21:08:10 · 616 阅读 · 0 评论 -
一篇文章搞明白Java中的SPI机制
SPI机制是Java的一种服务发现机制,为了方便应用扩展。那什么是服务发现机制?简单来说,就是你定义了一个接口,但是不提供实现,接口实现由其他系统应用实现。你只需要提供一种可以找到其他系统提供的接口实现类的能力或者说机制。这就是SPI机制( Service Provider Interface)SPI机制在Java中有很广泛的运用,比如:eclipse和idea里的插件使用就是通过SPI机制实现的。转载 2023-10-18 11:21:48 · 139 阅读 · 0 评论 -
switch 是如何匹配枚举和字符串的?
对应的 lookupswitch 表结构如下:会根据 case 中的数据进行排序,然后然后为每一个数据指定一个从 0 到 n 的索引,相应的索引对应指定的具体数据,进一步指向相关的执行代码。当 case 的值为 1,2,5 是会将 索引为 0,1,4 的 value 指向执行代码,当 n 的值为 3,4 时,对应的索引就是 2,3。执行流程是:传递一个枚举对象,获取相关的序号,根据序号找到值,根据值减去下界就是tableswitch 表格中的索引,然后再根据索引执行相关的代码。) 的方式进行判断的,转载 2023-10-10 11:18:19 · 407 阅读 · 0 评论 -
jdk1.7 hashmap的死循环是如何产生的
原因笼统解释:多线程下链表的元素关系被改变导致死循环。一、hashmap的数据结构先一起看看jdk1.7 hashmap的数据结构数组 + 链表hashmap会给每个元素的key生成一个hash值,然后根据这个hash值计算一个在数组中的位置i。i不同的元素放在数组的不同位置,i相同的元素放在链表上,最新的数据放在链表的头部。往hashmap中保存元素会调用put方法,获取元素会调用get方法。接下来,我们重点看看put方法。二、put方法public V put(K k.转载 2022-01-10 23:10:06 · 352 阅读 · 0 评论 -
TCP 和 UDP 的区别
前言前端的面试中经常问的 TCP 和UDP的区别,网上也有好多内容,比如TCP 和 UDP 的区别TCP 和 UDP 的区别TCP 是面向连接的,UDP 是面向无连接的(连接类似打电话有接通和挂断,无连接类似写信有目标地址即可) UDP程序结构较简单 TCP 是面向字节流的,UDP 是基于数据报的 TCP 保证数据正确性,UDP 可能丢包 TCP 保证数据顺序,UDP 不保证之前也因为面试的原因了解过一下,但是面试官又问了为什么 TCP 是可靠传输,一下就露馅了,说不出来了,然..转载 2022-01-07 21:42:58 · 582 阅读 · 0 评论 -
BigDecimal为什么能做到高精度计算?
BigDecimal的底层数据结构使什么?它是怎么保证精度的?这曾经是一道阿里巴巴的面试题,由于在工作中使用最多的是BigDecimal的加、减、乘、除的的方法,还真没想过它的实现原理(完全是拿来主义惹的祸),乍这么一问还真有点懵。BigDecimal保证精度的解决思路其实极其的简单朴素,还是用一句话来解释:十进制整数在转化成二进制数时不会有精度问题,那么把十进制小数扩大N倍让它在整数的维度上进行计算,并保留相应的精度信息。为什么要使用BigDecimal?我想只要是从事过JAVA金融产品研发.转载 2022-01-07 20:20:06 · 1180 阅读 · 0 评论 -
ping,telnet,tracert分别用的是什么协议?
Telnet使用的是tcp协议使用示例:telnet 192.168.1.20 80ping命令使用的是icmp协议示例:ping www.sina.com.cn或ping 192.168.1.10tracert命令使用的是icmp协议示例:tracert 192.168.1.10转载 2022-01-07 18:44:05 · 5190 阅读 · 0 评论 -
如何减少上下文切换?
什么是上下文切换?上下文换指的是操作系统的核心,在CPU上对进程或者线程进行切换的意思。上下文切换过程中的信息被保存在进程控制块中的。理解上下文切换首先,大家不管在单核或多核处理器都支持多线程执行代码,然后CPU通过给每个线程分配CPU时间片来实现这个过程的。什么是时间片,时间片是CPU分配给各个线程的时间,时间片非常短。所以我们是平还是感觉不到,CPU不停切换线程执行,时间片一般就是几十毫秒,就那么一瞬间。如何减少上下文切换减少“上下文切换”常用有这种方法:无锁并发编程、CAS转载 2022-01-07 18:36:43 · 669 阅读 · 0 评论 -
final关键字的底层原理是什么?
概念final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。一、final变量 final成员变量表示常量,只能被赋值一次,赋值后值不再改变(final要求地址值不能改变) 当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象转载 2022-01-07 17:52:31 · 2073 阅读 · 2 评论 -
List中remove()方法的陷阱
Java的List在删除元素时,一般会用list.remove(o)/remove(i)方法。在使用时,容易触碰陷阱,得到意想不到的结果。总结以往经验,记录下来与大家分享。首先初始化List,代码如下:packagecom.cicc.am.test;importjava.util.ArrayList;importjava.util.List;publicclassListTest{publicstaticvoidmain(String[]args){...转载 2021-10-09 10:00:14 · 102 阅读 · 0 评论 -
静态变量能被序列化吗?
先解释下什么是序列化我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据保存到磁盘或者传输网络,磁盘或者网络接收者可以在对象的属类的模板上来反序列化类的对象,达到对象持久化的目的。更多序列化请参考:《关于Java序列化你应该知道的一切》这篇文章。什么是 transient?简单来说就是,被 transient 修饰的变量不能被序列化。具体来看下面的示例转载 2021-08-30 19:15:44 · 3810 阅读 · 1 评论 -
ConcurrentHashMap为什么key和value不能为null
HashMap源码:612行:hash()方法计算了key的值339行:当key为null时,计算出的hash值为0,value放置在第0个桶上ConcurrentHashMap源码:1006行:没有像HashMap一样先计算hash1011行:先进行了判断key和value是否为null为什么ConcurrentHashMap需要加空值校验呢?因为存在二义性问题且ConcurrentHashMap没法解决二义性问题测试代码代码分析22行:获取te...转载 2021-08-30 17:50:57 · 1394 阅读 · 0 评论 -
关于Java序列化你应该知道的一切
什么是序列化我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据保存到磁盘或者传输网络,磁盘或者网络接收者可以在对象的属类的模板上来反序列化类的对象,达到对象持久化的目的。怎么序列化一个对象?要序列化一个对象,这个对象所在类就必须实现Java序列化的接口:java.io.Serializable。1、类添加序列化接口 import j...转载 2021-08-30 15:48:49 · 148 阅读 · 0 评论 -
switch多值匹配
我们都知道 switch 用来走流程分支,大多情况下用来匹配单个值,如下面的例子所示:/***@from 微信公众号:Java技术栈*@author栈长*/privatestaticvoidtest(intvalue){switch(value){case1:System.out.println("1");break;case2:System...转载 2021-08-30 15:37:04 · 9126 阅读 · 0 评论 -
为什么switch不支持long
switch 支持的类型在 Java 语言规范里中,有说明 switch 支持的类型有:char、byte、short、int、Character、Byte、Short、Integer、String、enum。为什么不支持 long ?为什么只支持上面几种?int、String 都可以,为什么不支持 long ?原因就是 switch 对应的 JVM 字节码 lookupswitch、tableswitch 指令只支持 int 类型。下面是 JVM 规范中的说明(https://docs转载 2021-08-23 15:23:51 · 2346 阅读 · 0 评论 -
Java实用工具库总结
1. 比较两个对象是否相等当我们用equals比较两个对象是否相等的时候,还需要对左边的对象进行判空,不然可能会报空指针异常,我们可以用java.util包下Objects封装好的比较是否相等的方法Objects.equals(strA, strB); 源码是这样的public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b));转载 2021-08-23 15:20:03 · 82 阅读 · 0 评论 -
20 个实例玩转 Java 8 Stream
先贴上几个案例,水平高超的同学可以挑战一下:从员工集合中筛选出salary大于8000的员工,并放置到新的集合里。 统计员工的最高薪资、平均薪资、薪资之和。 将员工按薪资从高到低排序,同样薪资者年龄小者在前。 将员工按性别分类,将员工按性别和地区分类,将员工按薪资是否高于8000分为两部分。用传统的迭代处理也不是很难,但代码就显得冗余了,跟Stream相比高下立判。1 Stream概述Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda...转载 2021-08-23 10:23:55 · 132 阅读 · 0 评论 -
正则表达式语法
前言最近公司的一个项目,大量用到了正则来处理文本,以前对正则使用仅限于小打小闹,用的也是一知半解,经过本次的深入使用,发现正则表达式真的是每一位开发者都需要具备的一个基础技能,处理文本的功能异常强大。今天我们就来系统的学习一下它。关于正则表达式正则表达式是一种模式匹配引擎,也称为Nondeterministic Finite Automaton(NFA)非确定性有限自动机,为什么叫非确定性呢?因为对于文本搜索可能有多种情况,而正则表达式会尽量穷举所有的可能来找到我们匹配的数据,这种方式也称为回溯转载 2021-08-20 12:00:34 · 261 阅读 · 0 评论 -
理解Java8里面CompletableFuture异步编程
原文:理解Java8里面CompletableFuture异步编程Java8主要的语言增强的能力有:lambda表达式 stream式操作 CompletableFuture其中第三个特性,就是今天我们想要聊的话题,正是因为CompletableFuture的出现,才使得使用Java进行异步编程提供了可能。什么是CompletableFuture?CompletableFuture在Java里面被用于异步编程,异步通常意味着非阻塞,可以使得我们的任务单独运行在与主线程分离的其他线程中,转载 2021-08-18 16:58:29 · 223 阅读 · 0 评论 -
利用反射实现——记录用户修改的字段及内容
需求:用户修改某一实体后,系统记录下用户修改了哪些内容原方法:采取笨方法,取数据库中的老数据与新数据进行一一遍历比较缺点:费时,代码量也较大现方法:利用自定义注解以及反射相结合的方法,自动获取实体的属性以及注释,并比较新旧数据,返回修改内容优点:缩减了代码量,尤其是属性很多的实体自定义注解类/** * 实体bean类字段描述 自定义注解 * @author liu huangming * @date 2020-03-03 15:20:03 */@Documented转载 2021-08-17 17:23:09 · 396 阅读 · 1 评论 -
JDK/Dubbo/Spring 三种 SPI 机制,谁更好?
SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。本文主要是特性 & 用法介绍,不涉及源码解析(源码都很简单,相信你一定一看就懂)SPI 有什么用?举个栗子,现在我们设计了一款全新的日志框架:super-logger。默认以XML文件作为我们这.转载 2021-05-18 09:03:16 · 96 阅读 · 0 评论 -
带标签的break和continue
一:语法细节1. Java中的命名规则:package:统一使用小写字母class:首字母大写,使用驼峰标识method:首字母小写,使用驼峰标识field:首字母小写,使用驼峰标识static field:统一使用大写字母,并用下划线分割单词2. import和import staticimport com.xxx:常规导入某个包下的类import static com.xxx:会导入某个包下的...原创 2021-05-17 11:23:48 · 443 阅读 · 0 评论 -
ThreadLocalRandom替换Random
前言最近在写一些业务代码时遇到一个需要产生随机数的场景,这时自然想到 jdk 包里的Random类。但出于对性能的极致追求,就考虑使用ThreadLocalRandom类进行优化,在查看 ThreadLocalRandom 实现的过程中,又追了下Unsafe有部分代码,整个流程下来,学到了不少东西,也通过搜索和提问解决了很多疑惑,于是总结成本文。Random 的性能问题使用 Random 类时,为了避免重复创建的开销,我们一般将实例化好的 Random 对象设置为我们所使用服务对象...转载 2021-05-14 17:35:11 · 206 阅读 · 0 评论 -
Java泛型-类型擦除
引子:List<String> l1 = new ArrayList<String>();List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass() == l2.getClass());输出:true,这段代码涉及到了泛型,而输出的结果缘由是类型擦除。泛型是什么?泛型的英文是 generics,generic 的意思是通用,而翻译成中文转载 2021-05-07 15:58:51 · 180 阅读 · 0 评论 -
为什么HashMap的长度是2的整数次幂?
一:加快哈希计算;二:减少哈希冲突哈希表索引位置的计算hash(KEY) % 数组长度;当数组长度为2的n次方;这个公式等价于hash(KEY) & (length - 1);计算机底层就是0和1两个位的操作,显然&的速度会比%快;为什么减少哈希冲突?看hash(KEY) & (length - 1);如果length为奇数,length - 1就为偶数,偶数最低位二进制是0;0和hash(KEY)的最低位做&操作只会是0;如果length为偶数,length - 1原创 2020-10-25 21:38:02 · 389 阅读 · 0 评论 -
ConcurrentHashMap 源码之size方法
JDK1.7实现前提:每个Segment都有一个modCount变量,每当进行一次put、remove和clean等操作(简称写操作),modCount将会 +1。只要modCount发生了变化就认为容器的大小也在发生变化。 public int size() { // Try a few times to get accurate count...原创 2020-03-19 19:36:16 · 591 阅读 · 0 评论 -
ConcurrentHashMap源码要点分析(JDK1.7)
https://blog.csdn.net/weixin_33915554/article/details/92179122基本属性: //用于分段 //允许的最大段数;用于绑定构造函数参数。必须是小于1小于24的幂。 static final int MAX_SEGMENTS = 1 << 16; // slightly conservative...原创 2020-03-18 22:52:04 · 163 阅读 · 0 评论 -
HashMap扩容产生死链分析(JDK7)
void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; for (Entry<K,V> e : table) { while(null != e) { Entry<K,V>...原创 2020-03-15 10:59:10 · 574 阅读 · 0 评论 -
HashMap 1.8 与1.7 比较
https://www.jianshu.com/p/8324a34577a0转载 2020-03-12 22:57:55 · 132 阅读 · 0 评论 -
HashMap存储位置计算
HashMap产生hash碰撞一般说法是key的hashCode值一样,其实这种说法是不严谨的,准确说底层计算下标值一样(废话),当然,key的hashCode的值一样是最明显的原因,而hashCode值不同也会导致hash冲突。HashMap为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,每个链表长度大致相同,这个实现就在把数据存到哪个链表中的算法;这个算法实际就是取模,hash...原创 2020-03-12 20:02:45 · 2701 阅读 · 1 评论 -
什么是fail-fast
转自:什么是fail-fastfail-fast在网上搜了下fail-fast的解释,很多人说fail-fast是Java中集合的一种错误检测机制,比如下面这个网友的解释:fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。其实fail-fast机制并不是Java集合特有的机制,它是一个通用的系统设计思想。看下维基百科的解释In systems design, a fail-fa转载 2021-05-06 10:08:41 · 284 阅读 · 0 评论 -
String字符串的最大长度是多少?
转自:String字符串的最大长度是多少?在学习和开发过程中,我们经常会讨论 short ,int 和 long 这些基本数据类型的取值范围,但是对于 String 类型我们好像很少注意它的“取值范围”。那么对于 String 类型,它到底有没有长度限制呢?其实 String 类型的对象,他们是有长度限制的, String 对象并不能“存储”无限长度的字符串。关于 String 的长度限制要从编译时限制和运行时限制两方面考虑。编译期限制有JVM虚拟机相关知识的同学肯定知道,下面定义的字符串常量“转载 2021-05-06 09:48:44 · 12791 阅读 · 0 评论 -
String源码浅析
转自:String源码浅析如果问你,开发过程中用的最多的类是哪个?你可能回答是HashMap,一个原因就是HashMap的使用量的确很多,还有就是HashMap的内容在面试中经常被问起。但是在开发过程中使用最多的类其实并不是HashMap类,而是“默默无闻”的String类。假如现在问你String类是怎么实现的?这个类为什么是不可变类?这个类为什么不能被继承?这些问题你都能回答么。本文就从String源代码出发,来看下String到底是怎么实现的,并详细介绍下String类的API的用法。St转载 2021-05-06 09:38:22 · 130 阅读 · 0 评论 -
静态代码块、构造代码块、构造函数以及Java类初始化顺序
转自《Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序》阅读目录构造函数 构造代码块 静态代码块 Java类初始化顺序静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行。执行顺序优先级:静态块,main(),构造块,构造方法。构造函数public HelloA(){//构造函数 }关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造函数,也就是说,不.转载 2020-10-27 15:31:02 · 174 阅读 · 1 评论