JDK源码学习--String篇(三) 存储篇】的更多相关文章

JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JDK源码的时候,有粗略的思考过,今天下班后又把<Thinking in Java>中关于final的内容重新看了一遍,对此写下一些关于自己的理解和想法. String类中final关键字的使用 final关键字,用来描述一块数据不能被改变,两种可能理由:设计.效率 final使用的三种情况:数据.方…
在进一步解读String类时,先了解下内存分配和数据存储的. 数据存储 1.寄存器:最快的存储区,位于处理器的内部.由于寄存器的数量有限,所以寄存器是按需分配. 2.堆栈:位于RAM中,但是通过堆栈指针可以从处理器哪里获得直接支持.堆栈指针向下移动,则分配新的内存:堆栈指针向上移动释放内存. 注:堆栈中存储基本的数据类型和[对象引用],但是Java对象存储在堆中. 3.堆:通用内存池,位于RAM中,用于存放所有的Java对象. 注:堆中存储的 new创建的对象和数组. 4.常量存储:存放常量.…
工作三年了,用了三年的JAVA,突然发现竟然没有好好的看下JDK的源码,整天用着的String,只是大概知道怎么回事,其中的实现逻辑却是一头雾水. 知耻而后勇,加油!!! java.lang.String public final class String implements java.io.Serializable, Comparable<String>, CharSequence { } String不属于基本的数据类型,由于是final类型不能被继承,可以序列化. /** The va…
StringBuilder和StringBuffer 前面讲到String是不可变的,如果需要可变的字符串将如何使用和操作呢?JAVA提供了连个操作可变字符串的类,StringBuilder和StringBuffer,从源码中可以看到这两个类都是采用final修饰,并且继承抽象类AbstractStringBuilder的. abstract class AbstractStringBuilder implements Appendable, CharSequence { /** * The v…
一.类定义 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源码学习系列03----StringBuffer+StringBuilder 由于前面学习了StringBuffer和StringBuilder的父类AbstractStringBuilder,他们俩的很多方法都是直接super了父类的,也为了较好的比较StringBuffer和StringBuilder,所以把二者放在同一博文中. 一.StringBuffer 1.静态类,不能被继承,实现了Serializable和CharSequence接口.…
                                                 JDK源码学习系列01----String 写在最前面: 这是我JDK源码学习系列的第一篇博文,我知道源码学习这条路很难坚持,但是我始终相信,不积跬步无以至千里.当然啦,兴趣和方法可以让这条路变得很是happy.初步计划是每天早上晨会前看一个类的源码,因为还在实习初期,所以任务不是那么滴繁重,更何况,时间就像那个,挤挤总是有的嘛~~晚上回来写写博文,一是加深理解二来也加深记忆方便以后查阅.学习的步骤…
JDK1.8源码学习-String 目录 一.String简介 String类是Java中最常用的类之一,所有字符串的字面量都是String类的实例,字符串是常量,在定义之后不能被改变. 二.定义 public final class String implements java.io.Serializable, Comparable<String>, CharSequence{} 1.String类是由final修饰的,表明String类不能被继承,并且String类中的成员方法都默认是fi…
 JDK源码学习系列02----AbstractStringBuilder 因为看StringBuffer 和 StringBuilder 的源码时发现两者都继承了AbstractStringBuilder,并且很多方法都是直接super的父类AbstractStringBuilder的方法,所以还是决定先看AbstractStringBuilder的源码,然后再看StringBuffer 和 StringBuilder. 1.成员变量 AbstractStringBuilder和String一…
HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序. LinkedHashMap保证了元素迭代的顺序.该迭代顺序可以是插入顺序或者是访问顺序.通过维护一个双向链表实现. 需要在理解HashMap实现原理的基础上学习LinkedHashMap,JDK源码学习笔记——HashMap 一.数据结构 实际上就是在HashMap的基础上加了LinkedList (图片来自Java集合之LinkedHashMap) LinkedHashMap.Entry继承了H…
                                         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>…
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;…
写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Document对象,处理完profile后终于到了标签的解析,这篇文章主要来探究Spring默认标签的解析. 1.4 BeanDefinition的创建 - 处理Spring默认标签 protected void parseBeanDefinitions(Element root, BeanDefiniti…
Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法. 类定义 public final class Integer extends Number implements Comparable<Integer> 从类定义中我们可以知道以下几点: 1.Integer类不能被继承 2.Integer类…
一 概述 String由final修饰,是不可变类,即String对象也是不可变对象.这意味着当修改一个String对象的内容时,JVM不会改变原来的对象,而是生成一个新的String对象 主要考虑以下原因: 为了实现字符串池(提升效率) 只有当字符串是不可变的,字符串池才有可能实现.字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串.但如果字符串是可变的,那么String interning将不能实现,因为这样的话,如果变量改变了它的值,那么其它指向这…
一.为什么使用枚举 什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数.一年四季等.或者是在我们编译前就知道其包含的所有值的集合. 利用 public final static 完全可以实现的功能,为什么要使用枚举? public class Season { public static final int SPRING = 1; public static final int SUMMER = 2; public static final int AUTUMN = 3; pub…
一.源码解析 public class Object { /** * 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用 */ private static native void registerNatives(); /** * 对象初始化时自动调用此方法 */ static { registerNatives(); } /** * 返回此Object的运行时类 */ public final native Class<?> getClass(); /** * hashC…
系列文章: 1.async-validator 源码学习(一):文档翻译 2.async-validator 源码学习笔记(二):目录结构 rule 主要实现的是校验规则,文件结构为下图: 一.rule 目录文件介绍 其中 index.d.ts 文件: declare const _default: { required: import("..").ExecuteRule; whitespace: import("..").ExecuteRule; type: im…
LinkedList是List接口的子类,它底层数据结构是双向循环链表.LinkedList还实现了Deque接口(double-end-queue双端队列,线性collection,支持在两端插入和移除元素).所以LinkedList既可以被当作双向链表,还可以当做栈.队列或双端队列进行操作.文章目录如下: 1.LinkedList的存储实现(jdk 1.7.0_51) 2.LinkedList的读取实现 3.LinkedList的性能分析 下面我们进入正题,开始学习LinkedList. L…
ArrayList是实现了List接口的动态数组.与java中的数组相比,它的容量能动态增长.ArrayList的三大特点: ① 底层采用数组结构 ② 有序 ③ 非同步 下面我们从ArrayList的增加元素.获取元素.删除元素三个方面来学习ArrayList. ArrayList添加元素 因为ArrayList是采用数组实现的,其源代码比较简单.首先我们来看ArrayList的add(E e).以下代码版本是jdk7. public boolean add(E e) { // 检查数组容量 e…
HashMap基于hash表的Map接口实现,它实现了Map接口中的所有操作.HashMap允许存储null键和null值.这是它与Hashtable的区别之一(另外一个区别是Hashtable是线程安全的).另外,HashMap中的键值对是无序的.下面,我们从HashMap的源代码来分析HashMap的实现,以下使用的是Jdk1.7.0_51. 一.HashMap的存储实现 HashMap底层采用的是数组和链表这两种数据结构.当我们把key-value对put到HashMap时,系统会根据ha…
从今天开始从源码去学习一些Java的常用数据结构,打好基础:) Arraylist源码阅读: jdk版本:1.8.0 首先看其构造方法: 构造方法一: 第一种支持初始化容量大小,其中声明一个对象数组,赋值给this.elementdata 构造方法二: 第二种无参构造函数,即不指定初始容量大小,则默认赋值this.elementdata为一个空的对象数组,但是由注释可以看到其无参构造实际上初始容量为10 在elementData的注释中也说了该变量是实际存储Arrylist数据的存储结构,任何空…
这篇文章记录一下hashmap的学习过程,文章并没有涉及hashmap整个源码,只学习一些重要部分,如有表述错误还请在评论区指出~ 1.基本概念 Hashmap采用key算hash映射到具体的value,因此查找效率为o(1),为防止hash冲突,在数组的基础上加入链表.红黑树,为无序非线程安全的存储结构 jdk1.8之前采用以下方式存储数据: 左边实际上就是一个数组,右边则是key值相同的元素放到同一个链表中(图片侵删) 但是这种数组加单链表也存在问题,即单链表长度过长时,搜索值将耗费时间复杂…
一.HashMap (1) 简介:java1.8版本之前HashMap的结构图如下: 数组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中.但这就存在一个问题:在一个链表中查找一个节点时,将会花费O(n)的查找时间,会有很大的性能损失,所以在JDK1.8后,当同一个hash值的节点数不小于8时,不再采用单链表形式存储,而是采用红黑树,结构图如下: HashMap在底层将key-value当成一个整体进行处理,这个整体就是一个No…
package com.emsn.crazyjdk.java.util; /** * “人”类,重写了equals和hashcode方法...,以id来区分不同的人,你懂的... * * @author emsn1026 * */ public class Person { /** * 身份id */ private String id; /** * 姓名 */ private String name; public String getId() { return id; } public vo…
Dubbo集群模块的目的是将集群Invokers构造一个透明的Invoker对象,其中包含了容错机制.负载均衡.目录服务(服务地址集合).路由机制等,为RPC层提供高可用.高并发.自动发现.可治理的SOA特性. 本文我们主要讨论以下八个问题: 一.集群模块的需求功能点有哪些? 二.集群模块的总体设计框架是什么样的? 三.Dubbo提供了哪些容错机制?如何实现的? 四.Dubbo提供了哪些负载均衡机制?如何实现的? 五.Dubbo目录服务是干什么的?提供了哪几种类型的目录服务? 六.Dubbo提供…
一.概述 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞. atomic包里的类基本都是使用Unsafe实现的包装类,在Atomic包里一共有12个类,四种原子更新方式,这里我们将对着四种方式进一步分析. 二.解析  1. 原子更新基本类型类 用于通过原子的方…
Java集合的学习先理清数据结构: 一.属性 //哈希桶,存放链表. 长度是2的N次方,或者初始化时为0. transient Node<K,V>[] table; //最大容量 2的30次方 static final int MAXIMUM_CAPACITY = 1 << 30; //默认的加载因子 static final float DEFAULT_LOAD_FACTOR = 0.75f; //加载因子,用于计算哈希表元素数量的阈值. threshold = 哈希桶.leng…
最近在扫描CodeDex时报了一个不能使用String.intern()的字符串来做锁对象的告警,对这个问题有疑问查了些资料,顺便学习一下String类的源码. 1.类定义 String 被final修饰,是叶子类,不能不继承.实现了Serializable,Comparable,CharSequence 接口 public final class String implements java.io.Serializable, Comparable<String>, CharSequence…