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里边重写了这个方法,比较的是具体内容的值
 
  1. public boolean equals(Object anObject) {
  2. if (this == anObject) {
  3. return true;
  4. }
  5. if (anObject instanceof String) {
  6. String anotherString = (String)anObject;
  7. int n = count;
  8. if (n == anotherString.count) {
  9. char v1[] = char v2[] = anotherString. int i = offset;
  10. int j = anotherString.offset;
  11. while (n-- != 0) { //直接比较的是每个字符
  12. if (v1[i++] != v2[j++])
  13. return false;
  14. }
  15. return true;
  16. }
  17. }
  18. return false;
  19. }
   
字符串拼接
 
   学这块内容 大家务必搞清楚每一步 这些变量 常量 对象 在内存上的变化
 

  1. String s1 = "hello";
  2. String s2 = "world";
  3. String s3 = "helloworld";
  4. System.out.println(s3 == s1 + s2); //false,s1+s2是一个新的String的地址的引用
  5. s3.equals((s1 + s2));
  6. System.out.println(s3 == "hello" + "world");//true,拼接起来的是常量池中找到的
  7. s3.equals("hello" + "world");
 
     
 
       现在大家只要知道
           凡是有变量参加的字符串拼接 拼出来的东西 一定是 new 出来的对象
           若都是字符串常量的拼接 则还是直接去常量池找的常量
 
//这个东西我留着专门写个东西介绍什么叫做  编译期确定下来了
 
 
假如你这么写:
 

  1.  String a = "ab";
  2.   final String bb = "b"; /编译时已经放入常量池
  3.   String b = "a" + bb;
  4.   System.out.println((a == b)); //result = true
 
 
方法返回
 
  1.   String a = "ab";
  2.   final String bb = getBB();
  3.   String b = "a" + bb;
  4.   System.out.println((a == b)); //result = false
  5.   private static String getBB() { return "b"; }
 
 
这两个东西我放到编译期确定下来了这篇文章给大家分析一下
                                                        2016-10-21 更新
 
 
 

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

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

      纵骑横飞 章仕烜   昨天比较忙 今天把StringBuffer StringBulider的源码分析 献上   在讲 StringBuffer StringBuilder 之前 ,我们先看一下 ...

  2. [源码分析]StringBuffer

    [源码分析]StringBuffer StringBuffer是继承自AbstractStringBuilder的. 这里附上另外两篇文章的连接: AbstractStringBuilder : ht ...

  3. Java基础(八)--String(源码)、StringBuffer、StringBuilder

    String源码:基于jdk1.8 public final class String implements Serializable, Comparable<String>, CharS ...

  4. JDK源码之StringBuffer与StringBuilder类分析

    一 概述 StringBuffer类被 final 所修饰,不能被继承,StringBuffer继承了AbstractStringBuilder类, 是一个可变的字符序列,并且类中方法都有synchr ...

  5. Java源码——String

    最近在研究java的源代码,但是由于自己英语水平有限,所以想使用中文注释的方式把源码里的方法全部重写 一遍,下面是楼主整理出来的一小部分.我把整体的项目托管到GitHub上了,欢迎大家前去交流学习. ...

  6. JDK源码阅读--StringBuffer

    public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharS ...

  7. 浅谈 Java 字符串(String, StringBuffer, StringBuilder)

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...

  8. String,StringBuffer和StringBuilder源码解析[基于JDK6]

    最近指导几位新人,学习了一下String,StringBuffer和StringBuilder类,从反馈的结果来看,总体感觉学习的深度不够,没有读出东西.其实,JDK的源码是越读越有味的.下面总结一下 ...

  9. String,StringBuffer,StringBuilder的区别及其源码分析

    String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...

随机推荐

  1. OpenGL的学习资源

    OpenGL是3D图形接口工业标准,使用上非常简单,所有API不过上百个函数,但理解OpenGL就没那么简单,本文总结OpenGL的学习资源,包括官方资料.网上教程.示例程序等. Wikipedia: ...

  2. EntityFramework 优化

    1.分页的时候,尽量在数据库里面去分页. //在数据库中分页 ).Take().ToList(); //先把数据从数据库中查出来,然后才分页 ).Take(); 2.尽量禁用延迟加载,尽量使用预加载和 ...

  3. 新冲刺Sprint3(第七天)

    一.Sprint介绍 商家功能模块持续更新着...... 二.Sprint周期 看板: 燃尽图:

  4. linux软连接和硬链接

    1.软连接(符号连接)创建方法(相当于windows的快捷方式) # ln -s 原文件 连接文件(最好使用绝对路径) 特点: 1.软连接文件是777的权限,而且很小很小: 2.可以跨分区(文件系统) ...

  5. OS实验报告——作业调度模拟程序

    一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行, ...

  6. 【jq】c#零基础学习之路(1)Hello World!

    从今天起我会持续发表,这个就是一个日记型的,学习编程是枯燥的,况且我们还是零基础. 学前准备 1.编译环境 vs2010.vs2012.vs2015...(本人用的是vs2010旗舰版).vs2010 ...

  7. LEETCODE —— Binary Tree的3 题 —— 3种非Recursive遍历

    Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...

  8. Torch 7 load saved model failed, 加载保存的模型失败

    Torch 7 load saved model failed, 加载保存的模型失败: 可以尝试下面的解决方案:  

  9. 10天学会phpWeChat——第二天:hello world!我的第一个功能模块

    今天我们开始进入<10天学会phpWeChat>系列教程的第二天:创建我的第一个hello world! 功能模块. 1.登录后台,进入 系统设置--自定义模块,如图: 自定义模块参数说明 ...

  10. CSS 选择器(转)

    原文转自:http://www.cnblogs.com/xyzhanjiang/p/5447406.html CSS 选择器除了样式表匹配元素时需要用到,在使用 jQuery 等库的时候也可以利用 C ...