java
文章平均质量分 70
延迟满足
热爱新技术,喜欢研究原理,感受设计之美。
展开
-
为什么 Java 外部类可以访问静态内部类的 private 属性?
外部类可以访问静态内部类的 private 属性。原因静态内部类在经过 Java 编译器编译后会生成 private 属性对应的 access$Xxx(),供外部类使用。一个类被使用到的时候才会加载到内存。静态内部类之所以可以延迟加载是因为,外部类通过调用静态内部类的 static 方法(access$Xxx()),也就是会执行 invokestatic 这个字节码从而引起静态内部类加载(这是触发类加载的一种场景)。扩展可以通过在私有的构造方法中判断对象引用是否为 null 来防止反射调用。.原创 2020-06-26 16:55:38 · 3327 阅读 · 3 评论 -
Java 必备原理知识
注:这篇博客主要记录一些我觉得作为一个 Java 开发所应该知道的基础知识。有的内容我觉得有些博客已经写的很清晰了,我就会直接复制过来并标明原文链接。final、static、static final修饰的字段赋值的区别static修饰的字段在类加载过程中的准备阶段被初始化为0或null等默认值,而后在初始化阶段(触发类构造器)才会被赋予代码中设定的值,如果没有设定值,那么它的值就为默认值。final修饰的字段在运行时被初始化(可以直接赋值,也可以在实例构造器中赋值),一旦赋值便不可更改;stati原创 2020-06-07 10:32:46 · 378 阅读 · 0 评论 -
Linux 常用命令
命令ps -ef|grep execFileName 查看某个进行的状态cat filePathmkdir /fileName 创建文件夹cp /sourcePath /destPath 复制touchpwd 查看当前路径ln -s /fileName /xxx 创建软连接rm -f 删除指定文件。rm -rf 会把目录下的所有文件删除。yum install xx 安装所需软件包wget http://www.xxxx.tar.gz 下载压缩包tar -zxv原创 2020-05-24 16:38:22 · 286 阅读 · 0 评论 -
JDK1.6 对 synchronized 的锁优化
1. 背景在 JDK 1.6 中对锁的实现引入了大量的优化。目的减少锁操作的开销。2. 锁优化在看下面的内容之间,希望大家对 Mark Word 有个大体的理解。Java 中一个对象在堆中的内存结构是这样的:Mark Word 是这样的:2.1 适应性自旋锁自旋锁的思想:让一个线程在请求一个共享数据的锁时执行忙循环(自旋)一段时间,如果在这段时间内能获得锁,...原创 2019-08-25 08:47:49 · 458 阅读 · 0 评论 -
深拷贝和浅拷贝
概述Java 集合中提供的拷贝构造函数只支持浅拷贝而不是深拷贝,这是因为集合中的拷贝构造函数是通过引用的复制来达到浅拷贝的。这意味着存储在原有集合和克隆集合中的对象会保持一致(指向同一内存地址)。当然如果集合中的对象是不可变对象,那这是可以的。这也是为什么 String 设计为不可变类之一的原因。String 对象在字符串常量池中更新一个并不会影响到其他对象,便于缓存字符串。public fi...原创 2019-01-20 21:58:49 · 172 阅读 · 0 评论 -
Java 中字节流的 read() 方法为什么返回值不是 byte 类型而是 int 类型?
原因因为不管是网络还是磁盘,数据最终都是以二进制字节流的形式传输,也就是一个字节一个字节。所以就存在 1111 1111 ,如果用 Java(只存在有符号数) 中的 byte 接收的话,1111 1111 就代表 -1,就会导致流还没有读取完就结束了读取。通过用 int 接收从操作系统中读取过来的字节流,在高 24 位都补零,这样就不会存在读取的数据为 -1 的情况了,所以我们就可以用 -1 ...原创 2019-01-19 11:41:21 · 3286 阅读 · 0 评论 -
Comparable 和 Comparator 的区别
Comparable同一个类的不同对象之间进行比较,通过重写 compareTo() 指定比较的规则。缺点只能指定一种排序规则Comparator类似于一种策略模式,将排序规则和业务类利用一个独立的接口来解耦。因此可以有多种排序规则。通过重写 compare() 指定比较的规则。优点灵活,解耦...原创 2018-10-27 12:05:33 · 124 阅读 · 0 评论 -
jdk 源码精髓(持续更新)
巧用三目运算和逻辑运算符String 类里的两个方法。(大家对比着看,体验一下如何巧用三目运算符)public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) {...原创 2018-10-24 18:14:38 · 458 阅读 · 0 评论 -
装饰模式
职责动态的为一个对象增加新的功能装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。代码示例// 抽象构建组件public interface ICar { void move();}// 具体构建组件class Car implements ICar { @Overri...原创 2018-10-29 16:56:15 · 140 阅读 · 0 评论 -
Java 中的链表分析
容器我们平时都经常遇到容器这个词,那么 Java 集合中的容器指的是什么呢?**容器就是利用某种特定的数据结构来存储数据的。**在研究 Java 集合源码中时,我发现理解容器的关键要素很重要,因为这些关键元素在各个容器之间是通用的。关键要素:物理结构数据结构分物理结构、逻辑结构。物理结构就是数据在计算机中是怎么存储的,有数组和链表两种方式。数组是内存中一块连续的存储空间,所以可以随机...原创 2019-01-17 09:02:24 · 602 阅读 · 0 评论 -
JDK 1.6 synchronized 的锁优化
背景在 JDK 1.6 中对锁的实现引入了大量的优化。目的减少锁操作的开销。JDK 1.6 以后的锁优化在看下面的内容之间,希望大家对 Mark Word 有个大体的理解。Java 中一个对象在堆中的内存结构是这样的:Mark Word 是这样的:1. 适应性自旋锁自旋锁的思想:让一个线程在请求一个共享数据的锁时执行忙循环(自旋)一段时间,如果在这段时间内能获得锁,就可以避免进...原创 2019-04-20 21:49:53 · 351 阅读 · 0 评论 -
Java 中常说的常量池到底是什么
常量池的划分Class 文件常量池运行时常量池字符串常量池1. Class 文件常量池Class 文件常量池指的是编译生成的 class 字节码文件,其结构中有一项是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。什么是字面量和符号引用?字面量是指字符串字面量和声明为 final ...原创 2019-05-11 10:04:51 · 4541 阅读 · 1 评论 -
Java 中报 ClassNotFoundException 这个异常怎么解决
在 web 项目中报这个错,一般有两种情况:classpath 设置错误。maven 依赖导入的 jar 发生了冲突,可以利用 IDE 或者插件找出冲突来,从而解决。原创 2019-06-06 22:21:19 · 1965 阅读 · 0 评论 -
Java 集合 - WeakHashMap
铺垫下文原理中所说的 map 都是指 WeakHashMap 。弱引用实际上,弱引用在构造时也需要传入一个对象的强引用作为参数。例如:Car car = new Car(22000,"silver");WeakReference<Car> weakCar = new WeakReference<Car>(car);特性弱引用(WeakReference)的...原创 2019-07-23 16:25:08 · 141 阅读 · 0 评论 -
Java 中的反射
概念Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。为什么需要反射我们需要对象直接 new 就行,那么为什么要有 Java 反射机制呢?java的反射机制就是增加程序的灵活性,避免将程序写死到代码里,例如: 实例化一个 per...原创 2019-07-21 17:10:17 · 123 阅读 · 0 评论 -
内部类原理剖析
为什么匿名内部类不能使用方法的局部变量,可以使用方法的 final 常量?不加 final局部变量用 final 修饰本质在方法执行的时候是借助栈来完成的,JVM 在执行我们的方法时,会把执行的方法作为一个栈帧压入栈。我们方法里的局部变量被存储在执行方法所对应的栈帧的局部变量表中。这就意味着我们局部变量的生命周期是在所执行的方法还留在栈中,一旦这个方法弹出栈,局部变量也对应着被回收(...原创 2018-10-29 12:03:49 · 219 阅读 · 0 评论 -
深入理解 Java 泛型
核心思想在泛型擦除时,如果泛型参数没有边界,那么就使用 Object 代替。public class Demo3 { public static void main(String args[]){ fun(new Integer[]{1,2,3}) ; } public static &lt; T&gt; void fun(T[] param){ /...原创 2018-10-28 11:32:59 · 165 阅读 · 0 评论 -
从字节码角度理解静态方法和实例方法的调用
微信公众号:Java 知其所以然关注可了解更多的教程。问题或建议,请公众号留言;实例方法的调用代码public class App { public static void main(String[] args) { 原创 2018-10-09 17:27:54 · 476 阅读 · 0 评论 -
第三方日期处理神器-----Joda-Time
传统的我们一般日期处理(格式化时间等)时往往会用java.util.Date这个类,但是对于一些复杂的日期处理就显得力不从心了。现在给大家推介一个很好的日期处理类 org.joda.time.DateTime既然无法摆脱时间,为何不设法简化时间处理?这就是joda-time。导入在pom.xml里加入下面的依赖就可以使用了<dependency> <groupId>...原创 2018-05-22 17:46:17 · 2538 阅读 · 0 评论 -
StringUtils里的isEmpty方法和isBlank方法的区别
前言我们常说的字符串为空,其实就是一个没有字符的空数组。比如:String a = "";a 就可以称为是一个空字符串。由于 String 在 Java 中底层是通过 char 数组去存储字符串的,所以空字符串对应的 char 数组表现形式为private final char value[] = new char[0];但实际工作中,我们可以需要对字符串进行一些校验,比...原创 2018-05-22 20:11:22 · 113151 阅读 · 16 评论 -
Java 枚举后端开发使用经验
package com.ypf.enums;public enum ProductStateEnum { OFFLINE(-1, "非法商品"), SUCCESS(0, "操作成功"), PASS(2, "通过认证"), INNER_ERROR(-1001, "操作失败"), EMPTY(-1002, "商品为空&am原创 2018-06-05 12:31:26 · 1186 阅读 · 0 评论 -
DTO 实现 service 和 controller 之间的值传递
/** * 封装执行后结果 */public class PersonInfoExecution { // 结果状态 private int state; // 状态标识 private String stateInfo; // 店铺数量 private int count; // 操作的personInfo(增删改店铺的时候用...原创 2018-06-05 12:37:05 · 8510 阅读 · 0 评论 -
在JavaWeb中对于时间的处理和时间格式的转化
我们在平时的开发中由于实际的需求,可能会需要不同的时间格式,这个时候我就在时间对应的字段上进行处理等。但实际上这样都复杂化了。 我觉得我们应该统一接口,前端和后端之间就通过时间戳来传递,后端与数据库之间也是时间戳来传递。后台和数据库之间的传递//直接new 一个当前时间的Date对象即可,数据库对应的类型为 datetimedogVaccine.setVaccineTime(new...原创 2018-06-23 14:22:57 · 3824 阅读 · 0 评论 -
mysql设计及封装无限层级的树状数据结构
数据库表设计给每条数据加个 parent_id字段,通过parent_id来建立数据之间的父子(层级)关系。 parent_id为0是根节点。 看下面这些数据感受一下他们之间通过parent_id建立起的关系 数据库查询语句通过父节点id查询出同级的节点&lt;select id="selectChildrenCategoryByParentId" resultMap="...原创 2018-06-27 21:15:25 · 6623 阅读 · 4 评论 -
使用Set集合对复杂对象去重
步骤1.使用Set集合 2.重写equal和hashCode方法 注意的是:我们想根据一些属性为依据去判断是否为同一个对象从而去重,那么我们这里就需要以这些属性为因子去重写equal和hashCode方法代码实战这里我以Category的id属性为依据重写equal和hashCode方法来排重import java.util.Date;public class ...原创 2018-06-27 21:39:25 · 5562 阅读 · 0 评论 -
java的特性和优势
简单性 是c++语法的纯净版。没有头文件,指针运算,结构,联合,操作符重载,虚基类等等。语法基于c,因此学习起来完全不费力。面向对象 面向对象是一种程序设计技术,他将重点放在数据(即对象)和对象之间的接口上。可移植性(跨平台性) 这是JAVA的一个重要的优势。JAVA代码或者说字节码、二进制码可以跨平台的移植,而不用管具体的操作系统和硬件环境。JAVA本身就是面...原创 2018-07-04 12:52:10 · 9838 阅读 · 0 评论 -
System.arraycopy() 实现数组之间的复制
最近在研究 jdk 源码的时候发现经常用到 System.arraycopy() 这个方法,于是写下来作为记录。System.arraycopy() 作用可以实现数组之间的复制函数原型public static native void arraycopy(Object src, int srcPos, ...原创 2018-07-18 15:45:25 · 1631 阅读 · 0 评论 -
File 类之目录讲解
操作目录mkdir() 创建目录,必须确保父目录存在,如果不存在,创建失败mkdirs() 创建目录,如果父目录链不存在,则一同创建list() 文件|目录 名字符串形式listFiles() 文件|目录 File 对象形式static listRoots() 根路径(获取盘符)代码如下:public class Demo04 { ...原创 2018-08-18 18:36:22 · 473 阅读 · 0 评论 -
Java 并发编程之 Synchronized 关键字最全讲解
synchronized关键字synchronized锁什么? 锁对象。锁的对象包括:this临界资源对象Class 类对象。 synchronized 除了保障原子性外,其实也保障了可见性。因为 synchronized 无论是同步的方法还是同步的代码块,都会先把主内存的数据拷贝到工作内存中,同步代码块结束,会把工作内存中的数据更新到主内存中,这样主内存中的数据一定...原创 2018-09-11 17:18:11 · 6360 阅读 · 2 评论 -
Java 并发编程之 volatile 关键字
作用保证不同线程对 volatile 修饰的变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。禁止进行指令重排序。volatile 的可见性public class Test_09 { /*volatile*/ boolean b = true; void m(){ System.out.printl...原创 2018-09-11 20:40:59 · 145 阅读 · 0 评论 -
堆和栈的区别
原创 2018-09-20 18:41:20 · 138 阅读 · 1 评论 -
适配器模式
适配器模式定义适配器用于让两个无关的类之间产生联系,可以一起协同工作。解释就拿小米 6手机为例子,它没有圆孔来让耳机插入,就只有一个方孔,那我们怎么插耳机呢?小米手机提供了一个转接口来帮我们干这件事,耳机本来就可以插圆孔但是不能插方孔,转接头既可以插圆孔也可以插方孔。这就使得本来耳机不能插入手机,通过一个转接口可以实现这个功能。这个转接口其实就是一个适配器,它让耳机和手机本来不可以通信的两...原创 2018-10-11 19:58:40 · 130 阅读 · 0 评论 -
Java 中的锁优化
jdk1.6 开始 JVM 对 synchronized 关键字做了大量的锁优化。自旋锁通过 CAS 来自旋直到获取锁,占用 CPU 资源,但不会进行线程状态的切换。适合用于线程竞争不激烈,短任务的场景。线程竞争激烈的情况下,自旋会占有 CPU,从而使系统的吞吐量降低。锁消除JIT 编译器经过逃逸分析后发现并没有线程安全问题,就会做锁消除。锁粗化当 JIT 编译器发现一系列连续的操...原创 2018-10-18 21:40:22 · 173 阅读 · 0 评论 -
Java 环境的安装和配置
classpath: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jarJAVA_HOME: C:\Program Files\Java\jdk1.8.0_101 Path: %JAVA_HOME%\bin;(在Path最后面添加)原创 2018-05-15 16:17:48 · 188 阅读 · 0 评论