学习JDK源码(一):String】的更多相关文章

一 概述 String由final修饰,是不可变类,即String对象也是不可变对象.这意味着当修改一个String对象的内容时,JVM不会改变原来的对象,而是生成一个新的String对象 主要考虑以下原因: 为了实现字符串池(提升效率) 只有当字符串是不可变的,字符串池才有可能实现.字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串.但如果字符串是可变的,那么String interning将不能实现,因为这样的话,如果变量改变了它的值,那么其它指向这…
前言 JDK源码解析系列文章,都是基于JDK8分析的,虽然JDK15马上要出来了,但是JDK8我还不会,我... 类图 实现了RandomAccess接口,可以随机访问 实现了Cloneable接口,可以克隆 实现了Serializable接口,可以序列化.反序列化 实现了List接口,是List的实现类之一 实现了Collection接口,是Java Collections Framework成员之一 实现了Iterable接口,可以使用for-each迭代 属性 // 序列化版本UID pr…
用了好久的Java了,从来没有看过jdk的源码,趁着今天有点时间,拿出了jdk的源码看了下,今天先看了关于String的,毕竟开发中String类型使用最广泛.在我们下载安装jdk的时候,部分源码也已经同时存放在我们电脑里了,具体路径为jdk目录下的src.zip压缩包,解压即可. java.lang.String 1 public final class String 2 implements java.io.Serializable, Comparable<String>, CharSeq…
最近没有好好保持学习的好习惯,该打. 天天忙,感觉都不知道在干嘛.真的厌倦了普通的Java代码,还是想学点新技术. 用了这么久的Java,最常用的数据类型肯定是Int了,而他的包装类Integer用的其实也不少.但是问问我们自己,当我们创建一个数字对象时,你们是直接new int x =1的多吧,或者说用new Integer(1),其实这样写的已经就很少了,我就没怎么这么写过.直到最近,我才知道一个能提升性能的方法Integer.valueOf(1),他可以使用系统缓存,既能减少可能的内存占用…
String类的理解 简记录一下对于jdk的学习,做一下记录,会持续补充,不断学习,加油 1.String的hash值的计算方法. hash值的计算方法多种多样,jdk中String的计算方法如下,比较简单,由字符串中的字符的ASCII值计算出来. /** * Returns a hash code for this string. The hash code for a * <code>String</code> object is computed as * <block…
public final class String implements java.io.Serializable, Comparable<String>, CharSequence String被final修饰,表示String类不能被继承. String类实现了Serializable.Comparable.CharSequence接口. /** The value is used for character storage. 字符串是以字符数组的形式存储的*/ private final…
1.参数化类型的构造函数比较啰嗦 new HashMap<String, List<String>>() 如果你调用参数化类的构造函数,那么很不幸,你必须要指定类型参数,即便上下文中已明确了类型参数.这通常要求你连续两次提供类型参数: Map<String, List<String>> m = new HashMap<String, List<String>>(); 而 假设HashMap提供了如下静态工厂: public stati…
编程习惯 1.用工厂方法替代构造函数 Boolean.valueOf() 通过一个boolean简单类型,构造Boolean对象引用. 优点:无需每次被调用时都创建一个新对象.同时使得类可以严格控制在哪个时刻有哪些实例存在  >>实例受控的类 public static Boolean valueOf(boolean b){ return b ? Boolean.TRUE : Boolean.FALSE; } 静态工厂方法Boolean.valueOf(String)几乎总是比构造函数Bool…
String类的申明 public final class String implements java.io.Serializable, Comparable<String>, CharSequence {…} String类用了final修饰符,表示它不可以被继承,同时还实现了三个接口, 实现Serializable接口表示String类可被序列化:实现Comparable<T> 接口主要是提供一个compareTo 方法用于比较String字符串:还实现了CharSequen…
(28) public boolean startsWith(String prefix, int toffset) { char ta[] = value; int to = toffset; char pa[] = prefix.value; int po = 0; int pc = prefix.value.length; // Note: toffset might be near -1>>>1. //如果起始地址小于0或者(起始地址+所比较对象长度)大于自身对象长度,返回假 i…
1.学习jdk源码,从以下几个方面入手: 类定义(继承,实现接口等) 全局变量 方法 内部类 2.hashCode private int hash; public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h;…
一 目标 记录学习jdk源码的一些笔记和心得,jdk版本使用11.0.1,工具idea Class后面序号为优先级1-4,优先级递减 目录转载自博客: https://blog.csdn.net/qq_21033663/article/details/79571506 二 目录 1.java.lang Object 1 String 1 AbstractStringBuilder 1 StringBuffer 1 & StringBuilder 1 Boolean 2 Byte 2 Double…
简介 大家好,我是彤哥,今天我想和大家再聊聊JDK源码的几个问题: 为什么要看JDK源码 JDK源码的阅读顺序 JDK源码的阅读方法 为什么要看JDK源码 一,JDK源码是其它所有源码的基础,看懂了JDK源码再看其它的源码会达到事半功倍的效果. 二,JDK源码中包含大量的数据结构知识,是学习数据结构很好的资料,比如,链表.队列.散列表.红黑树.跳表.桶.堆.双端队列等. 三.JDK源码中包含大量的设计模式,是学习设计模式很好的资料,比如,适配器模式.模板方法模式.装饰器模式.迭代器模式.代理模式…
JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JDK源码的时候,有粗略的思考过,今天下班后又把<Thinking in Java>中关于final的内容重新看了一遍,对此写下一些关于自己的理解和想法. String类中final关键字的使用 final关键字,用来描述一块数据不能被改变,两种可能理由:设计.效率 final使用的三种情况:数据.方…
                     JDK源码学习系列03----StringBuffer+StringBuilder 由于前面学习了StringBuffer和StringBuilder的父类AbstractStringBuilder,他们俩的很多方法都是直接super了父类的,也为了较好的比较StringBuffer和StringBuilder,所以把二者放在同一博文中. 一.StringBuffer 1.静态类,不能被继承,实现了Serializable和CharSequence接口.…
 JDK源码学习系列02----AbstractStringBuilder 因为看StringBuffer 和 StringBuilder 的源码时发现两者都继承了AbstractStringBuilder,并且很多方法都是直接super的父类AbstractStringBuilder的方法,所以还是决定先看AbstractStringBuilder的源码,然后再看StringBuffer 和 StringBuilder. 1.成员变量 AbstractStringBuilder和String一…
                                                 JDK源码学习系列01----String 写在最前面: 这是我JDK源码学习系列的第一篇博文,我知道源码学习这条路很难坚持,但是我始终相信,不积跬步无以至千里.当然啦,兴趣和方法可以让这条路变得很是happy.初步计划是每天早上晨会前看一个类的源码,因为还在实习初期,所以任务不是那么滴繁重,更何况,时间就像那个,挤挤总是有的嘛~~晚上回来写写博文,一是加深理解二来也加深记忆方便以后查阅.学习的步骤…
一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private final int value;// fianl private static final long serialVersionUID = 1360826667806852920L; // 值为 (-(2的31次方)) 的常量,它表示 int 类型能够表示的最小值. public static final int…
                                         JDK源码学习系列05----LinkedList 1.LinkedList简介 LinkedList是基于双向链表实现的,它也可以被当作堆栈.队列或双端队列进行操作. public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, jav…
                                                                         JDK源码学习系列04----ArrayList 1.ArrayList简介 ArrayList是基于Object[] 数组的,也就是我们常说的动态数组.它能很方便的实现数组的增加删除等操作. public class ArrayList<E> extends AbstractList<E> implements List<E>…
dir 参考文档 JDK源码分析(1)之 String 相关…
这是看过的第一个jdk源码(从立下目标以来):TreeMap.说实话断断续续的看了有好几天了,我觉得我犯了一个错误,就像一开始说的那样,我打算完完全全看懂TreeMap关于红黑树的实现方式,后来我想了想,相对于花费这个对我的收益并不是特别大,而且看的过程中也有很多困惑,虽然我知道它每一步在做什么,但是我还不知道为什么要这么做,经过权衡,我决定先暂时放下TreeMap中关于对红黑树具体的实现,暂且记下有这回事. 一.简单理解 最近也在看数据结构和算法,对红黑树也有了大致的理解,TreeMap是对红…
HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序. LinkedHashMap保证了元素迭代的顺序.该迭代顺序可以是插入顺序或者是访问顺序.通过维护一个双向链表实现. 需要在理解HashMap实现原理的基础上学习LinkedHashMap,JDK源码学习笔记——HashMap 一.数据结构 实际上就是在HashMap的基础上加了LinkedList (图片来自Java集合之LinkedHashMap) LinkedHashMap.Entry继承了H…
一.源码解析 public class Object { /** * 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用 */ private static native void registerNatives(); /** * 对象初始化时自动调用此方法 */ static { registerNatives(); } /** * 返回此Object的运行时类 */ public final native Class<?> getClass(); /** * hashC…
咱们今天也来说说定时器Timer Timer是什么? Timer  n. [电子] 定时器:计时器:计时员 从翻译来看,我们可以知道Timer的本意是,定时定点. 而JDK中Timer类也的确是这个本意.那么接下来,我们通过JDK中的源码来学习下Timer这个类. private final TaskQueue queue = new TaskQueue(); private final TimerThread thread = new TimerThread(queue); Timer中有这样…
前言: 在我们还没学习框架之前,肯定都学过JDBC.百度百科对JDBC是这样介绍的[JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名.]通过JDBC我们可以完成Java对关系型数据库的SQL操作.下面我们介绍的这种模式是J…
一点一点看JDK源码(〇) liuyuhang原创,未经允许进制转载 写在前面: 几乎所有的大神都会强调看源码,也强调源码的重要性: 但是如何看源码,源码看什么?看了什么用?看了怎么用? 困扰很多人,尤其是初学者. 本系列的目的在于看源码,并非学习和总结源码,先能够粗略的浏览大量的原码 并保证知晓有这么个东西,有个基本概念,再对其中的设计原理,优化方案进行学习 本文简单的回答以下几个问题: 1.为什么要看源码? 2.什么时候或什么条件下看源码? 3.看源码看什么? 4.看源码有什么用? 5.源码…
JDK源码阅读笔记: https://github.com/kangjianwei/LearningJDK 如何阅读源码,是每个程序员需要面临的一项挑战. 为什么需要阅读源码?从实用性的角度来看,主要有三个目的:第一,解决手头的新问题或者新需求:第二,真正理解一部分理论的落地实现:第三,应对面试. 端正心态 在准备投身到阅读源码的事业之前,首先需要端正一下心态: 阅读源码是一场持久战,浅尝辄止的话,顶多能写几篇水文,吸点粉糊弄下新手,对自身实力的提高没有显著作用. 阅读源码是锦上添花,不是雪中送…
如何学习spring源码 前言 本文属于spring源码解析的系列文章之一,文章主要是介绍如何学习spring的源码,希望能够最大限度的帮助到有需要的人.文章总体难度不大,但比较繁重,学习时一定要耐住性子坚持下去. 获取源码 源码的获取有多种途径 GitHub spring-framework spring-wiki 可以从GitHub上获取源代码,然后自行编译 maven 使用过maven的都知道可以通过maven下载相关的源代码和相关文档,简单方便. 这里推荐通过maven的方式构建一个we…
阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃<Core Java>,那样是很难有收获的,尤其是<深入Java虚拟机>这类书,或许别人觉得好,但是未必适合现在的你. 比如设计模式,许多Java源码当中都会涉及到.再比如阅读Spring源码的时候,势必要先对IOC,AOP,Java动态代理等知识点有所了解. 2.强烈的求知欲 强烈的求知欲是阅读源码的核心动力! 大多数程序…