Java基础
北海宇微
生命源于感动,感动让我们有了羁绊,让我们有了不舍,让我们在生去生命那—刻可以笑看人生一一一一我来过
展开
-
每日一坑:eclipse2021 +lombok安装
先记一下笔记贴一下错误:Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @baa9ce4说一下解决.原创 2021-09-05 07:40:55 · 1284 阅读 · 6 评论 -
数据与链表,指针,集合的区别
讨论数据结构之间的区别,本质上是讨论数据结构的构造,内存分配,增删改查效率,应用场景这几个层次来考虑,针对数据和链表的区别我们大概可以做如下的归纳。数组:线性数据结构;连续内存空间,无法改变容量;存储相同类型数据;支持随机访问(查询),插入、删除较慢(时间复杂度O(n),因为要涉及遍历定位);业务开发中,适合做底层数据结构。(这点不知道你有没有和我一样在探索String,Nginx,Redis等等吧的时候,也一样疑惑或底层数据结构为什么都是数组)链表:链式数据结构;非连续内存,内存可扩充;存储相同数据类原创 2020-06-09 09:57:32 · 2336 阅读 · 0 评论 -
分布式无处不在,数据库事务弱一致性是否必然
在计算机系统中,指令是计算机运行的最小的功能单位。在一个多核计算机中,以指令为单位,涉及两条及以上指令的操作都将面临事物一致性的问题。因为两条以上指令涉及多个CPU协作,已经不满足事务一致性的原则了。深入计算机对机器指令的执行以计算机元器件转变为单位,其实每条指令执行,到元器件最终发生转变,这个过程也是被拆分为若干执行过程。如果我们对计算机运行机制不是很理解,那么我们把原子操作放大一点,比如数据库原子操作,比如分布式事务原子性,比如分布式应用原子性。其实基本上我们的任务计算机操作都是非原子性的,当我们在谈论原创 2020-06-09 09:33:40 · 1908 阅读 · 0 评论 -
java中String类为什么要设计成final
这是个很有趣的问题,String设计成final类型,不能被继承、不能被重写,简言之String是不可变的。问题在于为什么不可变呢?这主要是性能与安全性的考虑。String是JVM中使用频率非常高的数据类型,涉及很多底层操作,因此SUN公司的工程师在设计String时,很小心的把整个String设置成final禁止继承,避免被其他人继承后破坏。另外一方面String作为高频使用数据类型,SUN对String的内存分配做了很多优化,比如字符串常量池,就是基于String的不可变性来实现的。String内存原创 2020-06-08 19:08:07 · 1788 阅读 · 0 评论 -
系统CPU飙高和GC频繁,如何排查
处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出jstack和内存信息,然后重启系统,尽快保证系统的可用性。这种情况可能的原因主要有两种: 代码中某个位置读取数据量较大,导致系统转载 2020-06-06 15:36:28 · 217 阅读 · 0 评论 -
线程池的介绍
线程池的概念线程池是一种多线程使用模式,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。不同的线程池启动线程和停止线程的模式不一样,整体而言线程池会提供空闲线程执行任务。线程池的工作机制线程池模式下,接受任务的主体是线程池,线程池将任务分配给线程。 线程池负责线程的启动,停止,状态监管,任务分配。 线程池的优势 ...原创 2020-06-06 14:43:33 · 211 阅读 · 1 评论 -
ThreadLocal源码解读内存泄漏分析
早在JDK1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。但是ThreadLocal并不是一个线程,他是一个线程变量。意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。伴随整个线程生命周期存在,可以作为线程执行,对象跨层,父子线程通信,线程追踪的标记。ThreadLocal作用1、在进行对象跨层传递的时候,使用ThreadLocal可原创 2020-06-06 12:05:01 · 1736 阅读 · 0 评论 -
HashMap无序,LinkedHashMap,TreeMap的有序性
HashMap无序,LinkedHashMap会多一个链表存储元素顺序,TreeMap实现SortedMap接口可以对元素进行排序。原创 2020-06-05 11:28:50 · 207 阅读 · 0 评论 -
单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式单例模式的五种实现方式1、懒汉式,线程不安全2、懒汉式,线程安全3、饿汉式4、双检锁/双重校验锁(DCL,即 double-checked locking)双检在于1.读取共享变量状态,2创建过程加锁,防止指令重排行public class Singleton { private volatile static Singleton si...原创 2020-06-05 10:08:09 · 1625 阅读 · 0 评论 -
双亲委派是什么,怎么打破
双亲委派是JVM类加载机制,目的是确保JVM中使用类的一致性(换言之就是确保公共类都是JVM定义的类)。首先我们看一下JVM启动到代码执行需要那些工作,首先需要启动JVM环境,也就是<JAVA_HOME>lib中定义的各种环境,其次可能需要扩展额外的依赖,也就是<JAVA_HOME>libext中的各种jar包,还有就是运行程序的代码。综上JVM加载器一共包括启动类加载器(Bootstrap ClassLoader):由C++语言实现(针对HotSpot),负责将存放在<JA原创 2020-06-05 09:57:24 · 839 阅读 · 0 评论 -
Java多线程的开发中有三种特性:原子性、可见性和有序性
在java开发中高并发,多线程其实是一个问题。需要解决的也是一个问题,那就是内存共享问题。这个如果我们知道JVM的内存模型,这个问题其实很简单,也很基础。本文不谈内存模型,我们直观的进入高并发,多线程所需要面对的开发问题:原子性、可见性和有序性问题。原子性(Atomicity)原子性描述的是多线程执行的问题。原子性是指在一个操作中在cpu一个调度中是连续不可中断的,要么执行成功,要么执行失败。纵观一下几乎说有的原子性说的都是同一个理论。分布式数据库原子性,分布式事务原子性,数据库原子性...原创 2020-06-05 09:35:23 · 335 阅读 · 0 评论 -
JAVA 内存模型-内存可见性
Java Memory Model (JAVA 内存模型)描述线程之间如何通过内存(memory)来进行交互。主要有两个原则,一个是线程不能直接操作主内存,一个是每个线程只能操作工作内存。换句话说,JVM内存分为两种,主存区和工作内存区。主内存对所有线程共享,工作内存只对所属线程开放,线程之间不能直接互相访问,变量在程序中的传递依赖主存来完成。内存可见性通过对java内存模型的理解,内存的可见性,是指共享变量在主存中对线程是可见的,在工作内存中对其他线程不可见。共享变量需要通过从主内存复制到工作内存,原创 2020-06-05 08:33:06 · 166 阅读 · 0 评论 -
java快速创建List
嗯 创建方式跟JDK的版本有关,JAVA8中可以使用Arrays.asList,Java9中可以使用List.of。public static void main(String[] args) { // TODO Auto-generated method stub //1.使用Collections.addAll()方法,前提还是需要手动 new ArrayList Array...原创 2020-04-29 11:22:31 · 3612 阅读 · 0 评论 -
Java 8 使用lambda表达式和函数式接口
Java 8 在语言层面引入Lambda表达式,用以支持函数式编程风格。Lambda表达式使用五行代码转换为单个语句来解决匿名内部类的庞大性。 这个简单的水平解决方案解决了内部类提出的“垂直问题”。本文对lambda的介绍分为三个方面,语法、常规使用和综合应用三个部分。1.语法(参数类型 参数名称) ‐> { 代码语句 }:参数非必须,大括号非必须(对于返回值问题,没有大括号的时候表达式的执...原创 2020-04-29 11:12:48 · 903 阅读 · 0 评论 -
Java 中判断两个对象是否相等
嗯先铺垫一下Java中的相等问题,比较方法有equals和==,比较的方向有内容相等和对象相等。1.equals:只能比较对象,比较对象地址是否相等;可以重写equals方法,比如String重写equals方法改为内容是否相等。2.==:可以比较基础数据类型和对象,基础数据类型比较值是否相等,对象比较地址是否相等。看一个经典的问题,String的equals问题。public...原创 2020-04-28 18:21:08 · 2878 阅读 · 1 评论 -
XML解析中转义字符问题
XML中不允许出现一些特殊字符,这些字符需要使用转义字符代替.XML文件中不允许出现一些特殊字符,对这些特殊字符XML采用转义字符代替或者使用<![CDATA[ ]]>声明,<![CDATA[]]>标记所包含的内容为纯文本,不会进行转义;XML特殊字符显示结果 描述 转义字符 十进制 < 小于号 &...原创 2020-04-27 16:23:49 · 2811 阅读 · 0 评论 -
SAXParseException 前言中不允许有内容
项目中使用cml作为工作流配置文件,今天运行时一直报以下异常,折腾一番后总结为:读取文件异常,文件格式不符合要求或者文件编码不符合要求,检查一下读取的文件,如果没有问题的话,检查以下应用程序是否读取了其他不符合要求的文件。javax.xml.bind.UnmarshalException - with linked exception:[org.xml.sax.SAXParseExc...原创 2020-04-27 15:31:07 · 4701 阅读 · 0 评论 -
java反射遍历实体的所有属性名称和值-自定义和jdk自带类型
问题的产生是由于泛型方法中如果实体本身就是基础数据类型的类该如何对实体进行处理,首先上一段代码吧:/** * @param <T>:声明方法是一个泛型方法,T声明泛型类型 * @param T 声明返回类型 * @param classz:泛型类型的具体类型,体现“参数化” * @param classz * @return */public static...原创 2020-04-27 14:46:27 · 2837 阅读 · 0 评论 -
java泛型方法实现要点
java泛型是J2 SE1.5中引入的一个新特性,其本质是参数化类型。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。优点是类型安全、消除强制类型转换、提高的运行效率、潜在的性能收益。这里的重点是"参数化类型",这表明两个关键信息,一个是声明的是类型,第二个是声明的类型是由使用的参数决定。带返回值的泛型方法示例/** * @param &...原创 2020-04-27 14:19:08 · 1413 阅读 · 0 评论 -
Java 语言中xml和bean之间的相互转换(Try-with-resources)
XML 指可扩展标记语言,XML 被设计用来传输和存储数据,常用的场景是数据交换和信息配置。虽然后期随着信息技术的发展在数据交换场景的地位远不如从前,但是作为信息配置工具,特别是配置信息多和配置信息复杂的场景,依然有着比较广泛的应用。 然后闲话不多说,先上一段Java版本的xml和对象相互转换的代码。/** * java对象转换为xml文件 *...原创 2020-04-26 14:27:44 · 762 阅读 · 0 评论 -
Java -Byte[]和String之间的转换问题
Java语言中将字符串和字节数组之间相互转换的场景很多,比如我们常见的,socketChannel,netty,RocketMQ这类的应用在数据传输过程中都需要将字串转换为Byte数组,然后再将Byte数据转换为String。比如RSA,DES之类的加解密场景,也是需要对转换为Byte数据后进行。本文总结了Byte[]和String之间的转换原理以及实现。 首先来一段代...原创 2020-04-26 08:57:15 · 2032 阅读 · 0 评论 -
HashMap的两种遍历方法EntrySet或者KeySet性能分析
首先列举几种HashMap的遍历方法1.迭代器entrySet Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = en...原创 2020-04-24 10:56:46 · 2033 阅读 · 0 评论 -
Java动态代理三种实现模式
代理模式是指客户端通过代理对象访问实际对象的设计模式。通常我们在处理同一种类型的服务,这个服务的大部分都是相同的,只是在具体的细节上存在差异。这种情况为了避免重复处理相同的服务部分,我们就可以将具体实现细节抽象出来,通过代理实现,在整体结构上种类繁多的服务看起来如同只有一个服务,区别只是在于服务具体的细节不一样。Java提供三种方式实现动态代理:JDK代理,CGLIB和通过编译...原创 2020-04-24 09:16:55 · 1873 阅读 · 1 评论 -
SpringBoot2.0以后MAVEN依赖问题
SpringBoot2.0以后MAVEN依赖问题,这里呢我记录一个自己踩的坑“Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/core/ErrorCoded。”=缺少spring-boot-starter-jdbc依赖。项目SpringBoot版本升级到2.2.6.RELE...原创 2020-04-22 15:55:41 · 3035 阅读 · 0 评论 -
Spring Boot2.0以上版本WebServerFactoryCustomizer进行WebServer的个性化配置
SpringBoot从1.5.3升级到2.1.6有不少问题,比较典型的一个是WebServer的个性化设置问题。在1.5.3中可以直接通过实行EmbeddedServletContainerCustomizer就可以方便设置。@ComponentScan(basePackages ={"******"})@SpringBootApplication(exclude={DataS...原创 2020-04-22 15:24:35 · 12343 阅读 · 0 评论