[源码]String StringBuffer StringBudlider(1String部分)

String

/** The value is used for character storage. */

private final char value[];

/** The offset is the first index of the storage that is used. */

private final int offset;  //第一个元素

/** The count is the number of characters in the String. */

private final int count;

/** Cache the hash code for the string */

private int hash; // Default to 0   哈希码

/** use serialVersionUID from JDK 1.0.2 for interoperability */

private static final long serialVersionUID = -6849794470754667710L;

这里有一个问题:为什么final的东西没有直接初始化但编译不报错?

只要在 对象 初始化OK之前给它赋值就行 。

你可以在  显示初始化—隐式初始化-初始化块初始化-构造器

任何一个地方给它初始化,编译就不会报错

说到String就不得不说一个事,叫做内存图解

内存管理

Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域:

  ◆寄存器:我们在程序中无法控制

  ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象)

  ◆堆:存放用new产生的数据

  ◆静态域:存放在对象中用static定义的静态成员

  ◆常量池:存放常量

◆非RAM存储:硬盘等永久存储空间

首先是 学基础的程序员们最常提到的三块地儿:  栈内存  堆内存   方法区

Stack栈内存

计算机中用来存放  非静态变量 的区域, Stack负责 你在创建非静态变量时,让 这个东西进栈 ,当 这个变量出了作用域 , Stack 再让它出栈。

静态变量 是保存在 方法区静态区域的。

Heap  堆内存

堆内存 里边可以开辟空间 分配对象,对象的首地址 赋值给 引用变量,这个就是Java里边的指针,这几乎是唯一一块受GC管理的地儿!

方法区

方法区里边 不仅放着方法而且放着静态变量。里边有这么几块区域比较重要:

方法区静态区域   方法区非静态区域   常量池

方法区静态/非静态区域  存的是什么大家可以看我的另一篇博文:

//网址

常量池的话自然存的是常量

比如说  int a= 10;  //编译器就会去常量池找 有没有10,如果之前用过就直接拿来,如果没用过就 在常量池创建 10这个东西

但是 要注意的是 String的对象 也可以是常量:

String st=”123”;  //这个就是String最特殊的地方

大家注意一下 String就这么两种表达方式:

这个地方最容易出的问题就是 ==  equals 的问题

== 与 equals方法 的区别

== 比较的是地址值

equals比较的也是地址值(更确切的说是hashCode),但是String里边重写了这个方法,比较的是具体内容的值

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
       char v1[] =        char v2[] = anotherString.       int i = offset;
       int j = anotherString.offset;
       while (n-- != 0) {   //直接比较的是每个字符
           if (v1[i++] != v2[j++])
           return false;
       }
       return true;
        }
    }
    return false;
    }

字符串拼接

学这块内容 大家务必搞清楚每一步 这些变量 常量 对象 在内存上的变化

                   String s1 = "hello";
                   String s2 = "world";
                   String s3 = "helloworld";
                   System.out.println(s3 == s1 + s2);   //false,s1+s2是一个新的String的地址的引用
                   s3.equals((s1 + s2));
                   System.out.println(s3 == "hello" + "world");//true,拼接起来的是常量池中找到的
                   s3.equals("hello" + "world");  

现在大家只要知道

凡是有变量参加的字符串拼接 拼出来的东西 一定是 new 出来的对象

若都是字符串常量的拼接 则还是直接去常量池找的常量

//这个东西我留着专门写个东西介绍什么叫做  编译期确定下来了

假如你这么写:

 

   String a = "ab";
  final String bb = "b";   /编译时已经放入常量池
  String b = "a" + bb;
  System.out.println((a == b)); //result = true

方法返回

  String a = "ab";
  final String bb = getBB();
  String b = "a" + bb;
  System.out.println((a == b)); //result = false
  private static String getBB() {  return "b";   }

这两个东西我放到编译期确定下来了这篇文章给大家分析一下

2016-10-21 更新

时间: 2024-10-10 16:16:01

[源码]String StringBuffer StringBudlider(1String部分)的相关文章

[源码]String StringBuffer StringBudlider(2)StringBuffer StringBuilder源码分析

纵骑横飞 章仕烜 昨天比较忙 今天把StringBuffer StringBulider的源码分析 献上 在讲 StringBuffer StringBuilder 之前 ,我们先看一下 它们共同的老祖宗 AbstractStringBuilder 这是 StringBuilder StringBuffer 的根基 再看看 这两个实现类 里边有什么 很显然,这两个东西什么都没写吧 我们看看 另一个门派的 String 看出 为什么 我们说String 对象是不可变的 StringBuilder

JDK源码-String

1,字符串,String类. -1,字符串是常量,他们的值在创建后不能更改.字符串缓冲区支持可变的字符串. -2,String重载了Java中的+操作. -3,String对象是不可变的,你可以给一个String对象加任意多的别名.因为String对象具有只读特性,所以指向他的任何引用都不能改变它的值. 2,String类的成员变量 -1,value 存储字符串的char数组. private final char value[]; -2,offset:存储使用的首元素index. /** Th

StringBuffer源码解析

在重写ArrayList的toString方法时,查看了StringBuffer的源码. //new StringBuffer("[");构造方法public StringBuffer(String str) { super(str.length() + 16); append(str);}//super(str.length() + 16);调用父类构造AbstractStringBuilder(int capacity) { //初始化value数组 char[] value;le

String stringbuffer StringBuilder

最近指导几位新人,学习了一下String,StringBuffer和StringBuilder类,从反馈的结果来看,总体感觉学习的深度不够,没有读出东西.其实,JDK的源码是越读越有味的.下面总结一下我读这些源码的收获吧.注意:虽然源码的版本是JDK6,但是个人觉得学习这个版本的源码对于理解数据结构非常有帮助,因为String就是一个数据结构,它是char []的封装,实现了很多对char []的操作 第一部分:String源码解析 (1)String实现了CharSequence接口,这个接口

【String,StringBuffer和StringBuilder区别】

在实际java开发中,我们会经常使用到字符串连接的操作,以前我习惯喜欢用String的'+'来操作,觉得非常方便好用,最近认真学习了String,StringBuffer和StringBuilder这三个类,才发现使用String来连接字符串,代码性能会很低.下面我们就字符串连接来分析这三种方式. 1.String 打开String的源码,如图所示 会发现存储字符串的字符数值是final常量.再看String的构造方法,发现String的value值在构造方法就确定了值.这里有必要说明下关键字f

【C#】WinForm 之 DOTA2英雄搭配助手(网页抓取+在线绿色版+源码开放)

睡不着,无聊......再整理点好玩的出来.先上图 效果 碎碎念 自从13级后打出DOTA2的天梯积分以来简直是逆水行舟不进则退啊,室友已经高呼着被游戏玩了!!结果怒删游戏 其实我也发现这游戏不合适我玩…天梯里场场被各种选英雄针对,普通场又是剑圣.斧王横行.加之本人比较懒,不爱看视频,场均10死那是常有的事(打起来跟打WOW战场一样,反正死了有复活:P) 不瞎扯了,其实初衷就是不想被针对(想选个最脏阵容神马的我会告诉你嘛) 核心功能 这里要从Dotamax(http://dotamax.com/

C# 取得网址源码

HttpWebRequest wwb = (HttpWebRequest)WebRequest.Create(url); wwb.UserAgent = "Mozilla/5.0";//用户代理:与浏览器相关:没有的话,可能会导致GetResponse() wwb.ContentType = "text/html; charset=UTF-8"; wwb.Method = "GET"; WebResponse wwebRes = null;//

dubbo源码分析01:SPI机制

一.什么是SPI SPI全称为Service Provider Interface,是一种服务发现机制,其本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件.这样可以在运行时,动态为该接口替换实现类. JDK提供了默认的SPI实现,但是Dubbo并未使用JDK提供的SPI,而是自己封装了一套.我们先来通过Dubbo官网给的两个例子简单了解下JDK和Dubbo的SPI是如何使用的. 1.1.JDK SPI示例 首先定义一个接口以及它的两个实现类 1 public interfac

JDK源码之String、StringBuffer、StringBuilder

就String而言,平时工作中用得最多,但是很多时候还是用不好,有必要对他进行整体的分析下.如果看过Thinking in java,再看下JDK的源码,很多东西就会变得十分明了.现在对String的底层实现进行下分析. 首先是对构造函数而言,我工作中最常用到的可能就是new String(str)这个构造函数了,所以再在此关注这一个.这个构造函数是对传进来的String进行解析,将其放进一个数组当中,我们设定为arrayOfChar,String类定义了全局变量offset(偏移量),coun