Java基础
文章平均质量分 73
Java基础
文晓武
专注搜索推荐问答推荐工程领域,涉及到的技术有:Java、ElasticSearch、SpringBoot、SpringCloud、Dubbo、Linux、Docker、Sql、Kafka、RabbitMQ、RocketMQ、MyBatis、XXl-Job、Zookeeper、Nginx、Redis、Tomcat、Git、SVN、Maven、K8S等,每周不定期更新精华文章!
展开
-
Java关键字之native详解
native 用来修饰方法,用 native 声明的方法表示告知 JVM 调用,该方法在外部定义,我们可以用任何语言去实现它。简单地讲,一个native Method就是一个 Java 调用非 Java 代码的接口。转载 2022-11-14 11:30:45 · 3592 阅读 · 1 评论 -
Java反射详解:入门+使用+原理+应用场景
反射非常强大和有用,现在市面上绝大部分框架(spring、mybatis、rocketmq等等)中都有反射的影子,反射机制在框架设计中占有举足轻重的作用。所以,在你Java进阶的道路上,你需要掌握好反射。怎么才能学好反射,我们需要弄懂以下几个问题:下面我就针对以上的疑问,一一来讲解。反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,这转载 2022-06-09 18:54:55 · 657 阅读 · 0 评论 -
线程池基本概念、工作原理、相关参数以及综合案例详细介绍
目录1. 什么是线程池2. 为什么使用线程池3. 使用线程池有哪些优势4. 线程池应用场景介绍5. Java内置线程池原理剖析ThreadPoolExecutor部分源码ThreadPoolExecutor参数详解线程池工作流程总结示意图6. 自定义线程池-参数设计分析4个参数的设计:7. 自定义线程池-实现步骤MyTaskMyWorkerMyThreadPoolMyTest8. Java内置线程池-ExecutorService介绍Jav转载 2022-03-16 22:48:57 · 270 阅读 · 0 评论 -
如何写好 Java 业务代码?这也是有很多规范的
为什么要写好业务代码? api如何拒绝烟囱式开发 业务代码如何拒绝All in one? 加分项的规范 为什么要写好业务代码?直接分享一段痛苦的项目维护经历吧,看大家有没有类似的经历。当时,我接手了一个维护项目,刚上班就接到新增一个显示字段的任务。我以为这应该是一个分分钟就能够搞定的小需求,没有想到这就开始了我的痛苦之旅。我梳理了关联的api后,发现每个api都是从controller控制层-》service-》服务层-dao数据层,甚至每个api都对应一个sql查..转载 2022-02-23 18:14:23 · 148 阅读 · 0 评论 -
toString()、String.valueOf、(String)强制类型转换的区别
对于字符串类型的转换,你可能见到过这几种写法,它们之间有什么区别呢?首先,Java的八种类型: 基本数据类型分别是:int、short、float、double、long、boolean、byte、char; 它们的封装类分别是:Integer、Short、Float、Double、Long、Boolean、Byte、Character。 一、代码实例1.基本类型(1)基本类型没有toString() 方法(2)String.valueOf()方法转String转载 2022-02-22 19:25:37 · 154 阅读 · 0 评论 -
用Java十多年了,我也不敢说“精通”
我从毕业做程序员就开始用 Java,到现在已经工作快 20 年了。减去我做手游用 C++、Lua 的几年,再减去后来转管理写代码少的时间,我真正写 Java 代码的时间至少也在 10 年以上。如果你问我“Java 已经精通了吗?”,说实话,还是有点心虚。Java 博大精深,那么多知识点,肯定有我不懂的。另外,每个人对“精通”都有自己的理解,有人觉得是精于使用,有人觉得是精于底层原理,也有人觉得是精于框架。但是,毕竟用 Java 十多年了,我可以说说我自己对“精通 Java”的理解。Java转载 2022-02-22 19:23:02 · 199 阅读 · 0 评论 -
Java集合经典26问
常见的集合有哪些?Java集合类主要由两个接口Collection和Map派生出来的,Collection有三个子接口:List、Set、Queue。Java集合框架图如下:List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合。Map代表的是存储key-value对的集合,可根据元素的key来访问value。集合体系中常用的实现类有ArrayList、LinkedList、HashSet、TreeSet、H转载 2022-02-22 17:52:28 · 159 阅读 · 0 评论 -
为什么 Java 中“1000==1000”为false,而”100==100“为true?
这是一个挺有意思的讨论话题。如果你运行下面的代码Integer a = 1000, b = 1000; System.out.println(a == b);//1 Integer c = 100, d = 100; System.out.println(c == d);//2你会得到falsetrue基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。因此,转载 2022-02-22 17:20:55 · 52 阅读 · 0 评论 -
14 个写 Java 的习惯
1. 定义配置文件信息有时候我们为了统一管理会把一些变量放到 yml 配置文件中例如用 @ConfigurationProperties 代替 @Value使用方法定义对应字段的实体@Data// 指定前缀@ConfigurationProperties(prefix ="developer")@Componentpublic class DeveloperProperty {privateStringname;privateStringwe...转载 2022-02-22 17:07:55 · 130 阅读 · 0 评论 -
commons.lang3 isEmpty 和 isBlank 的用法区别
也许你两个都不知道,也许你除了isEmpty/isNotEmpty/isNotBlank/isBlank外,并不知道还有isAnyEmpty/isNoneEmpty/isAnyBlank/isNoneBlank的存在, come on ,让我们一起来探索org.apache.commons.lang3.StringUtils;这个工具类.isEmpty系列StringUtils.isEmpty()是否为空. 可以看到 " " 空格是会绕过这种空判断,因为是一个空格,并不是严格的空值,会导致.转载 2022-02-22 09:36:41 · 417 阅读 · 0 评论 -
9种常见的for循环优化方案
前言我们都经常使用一些循环耗时计算的操作,特别是for循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当将大大提高效率,下面总结几条for循环的常见优化方式。首先,我们初始化一个集合 list,如下:List<String>list=newArrayList<String>();方法一:最常规的不加思考的写法for(inti=0;i<list.size();i++){System.out.p...转载 2022-02-15 17:45:03 · 3980 阅读 · 0 评论 -
List的remove()方法陷阱以及性能优化
Java List在进行remove()方法时通常容易踩坑,主要有以下几点循环时:问题在于,删除某个元素后,因为删除元素后,后面的元素都往前移动了一位,而你的索引+1,所以实际访问的元素相对于删除的元素中间间隔了一位。几种常见方法1.使用for循环不进行额外处理时(错误)//错误的方法for(inti=0;i<list.size();i++){if(list.get(i)%2==0){list.remove(i);}}2.使用foreach循环(错误...原创 2022-02-15 17:37:31 · 2170 阅读 · 0 评论 -
String、StringBuffer、StringBuilder深度分析
1.概述String、Stringbuffer、Stringbuiler一直是 java 面试中较为热点的问题,一般作为一个开场问题。那么这三者之间有什么区别,如何根据场景来选择使用,本文将基于三者的源码、性能、以及面试常问点来进行分析。String、StringBuffer、StringBuiler 底层源码String 类首先看一下 String 类的类图,它实现了 CharSequence 接口,也就是说 String 是 CharSequence 类型.它的底层是被 fin.原创 2022-02-15 15:57:08 · 134 阅读 · 0 评论 -
String s = new String(“111“)会创建几个对象?
String不可变吗?publicclassApp{publicstaticvoidmain(String[]args){Stringa="111";a="222";System.out.println(a);}}有的人会认为上面这段代码应该输出:111这样才和上面的不变性吻合。哈哈哈,但是并不是这样滴。222这不对呀,不是不变吗?怎么变了呢?其实在JVM的运行中,会单独...转载 2022-02-15 15:48:42 · 173 阅读 · 0 评论 -
String底层原理深度分析
String字符串是我们日常工作中常用的一个类,在面试中也是高频考点,这里Hydra精心总结了一波常见但也有点烧脑的String面试题,一共5道题,难度从简到难,来一起来看看你能做对几道吧。本文基于jdk8版本中的String进行讨论,文章例子中的代码运行结果基于Java 1.8.0_261-b12第1题,奇怪的 nullnull下面这段代码最终会打印什么?publicclassTest1{privatestaticStrings1;privatest...转载 2022-02-15 15:39:13 · 2186 阅读 · 0 评论 -
Java 创建对象的 6 种方式,总有一种适合你
背景又到一年一度的情人节了,祝各位程序员有情人终成眷属!今天公众号本来有个广告推广的,被临时鸽了,唉。。这个情人节有点伤,还好对象没鸽。。情人节写点什么好呢?!有座的各位肯定还有不少单身 dog 吧?没关系,栈长本文教你创建对象的 6 种方式,从低端到高端,各种创建方式,总有一个适合你,没有对象的自己生成一个吧!2022,一定脱单,再见单身狗!创建对象的 6 种方式假设有个女朋友类:@Data@NoArgsConstructor@AllArgsConstruct转载 2022-02-14 20:01:31 · 6520 阅读 · 1 评论 -
Java8 之后对新开发者非常友好的特性盘点
在这篇文章中,我将描述自 Java8 依赖对开发者来说最重要也最友好的特性,之所以选择 Java8 ,那是因为它依然是目前使用最多的版本。具体可见这个调查报告:Switch 表达式 (JDK 12)使用 switch 表达式,你可以定义多个 case 条件,并使用箭头->符号返回值,这个特性在 JDK12 之后启用,它使得 switch 表达式更容易理解了。publicStringnewMultiSwitch(intday){returnswitch(da...转载 2022-02-12 19:46:38 · 137 阅读 · 0 评论 -
Java中的增强for循环 foreach和for的区别
foreach 是 Java 中的一种语法糖,几乎每一种语言都有一些这样的语法糖来方便程序员进行开发,编译期间以特定的字节码或特定的方式来对这些语法进行处理。能够提高性能,并减少代码出错的几率。在 Java 中还有比如 泛型、自动拆箱、自动装箱、内部类、枚举等等。foreach 是用来对数组或者集合进行遍历的语法。具体语法如下:for(元素类型 ele : 数组名/Iterable 实例){ }下面我们用 foreach 来对数组和一个集合进行遍历:int [] array = {转载 2022-02-12 14:02:14 · 1389 阅读 · 1 评论 -
Java8 Function 用法简介
1、Function<Numbers, Integer> test ,相当于一个待实现的接口,告诉你入参是 Numbers 类型 (上例子中是一个自定义的实体类),出参是Integer 类型。然后业务逻辑是怎样,可以自己实现。2、Function<Numbers, Integer> test1 = i -> i.getN1() - i.getN2(); 实现了Functoin 的接口,业务逻辑是 Numbers 类型的一个实例,它两个字段相减。3、calculate..原创 2022-01-26 21:02:47 · 12204 阅读 · 1 评论 -
妙用Stream优化老代码,立马清爽了
Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读# 放大招,流如何简化代码如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字 菜肴:Dish.javapublic class Dish { private String name; private boolean veg转载 2022-01-26 20:42:39 · 176 阅读 · 0 评论 -
对象不再使用时,是否一定要赋值为 null ?
# 前言许多Java开发者都曾听说过“不使用的对象应手动赋值为null“这句话,而且好多开发者一直信奉着这句话;问其原因,大都是回答“有利于GC更早回收内存,减少内存占用”,但再往深入问就回答不出来了。鉴于网上有太多关于此问题的误导,本文将通过实例,深入JVM剖析“对象不再使用时赋值为null”这一操作存在的意义,供君参考。本文尽量不使用专业术语,但仍需要你对JVM有一些概念。# 示例代码我们来看看一段非常简单的代码:public static void main(String[] a转载 2022-01-26 19:27:12 · 165 阅读 · 0 评论 -
boolean属性不建议设置为is开头,POJO中使用包装数据类型
# 背景平时工作中大家经常使用到boolean以及Boolean类型的数据,前者是基本数据类型,后者是包装类,为什么不推荐使用isXXX来命名呢?到底是用基本类型的数据好呢还是用包装类好呢?# 例子1.其他非boolean类型private String isHot; public String getIsHot() { return isHot; }2.boolean类型private boolean isHot; public bool转载 2022-01-26 18:13:39 · 489 阅读 · 0 评论 -
Java依赖冲突高效解决之道
一 概述由于阿里妈妈联盟团队负责业务的特殊性,系统有庞大的对外依赖,依赖集团六七十个团队服务及N多工具组件,通过此文和大家分享一下我们积累的一些复杂依赖有效治理的经验,除了简单技术技巧的总结外,也会探讨一些关于这方面架构的思考,希望此文能系统彻底的解决java依赖冲突对大家的困扰。二 依赖冲突产生的本质原因要解决依赖冲突,首先要理解一下java依赖冲突产生的本质原因。以上图为例,目前阿里大部分java工程都是maven工程,此类工程从开发到上线要经历以下两个重要步骤:1 编译打...转载 2022-01-26 17:52:17 · 424 阅读 · 0 评论 -
Java 泛型通配符详解
| 前言Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。| 泛型带来的好处在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常转载 2022-01-26 16:22:56 · 496 阅读 · 0 评论 -
Java 如何避免反射导致的性能问题?
反射真的存在性能问题吗? 反射到底慢在哪? 如果避免反射导致的性能问题? 后记 有朋友在我前两天写的一篇文章深入浅出反射底下留言,问反射具体是怎么影响性能的?这引起了我的反思。是啊,在阐述某个观点时确实有必要说明原因,并且证明这个观点是对的,虽然反射影响性能人尽皆知,我曾经也真的研究过反射是否存在性能问题,但并没有在写文章的时候详细说明。这让我想到网上很多信息只会告诉你结论,并不会说明原因,导致很多学到的东西都是死记硬背,而不是真正掌握,别人一问或者自己亲身遇到同样的问..转载 2022-01-25 15:17:15 · 394 阅读 · 0 评论 -
Java 枚举与普通类的区别
An enum type is a special data type that enables for a variable to be a set of predefined constants.相同点枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器。不同点 枚举的构造方法私有,构造器只能使用 private 访问修饰符,所以无法从外部调用构造器,构造器只在构造枚举值时被调用。也就是说枚举类不给外界实例化的机会,只能它自己实例化,而一个枚举类的所有实例就只有.转载 2022-01-24 10:19:15 · 1507 阅读 · 0 评论 -
Calendar获取当前年份、月份、日期
package com.wenxiaowu.date;import org.junit.Test;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;/** * Calendar获取当前年份、月份、日期 */public class CalendarTest { @Test public void test() { Calendar cale.原创 2022-01-18 20:33:55 · 9116 阅读 · 0 评论 -
Java如何对一个对象进行深拷贝?
在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。而深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改变。如下图描述:了解了浅拷贝和深拷贝的区别之后,本篇博客将教大家几种深拷贝的方法。方法一 构造函数我们可以通过在调用构造函数进行深拷贝,形参如果是基本类型和字符串则直接赋值,如果是对象则重新new一个。方法二 重载clone()方法Ob..原创 2022-01-18 20:28:47 · 5397 阅读 · 0 评论 -
java模板字符串解析(占位符解析)
package com.wenxiaowu.string;import org.junit.Test;import java.util.HashMap;import java.util.Map;/** * 配置文件或模板中的占位符替换工具类 */public class PlaceholderTest { @Test public void test() { String aa= "我们都是好孩子,${name1}说是嘛: 我觉得${name2}是大聪.原创 2022-01-18 19:56:57 · 2384 阅读 · 1 评论 -
理解serialVersionUID是什么?有什么用?如何生成?
1、什么是serialVersionUID?serialVersionUID用作Serializable类中的版本控件。如果您没有显式声明serialVersionUID,JVM将根据您的Serializable类的各个方面自动为您执行此操作,如[Java(TM)对象序列化规范中所述](http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html)。2、SerialVersionUID示例3、相同的serialVe原创 2022-01-18 19:53:13 · 33934 阅读 · 0 评论 -
Arrays.asList的防坑指南
package com.wenxiaowu.list;import org.junit.Test;import java.util.Arrays;import java.util.List;/** * Arrays.asList的防坑指南 * 1、返回的并不是java.util下的ArrayList,返回的是Arrays内部自己继承AbstractList的一个内部类ArrayList * 2、传入的数组一定要是包装类型,这样才能正确的转换为list * 3、对数组的修改也会影响li.原创 2022-01-18 19:44:45 · 412 阅读 · 0 评论 -
CheckException和RuntimeException区别
package com.wenxiaowu.exception;import org.junit.Test;import java.net.MalformedURLException;import java.net.URL;/** * 区分检查时异常和运行时异常 * 1、checked exception用来指示一种调用方能够直接处理的异常情况 * 2、runtime exception则用来指示一种调用方本身无法处理或恢复的程序错误 */public class CheckRun.原创 2022-01-18 19:36:52 · 651 阅读 · 0 评论