
JAVA开发
文章平均质量分 97
宿命小乐
这个作者很懒,什么都没留下…
展开
-
HashMap&ConcurrentHashMap源码探究
目录HashMap&ConcurrentHashMap源码探究一、JDK1.7 HashMap1、初始化(伪初始化) 2、put(真初始化)二、JDK1.7ConcurrentHashMap三、JDK1.8 HashMap四、JDK1.8ConcurrentHashMapHashMap&ConcurrentHashMap源码探究一、JDK1.7 HashMap1、初始化(伪初始化) 不传参数,默认table大小为16,加载因子为0...原创 2020-11-25 11:37:01 · 639 阅读 · 1 评论 -
JAVA性能优化(笔记篇)
一、编程优化1、字符串优化String字符串是开发中使用最频繁,也是最容易忽略的性能委托。高效使用字符串可以提升系统整体性能String 类被 final 关键字修饰了,而且变量 char 数组也被 final 修饰了。我们知道类被 final 修饰代表该类不可继承,而 char[]被 final+private 修饰,代表了 String 对象不可被更改。Java 实现的这个特性叫作 String 对象的不可变性,即 String 对象一旦创建成功,就不能再对它进行改变。这样做的好处是:第原创 2020-10-29 19:43:24 · 225 阅读 · 0 评论 -
字节码一:Class文件的结构、魔数与版本号
一、Class文件的结构学过java都知道,java是跨平台的,“一次编译,到处运行”是java诞生之时就有的口号。原因就在于“字节码”。各个不同平台的虚拟机和所有平台都统一的使用字节码这种格式存储,就是构成平台无关性的基石。另外要说的一点是Class文件并不是说只有java程序会生成,也就是说java虚拟机并不是指只有java语言才能运行。只要是在经过编译后生成符号虚拟机规范的Class文件,都可以在java虚拟机中运行!如果JRuby,Groovy等(反正我也没用过)。至于什么是符合虚拟机规原创 2020-09-23 23:43:47 · 544 阅读 · 0 评论 -
类加载十:来写一个自定义类加载器
十、来写一个自定义类加载器在写代码之前,先看一下类加载loadClass的源码:Class<?> clazz = loader1.loadClass("com.lxl.jvm.MyTest01");还是调用自己的loadClass,第二个参数resolve :If <tt>true</tt> then resolve the class public Class<?> loadClass(String name) throws Clas原创 2020-09-22 20:47:02 · 429 阅读 · 0 评论 -
类加载九:数组的类是jvm虚拟机在运行中动态创建的
九、数组的类是jvm虚拟机在运行中动态创建的,代码如下:public class MyTest15 { public static void main(String[] args) throws IOException { String[] strings = new String[2]; System.out.println(strings.getClass().getClassLoader());//这里输出为null是因为根类加载器 MyTest15[] mytest15s原创 2020-09-22 20:05:45 · 258 阅读 · 0 评论 -
类加载八:类加载器的双亲委派模型
八、类加载器的双亲委派模型。代码如下:public class MyTest14 { public static void main(String[] args) throws IOException { ClassLoader classLoader = Thread.currentThread().getContextClassLoader();//获取当前线程上下文类加载器 String resourceName = "com/lxl/jvm/Mytest12.class";原创 2020-09-22 11:43:33 · 127 阅读 · 0 评论 -
类加载七:调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用
七、调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用。代码如下:public class MyTest12 { public static void main(String[] args) throws ClassNotFoundException { ClassLoader loader = ClassLoader.getSystemClassLoader(); Class<?> clazz = loader.loadClass("com.原创 2020-09-22 11:06:32 · 1976 阅读 · 0 评论 -
类加载六:通过子类调用父类的静态变量或者静态方法,那么表示为对父类的主动使用,而不是子类的主动使用
上一篇:类加载五:初始化子类时会先初始化其父类六、通过子类调用父类的静态变量或者静态方法,那么表示为对父类的主动使用,而不是子类的主动使用。代码如下public class MyTest11 { public static void main(String[] args) { System.out.println(MyChild11.a); MyChild11.success(); }}class MyParent11 { public static int a = 5;原创 2020-09-22 11:03:13 · 2512 阅读 · 0 评论 -
类加载五:初始化子类时会先初始化其父类
五、初始化子类时会先初始化其父类。代码如下public class MyTest10 { public static void main(String[] args) { System.out.println(MyChild10.b); }}class MyParent10 { public static int a = 5; static{ System.out.println("MyParent10 loading"); } }class MyChild10原创 2020-08-06 19:38:09 · 1446 阅读 · 0 评论 -
类加载四:类在初始化时,初始化执行顺序为代码顺序
四、类在初始化时,初始化执行顺序为代码顺序。代码如下:public class Mytest06 { public static void main(String[] args) { //Singleton singleton = Singleton.getSingleton(); System.out.println("counter1:" + Singleton.counter1); System.out.println("counter2:" + Singleton.counter原创 2020-08-06 19:18:57 · 296 阅读 · 0 评论 -
类加载三:数组实例,其类型是由jvm在运行期动态生成,动态生成的类型,其父类型就是Object
三、数组实例,其类型是由jvm在运行期动态生成,动态生成的类型,其父类型就是Object。代码如下public class MyTest04 { public static void main(String[] args) { //MyParent04 myParent04 = new MyParent04(); MyParent04[] myParent04s = new MyParent04[1]; MyParent04[][] myParent04s1 = new MyParen原创 2020-08-06 17:22:17 · 267 阅读 · 0 评论 -
类加载二:常量的值并非编译期间可以确定的,则不会放入常量池,引用常量会导致类的初始化
二、常量的值并非编译期间可以确定的,则不会放入常量池,引用常量会导致类的初始化。代码如下:public class MyTest03 { public static void main(String[] args) { System.out.println(MyParent03.str); }}class MyParent03 { public static final String str = UUID.randomUUID().toString(); static {原创 2020-08-06 17:17:57 · 336 阅读 · 0 评论 -
类加载一:引用常量池中的常量,不会导致类的初始化
一、引用常量池中的常量,不会导致类的初始化。代码如下:public class MyTest02 { public static void main(String[] args) { System.out.println(MyParent02.m);//MyParent02.str 编辑阶段存入到MyTest02的常量池中。不会初始化MyParent02 }}class MyParent02 { public static final String str = "hello wor原创 2020-08-06 17:14:06 · 675 阅读 · 2 评论 -
重拾算法-01、JAVA有序数组封装(包含二分法查询,插入,删除)
package com.lxl.array.pojo;/** * 有序数组对象封装 * @author xiaole * */public class OrdArray { private int[] a; private int nElems;// 数据实际长度 public OrdArray(int a) { this.a = new int[a]; this.nElems = 0; } public int size() { return nElems.原创 2020-06-14 11:52:03 · 210 阅读 · 0 评论 -
java虚拟机学习笔记(第二部分-自动内存管理机制 第二章-java内存区域与内存溢出异常)精简版
第二部分 自动内存管理机制第二章 java内存区域与内存溢出异常2.2 运行时数据区域1、程序计数器①较小的内存空间,可以看做是当前线程锁执行的字节码的行号指示器。②java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间来实现的。一个处理器(内核)在任何一个确定的时刻都只会执行一条线程中的指令。③为了在线程切换后能恢复原有的执行位置。每条线程都需要一个独立的程序计数器,各线程之间...原创 2020-01-09 17:45:06 · 185 阅读 · 0 评论 -
熟悉JAVA反射后,来偷懒做些事情字符串处理的事情
举个简单的例子吧,假设我们想把一个对象的所有属性值存到数据库里,通常会用到insert into XXX (field1,field2) values (v001,v002)像这种语句,格式都一个样,唯一的区别就是XXX表和表的字段与值的不同。但是针对不同的表,总要重复写这条语句,然后一条一条复制粘贴表里的所有字段,再一条一条复制粘贴所有的字段值,要是表多而且字段多的话转载 2017-11-30 11:37:59 · 263 阅读 · 0 评论 -
简述为何要根据Java的“反射”特性编程
Java的反射特性一般结合注解和配置文件(如:XML)来使用,这也是大部分框架(Spring等)支持两种配置方式的原因。如果是注解方式:当服务端启动时,Spring框架会去扫描指定目录下的类,通过反射看类有没有Service注解,如果类上有 Service注解,会提前初始化(new)这个类。初始化好所有类以后,再去查找所有属性,看属性有没有Autowired注解,有的话,会给这个属性注入值(反射赋转载 2017-11-30 11:27:27 · 265 阅读 · 0 评论