
Java
文章平均质量分 87
AllenC6
来战
展开
-
HashTable源码解析、Collections.synchronizedMap解析
HashTable的操作几乎和HashMap一致,主要的区别在于HashTable为了实现多线程安全,在几乎所有的方法上都加上了synchronized锁,而加锁的结果就是HashTable操作的效率十分低下。不建议使用HashTable,Oracle官方也将其废弃,建议在多线程环境下使用ConcurrentHashMap类。HashMap是线程不安全的类,多线程下会造成并发冲突,但单线程下运行效率较高;HashTable是线程安全的类,很多方法都是用synchronized修饰,但同时因为加锁导致并发效率原创 2022-06-20 17:07:35 · 300 阅读 · 0 评论 -
Java IO 和序列化
一、序列化实现方式实现Serializable接口1.Serializable接口的作用serializable接口就是一个标识,实现了serializable接口的类就相当于打上了一个tag,有这个tag的类就可以被序列化2.原创 2022-05-19 01:45:57 · 679 阅读 · 0 评论 -
Java 语法糖 泛型、自动拆装箱、遍历循环等
一、泛型与类型擦除泛型是JDK 1.5的一项新增特性,它的本质是参数化类型(Parametersized Type)的应 用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法 的创建中,分别称为泛型类、泛型接口和泛型方法。Java语言中的泛型则:它只在程序源码中存在,在编译后的字节码文件中,就已 经替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转 型代码,因此,对于运行期的Java语言来说,ArrayList<i原创 2022-01-12 16:20:52 · 298 阅读 · 0 评论 -
JVM 类加载器
一、类加载器虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字 节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。类加载器可以说是Java语言的一项创新,也是Java语言流行的重要原因之一,它最初是为了满足Java Applet的需求而开发出来的。虽然目前Java Applet技术基本上已经“死掉”,但类加载器却在类层次划分、OSGi、热部署、代码加密等领域大放异彩,成为了Java技术体系中一块重要的原创 2022-01-08 16:19:47 · 290 阅读 · 0 评论 -
对Java字节码文件到JVM运行的一个认识
推荐书籍:java虚拟机规范 这本书告诉我们: JVM是一种规范深入理解java虚拟机先有个整体的概念:java程序运行的本质就是方法套方法,我们需要知道的就是我们编写的java文件编译后的字节码被JVM如何保存(即如何把一个类的各种信息存下来),在方法执行的时候如何能找到之前存的信息,还有在执行过程中发生了什么(内存中如何变化)一、JVM如何保存字节码文件1. Java代码编译成的字节码文件:先看一个类:public class TestA { public sta.原创 2022-01-07 19:27:06 · 1393 阅读 · 0 评论 -
Java虚拟机垃圾回收、垃圾回收器
我的理解简述:youngGC、OldGC、FullGCYoungGC 就是年轻代的gc ,OldGC就是老年代的gc ,FullGC是针对年轻代、老年代、永久代进行的整体的gc 。MinorGC也可以称之为YoungGC,MajorGC也可以称之为OldGC,但是为什么有人把fullGC和oldGC挂等号呢,这是在jdk1.7之前永久代还没取消,oldGC就会把老年代和永久代(方法区)一起GC,而OldGC执行的时候,一般都会带上一次YoungGC发生YoungGC之前往往会先检查一下老年.原创 2022-01-06 18:33:06 · 316 阅读 · 0 评论 -
Type 反射获取泛型真实类型
Generic 中文翻译--> 泛型当我们对一个泛型类进行反射时,需要的到泛型中的真实数据类型,来完成如json反序列化的操作。此时需要通 过 Type 体系来完成。 Type 接口包含了一个实现类(Class)和四个实现接口,他们分别是:实现类:TypeVariable 泛型类型变量。可以泛型上下限等信息; ParameterizedType 具体的泛型类型,可以获得元数据中泛型签名类型(泛型真实类型) GenericArrayTy...原创 2021-11-30 16:26:52 · 1727 阅读 · 0 评论 -
Java静态代理和动态代理
Java动态代理原理:1.这个动态代理对象是什么,为什么能强转成那些传入的Proxy.newProxyInstance中的第二个参数的接口2.怎么实现的一调用我们传入Proxy.newProxyInstance中的第二个参数中接口中的方法,就会触发InvocationHandler的invoke方法,并且把调用的那个方法的Method和参数传过来。原创 2021-11-26 19:36:38 · 227 阅读 · 0 评论 -
Java反射
一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的,并且能够获得此类的引用。于是我们直接 对这个类进行实例化,之后使用这个类对象进行操作。 反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。这时候,我们 使用 JDK 提供的反射 API 进行反射调用。反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性(包括私有方法和属性)。是Java被视为动态语言的关键。 Ja.原创 2021-11-05 19:28:42 · 178 阅读 · 0 评论 -
java JVM 内存结构
一、java虚拟机内存:线程共享:堆、方法区线程独享:虚拟机栈、本地方法栈、程序计数器二、堆:是垃圾回收的主要区域堆的内存又根据垃圾回收分为:1.新生代:Eden、S0(Survive from)、S1(Survice to)2.老年代三、方法区:包括运行时常量池、字符串常量池、类元信息、静态变量需要注意的一点是方法区是规范,在不同类型的虚拟机中采用不同的实现方法,hotspot在jdk 1.7包括1.7之前方法是永久代实现的(目的是为了不用在给方法区写垃圾回收的代码),永久原创 2021-05-25 14:36:43 · 247 阅读 · 0 评论 -
Java 范型的使用
1.范型的使用范围和方法2.通配符?和Object的区别,通配符的作用域、通配符范型嵌套List<Object> 范型是Object就只能传Object不能传Object的子类型,这点特别容易混淆?和Object原创 2021-04-20 14:47:15 · 417 阅读 · 0 评论 -
内部类的继承问题
成员内部类可以继承其他的类,也可以被其它类继承,本文主要说明其它类继承成员内部类的问题。本文要点如下: 1).成员内部类的子类可以是内部类,也可以不是内部类; 2).当成员内部类的子类不是内部类或子类虽是内部类但与其父类不在同一个外部类时,子类的构造方法第一句要显式添加如下的语句: 外部类对象引用.super(参数); 这里的外部类指父类所在的外部类; 3).编译器默认给成员内部类的构造方法传入一个参数,该参数是内部类所依附...原创 2021-03-04 18:08:28 · 2767 阅读 · 3 评论 -
Java 接口和抽象类
在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:abstractvoidfun();抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。 在《JAVA编程思想》一书中,将抽...原创 2021-03-03 14:34:45 · 114 阅读 · 0 评论 -
对ThreadLocal 的一点自己的理解
先贴两段代码: public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } ThreadLocalMap g原创 2021-01-22 13:07:21 · 455 阅读 · 0 评论 -
AtomicInteger、volatile
一、volatile:1、保证变量在线程间可见,对volatile变量所有的写操作都能立即反应到其他线程中,换句话说,volatile变量在各个线程中是一致的(得益于java内存模型—"先行发生原则");2、禁止指令的重排序优化。解决的问题是:在进行类似于赋值(修改变量时注意不是运算)时的操作时,虚拟机会重排指令进行优化这时赋的值会暂存起来,如果此时其他线程也对这个值进行赋值等操作就会...原创 2019-08-07 14:30:52 · 1849 阅读 · 1 评论 -
学习HashMap
1.HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null键和null值这点和hashTable区别hashTable不允许key为null执行的时候会报空指针异常, 如果键值是null在执行put方法的时候就会被放在第一个位置,hashMap中key不可以重复所以在插入的时候如果有相同的key就会把之前的value替换掉,因为 hashMap存放数据是根据hash算法存储...原创 2019-08-02 11:59:05 · 312 阅读 · 0 评论 -
Java byte转int时的处理
1.在java中是用补码进行表示和运算的2.补码出现的原因及原理:原因:因为cpu只支持加法运算,那问题来了遇到减法运算时怎么办,这时补码就产生了。减数和被减数的区分是:减号前面的数是被减数,减号后面的数是减数。原理:那补码是干啥的呢?:一个数在做减数的时候,等于加这个数的补码。那补码应该怎么算呢?:就是用当前所在范围内能表示的最大的数减去当前的数为什么要这么算呢?:举个例...原创 2019-07-26 10:35:12 · 353 阅读 · 0 评论 -
多态的实质:静态绑定(编译时绑定)与动态绑定(运行时绑定)
1.能被重写的方法为虚方法,虚方法是动态绑定的,因为可以被重写所以通过声明的类型去查找方法地址就不靠谱了(因为多态的出现父类的声明可能是子类的实例),所以只有在运行的时候才能确定是哪个类的引用,不能被重写的例如由static、private、final修饰的方法是静态绑定的,因为不能重写所以这个方法逻辑是不变的,也就能很早的确定方法的地址。如果某个Java方法是final的或者不是虚方法的话,...转载 2019-04-10 18:32:01 · 2649 阅读 · 0 评论 -
构造方法的静态解决Java编程思想189页说构造器是静态方法问题
先推荐一篇文章:https://rednaxelafx.iteye.com/blog/652719实例构造器无法被隐藏或覆写,不参与多态,因而可以做静态绑定。从这个意义上可以认为实例构造器是“静态”的,但这种用法与Java语言定义的“静态方法”是两码事。另外需要注意的是,Java语言中,实例构造器只能在new表达式(或别的构造器)中被调用,不能通过方法调用表达式来调用。new表达式作...转载 2019-04-10 17:40:16 · 231 阅读 · 0 评论 -
JVM的Class对象详解
弄清这个问题前必须的明白类型信息和JVM方法区。类型信息是一个java类的描述信息(class mate),classloader加载一个类时从class文件中提取出来并存储在方法区。它包括以下信息:1.类型的完整有效名,类型的修饰符(public,abstract, final的某个子集),类型直接接口的一个有序列表及继承的父类。类型名称在java类文件和jvm中都以完整有效名出现。...原创 2019-01-10 01:01:42 · 1427 阅读 · 0 评论 -
多态
public class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); } }public class B extends A{ public String ...原创 2018-12-10 15:30:13 · 126 阅读 · 0 评论 -
Java static的方法不能被重写
原文:https://blog.csdn.net/xjyr/article/details/79435349重写方法的目的是为了多态,或者说:重写是实现多态的前提,即重写是发生在继承中且是针对非static方法的。语法上子类允许出现和父类只有方法体不一样其他都一模一样的static方法,但是在父类引用指向子类对象时,通过父类引用调用的依然是父类的static方法,而不是子类的static...原创 2018-12-06 18:10:50 · 1222 阅读 · 0 评论 -
Java 修饰符
适用范围<访问权限范围越小,安全性越高> 访问权限 类 包 子类 其他包 public ∨ ∨ ∨ ∨ (对任何人都是可用的) protect ∨ ∨ ∨ × (继承的类可以访问以及和private一样的权限) default ...原创 2018-12-05 19:08:31 · 353 阅读 · 0 评论 -
Interface 新特性
java8中为接口新增了一项功能:定义一个或者更多个静态方法。用法和普通的static方法一样。static方法:public interface InterfaceA { /** * 静态方法 */ static void showStatic() { System.out.println("InterfaceA++showStat...转载 2018-12-05 18:44:26 · 178 阅读 · 0 评论 -
java final
final关键字可以用于成员变量、本地变量、方法以及类。 final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。 你不能够对final变量再次赋值。 本地变量必须在声明时赋值。 在匿名类中所有变量都必须是final变量。 final方法不能被重写。 final类不能被继承。 final关键字不同于finally关键字,后者用于异常处理。 final关键字...原创 2018-12-05 15:33:49 · 117 阅读 · 0 评论 -
Java 子类和父类详解
1.在许多加载机制中,加载子类必须先加载父类,加载伴随着初始化<client>,所以子类初始化前会先执行父类的初始化:结果:所以当子类初始化的时候父类也会初始化2.当子类实例化的时候父类不会实例化,但是会执行父类的构造方法父类构造方法的执行,是为了给变量进行赋值,而不是为了实例化父类。在字节码中,成员变量进行显示初始化其实是在构造函数中的...原创 2018-12-05 11:21:10 · 20641 阅读 · 2 评论 -
Java static
1.我理解的static的作用就是把对象的东西变成类的东西2.因为static修饰的东西是类的东西所以在随着类的加载而加载3.在类的加载:加载——验证——准备——解析——初始化——使用——卸载这几步中,static修饰的变量在准备阶段会给默认值,然后再初始化阶段(注意是<client>,<client>初始化和<init>实例化要分清楚)给赋在代码中的值...原创 2018-12-04 17:08:09 · 144 阅读 · 0 评论 -
java中静态语句块、实例代码块、构造器方法这3者的调用顺序
1.1、在JVM类加载机制中,有讲到:将类加载到JVM当中后,才进行类的初始化。所谓初始化阶段,是指:根据程序员写的代码去初始化类变量和其他资源,这句话也可以这么说:初始化阶段是执行类构造器<clinit>()方法的过程。<clinit>()方法是编译器自动收集类中的所有类变量和静态语句块(static{})中的语句合并而成的。知道这一点很重要,而<clinit>...转载 2018-11-28 22:16:10 · 180 阅读 · 0 评论 -
java类初始化顺序
先不考虑父类。当创建类对象时,先初始化静态变量和静态块,然后是非静态变量和非静态代码块,然后是构造器。由于静态成员只会被初始化一次,所以如果静态成员已经被初始化过,将不会被再次初始化。1 class A { 2 A(int maker) { 3 System.out.println("A(" + maker + ")"); 4 } 5 } 6 ...原创 2018-11-28 17:54:43 · 129 阅读 · 0 评论 -
java 内存对方法的理解
以下针对引用数据类型: 在内存中,类是静态的概念,它存在于内存中的CodeSegment中。 当我们使用new关键字生成对象时,JVM根据类的代码,去堆内存中开辟一块控件,存放该对象,该对象拥有一些属性,拥有一些方法。但是同一个类的对象和对象之间并不是没有联系的,看下面的例子: class Student{ static String schoolName; Strin...原创 2018-11-28 17:28:01 · 211 阅读 · 3 评论 -
类的加载与初始化
类的加载加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的类的初始化什么情况下需要开始类加载过程的第一个阶段:"加载"。虚拟机规范中并没强行约束,这点可以交给虚拟机的的具体实现自由把握,但是对于初始化阶段虚拟机规范是严格规定了如下几种情况,如果类未初始化会对类进行初始化。创建类的实例 访问类的静态变量(除常量【被final修辞的静态变量】原因:常量一种特殊的变量,因为编译...原创 2018-11-28 17:04:43 · 1376 阅读 · 0 评论 -
理解Java内部类
内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类而心脏又在人体当中,正如同是内部类在外部内当中实例1:内部类的基本结构 1 2 3 4 ...原创 2017-10-18 15:24:46 · 159 阅读 · 0 评论