Java源码赏析(一)Object 类】的更多相关文章

一.Object类概述   Object类是java中类层次的根,是所有类的基类.在编译时会自动导入.Object中的方法如下: 二.方法详解   Object的方法可以分成两类,一类是被关键字final修饰的的方法,这类方法能被子类覆盖.另一类是没有final修饰,它们可以被子类重写. 构造方法:Object()   在Object中没有显式的构造方法,这个只是创建一个Object对象,没有什么可以说的. getClass()   getClass被final修饰,不能被子类重写.它返回的是正…
在 Java源码赏析(三)初识 String 类   中,我们已经大概理解了String的接口,接下来我们描述一下String的常用工具方法. /** * 为了精简的String结构,之前提到的方法省略,重点介绍剩余的方法(省略构造方法.indexOf.lastIndexOf.valueOf) */ public final class String implements java.io.Serializable, Comparable<String>, CharSequence { priv…
由于String类比较复杂,现在采用多篇幅来讲述 这一期主要从String使用的关键字,实现的接口,属性以及覆盖的方法入手.省略了大部分的字符串操作,比如split().trim().replace().contains().matches()等. 在Java源码赏析(五)中,会增加对String类中的字符串操作进行详细描述,敬请期待. 今后,还会介绍StringBuffer.StringBuilder两个类. /** * 精简的String结构,便于我们初步的理解, 省略了大部分构造方法和字符…
目的 Class 类是每一个程序员都必须了解的,也是使用反射机制的基础. 这篇文章将Class 类的公共方法大致介绍了一遍(省略了安全.枚举.断言.注解相关代码). 代码 package java.lang; //省略 import /** * 类的实例:正在运行的Java应用中的类/接口 */ public final class Class<T> implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElem…
LinkedList<E> 源码解读 继承AbstractSequentialList<E> 实现List<E>, Deque<E>, Cloneable, Serializable接口 方法说明 private void linkFirst(E e) 功能:将新元素添加至链表的头. 过程:如果头为空,头尾结点共同指向新结点,反之,把新结点插入到原头结点前. void linkLast(E e) 功能:将新元素添加至链表的尾. 过程:如果尾为空,头尾结点共同…
被人鄙视了,于是也来读读源码... package java.lang; /** * The Void class is an uninstantiable placeholder class to hold a * reference to the Class object representing the Java keyword * void. * * @author unascribed * @version %I%, %G% * @since JDK1.1 */ public fina…
上一节主要介绍了String类的一些构造方法,主要分为四类 无参构造器:String(),创建一个空字符串"",区别于null字符串,""已经初始化,null并未初始化 副本构造器:String(String s),简单的赋值,得到的是一个副本,俩个引用指向的是常量池中的同一个String,但是String是不可变的,所有用意不大 byte类构造器:String(byte[] b),将byte数组转换为String,注意并不是简单的赋值,而是整体copy一份 cha…
String是我们接触最多的类,无论是学习中还是工作中,基本每天都会和字符串打交道,从字符串本身的各种拼接.切片.变形,再到和其他基本数据类型的转换,几乎无时无刻都在使用它,今天就让我们揭开String神秘的面纱,这一小节主要讲解String的源代码是怎么构建的,下一节是String的一些疑点难点,通常在面试中会被问到. 在学习String之前,让我们先简单的看一下JVM的内存模型,附图一张,来自百度百科: 在java的每一个通过编译生成字节码文件后,运行期JVM将字节码文件(也就是class文…
元注解 @Target :标识注解的目标,默认为所有 ElementType.TYPE(用于类) ElementType.FIELD(用于域,包括enum) ElementType.METHOD(用于方法) ElementType.PARAMETER(用于正式参数) ElementType.CONSTRUCTOR(类型构造方法) ElementType.LOCAL_VARIABLE(用于本地变量) ElementType.ANNOTATION_TYPE(用于注解) ElementType.PAC…
写这个系列的原因,其实网上已经有无数源码分析的文章了,多一篇不多,少一篇不少,但为什么还要写这部分文章呢?于私,其一,上班族已经很久没有打过完整的一整段有意义的话,算是锻炼个人的书写.总结能力,其二,别人的代码永远是别人的,只有亲自做过才知道其中的滋味,其三,若干年后如果博客园还在,也算是一段美好的回忆.于公,网上有大部分的文章属于copy,虽然copy没问题,但是看多了会觉得千篇一律,而且少了很多技术细节,我打算写得详细一点,啰嗦一点,如果能让刚刚入门Java的同学有所收获,那就心满意足了.首…
上一节我们主要讲了String类的一些不是很常用的方法,其中需要掌握的如下,我就不再赘述了 public int length() public boolean isEmpty() public byte[] getBytes() public byte[] getBytes(String charsetName) public char charAt(int index) public boolean equals(Object anObject) public boolean equalsI…
Object 1. @HotSpotIntrinsicCandidate @HotSpotIntrinsicCandidate public final native Class<?> getClass(); 使用@HotSpotIntrinsicCandidate注解标注的方法,表示JVM可能为该方法提供了一些基于CPU指令的高效实现,而非使用Java的实现. 2. native方法 getClass().hashCode().clone().notify()等方法的默认实现都是native…
HashTable这个类实现了哈希表从key映射到value的数据结构形式.任何非null的对象都可以作为key或者value. 要在hashtable中存储和检索对象,作为key的对象必须实现hashCode.equals方法. 一般来说,默认的加载因子(0.75)提供了一种对于空间.时间消耗比较好的权衡策略.太高的值(指加载因子loadFactor)虽然减少了空间开销但是增加了检索时间,这反应在对hashtable的很多操作中,比如get.put方法. 初始容量的控制也是在空间消耗和reha…
/* * 切片函数,非常重要,这里一定要牢记beginIndex是开始位置,endIndex是结束位置,区别于以前学的offset是开始位置,而count或length是个数和长度 * 比如说,new String("abcdefg",1,3)得到的是bcd * 而 "abcdefg".substring(1,3)得到的是bc,也就是下标为1和2的俩个字符,并不包括c */ public String substring(int beginIndex) { if (…
一.Comparable接口 package java.lang; import java.util.*; public interface Comparable<T> { /** * int x = a.compareTo(b) * a > b, x > 0 * a == b, x = 0 * a < b, x < 0 */ public int compareTo(T o); } 该接口主要用于排序 二.Serializable 与 Externalizable 接…
/* * 返回指定字符第一次出现的字符串内的索引 */ public int indexOf(int ch) { return indexOf(ch, 0); } /* * 返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索 * 其中Character.MIN_SUPPLEMENTARY_CODE_POINT是指字符是小于两个字节的 */ public int indexOf(int ch, int fromIndex) { final int max = value.length;…
在大致了解了String之后,可能有的读者发现了,我们并没有谈到CharSequence接口. 原因是在这一节,CharSequence要和StringBuilder(Java1.5).StringBuffer(Java1.0)一起讨论. package java.lang; import java.util.NoSuchElementException; import java.util.PrimitiveIterator; import java.util.Spliterator; impo…
看来断点.单步调试还不够硬核,根本没多少人看,这次再来个硬核的.依然是由于apaas平台越来越流行了,如果apaas平台选择了java语言作为平台内的业务代码,那么不仅仅面临着IDE外的断点.单步调试,还面临着为了实现预览效果,需要将写好的java源码动态的装载到spring容器中然后调用源码内的某个方法.这篇文章主要就是实现spring/springboot运行时将源码先编译成class字节码数组,然后字节码数组再经过自定义类加载器变成Class对象,接着Class对象注册到spring容器成…
Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术的3.2.1节) 如果两个Random实例使用相同的种子,并且调用同样的函数,那么生成的sequence是相同的 也可以调用Math.random()生成随机数 Random实例是线程安全的,但是并发使用Random实例会影响效率,可以考虑使用ThreadLocalRandom变量. Random实…
HashMap作为常用的一种数据结构,阅读源码去了解其底层的实现是十分有必要的.在这里也分享自己阅读源码遇到的困难以及自己的思考. HashMap的源码介绍已经有许许多多的博客,这里只记录了一些我看源码过程中的疑问,一些基础知识不再讲解. 一:Hash值的来源和使用 public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } static final int hash(Object key…
本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable 可以看到TreeSet是继承自AbstracSet同时实现了NavigableSet,Cloneable,Serializable三个接口,其中Cloneable,Seri…
一.源码解析 public class Object { /** * 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用 */ private static native void registerNatives(); /** * 对象初始化时自动调用此方法 */ static { registerNatives(); } /** * 返回此Object的运行时类 */ public final native Class<?> getClass(); /** * hashC…
一.类继承关系 ArrayDeque和LinkedList一样都实现了双端队列Deque接口,但它们内部的数据结构和使用方法却不一样.根据该类的源码注释翻译可知: ArrayDeque实现了Deque是一个动态数组. ArrayDeque没有容量限制,容量会在使用时按需扩展. ArrayDeque不是线程安全的,前面一篇文章介绍Queue时提到的Java原生实现的 Stack是线程安全的,所以它的性能比Stack好. 禁止空元素. ArrayDeque当作为栈使用时比Stack快,当作为队列使用…
我们在spring 事务源码赏析(一) 中分析了spring事务是如何找到目标方法,并如何将事务的逻辑织入到我们的业务逻辑中.本篇我们将会看到spring事务的核心实现: 1.事务传播机制的实现 2.事务隔离级别的实现 3.事务的回滚提交等操作的实现 好了,废话不多说,接着上一篇,我们讲到了TransactionInterceptor这个切面的逻辑,先看一下类图: 简单介绍一下这个类图: Advice是一个切面的最顶层接口,是一个空接口,用于表示这是一个切面,integrceptor接口也是一个…
在本系列中,我们会分析:1.spring是如何开启事务的.2.spring是如何在不影响业务代码的情况下织入事务逻辑的.3.spirng事务是如何找到相应的的业务代码的.4.spring事务的传播行为是如何实现的.5.spring的事务隔离级别是如何实现的 因篇幅原因,本系列会分为两部分,第一部分会介绍前3个的实现,第二部分会介绍后两个的实现. 我们知道spring的事务管理分为两大部分:声明式和编程式,两种方式均为我们提供便捷的事务管理方法,各自优劣. 声明式的事务管理对业务代码基本0入侵,能…
[String 是如何实现的?它有哪些重要的方法?] String 内部实际存储结构为 char 数组,源码如下: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // 用于存储字符串的值 private final char value[]; // 缓存字符串的 hash code private int hash; // Default to 0 //…
​ “365篇原创计划”第十一篇.   今天呢!灯塔君跟大家讲:   JVM源码分析之Object.wait/notify实现       最简单的东西,往往包含了最复杂的实现,因为需要为上层的存在提供一个稳定的基础,Object作为java中所有对象的基类,其存在的价值不言而喻,其中wait和notify方法的实现多线程协作提供了保证. public class WaitNotifyCase { public static void main(String[] args) { final Ob…
1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this fil…
本文基于 OracleJDK 11, HotSpot 虚拟机. CharSequence 定义 CharSequence 是 java.lang 包下的一个接口,是 char 值的可读序列, 即其本身描述的就是字符串.因此我们可以直接使用如下: CharSequence cs1 = "朝雾轻寒"; // 默认实现为 String CharSequence cs2 = new StringBuilder("朝雾轻寒"); CharSequence cs3 = new…
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心.   说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃<Core Java>,你是很难从中吸收到营养的,特别是<深入Java虚拟机>这类书,别人觉得好,未必适合现在的你. 虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读它.我文中会专门谈到这个,暂时不展开.…