来自:http://www.cnblogs.com/kkgreen/archive/2011/08/24/2151450.html

0,new是创了两个对象,一个在堆,一个在常量池

1,变量+字符串=自动变成堆的

2,final变量+字符串=还是常量池

3,final  get()+字符串=堆空间变量

4,String a = new String("1") + new String("1"),产生了4个对象,一个“1”常量池,两个“1”堆空间,一个“11”堆空间,没有11常量池现在

5,string使用了一个private , 没有set方法,防止在外部改变,final放在在内部改变,在维护一个数组,保持它的不可变性

6,重写了hashCode函数,从hash值0开始,hash=31   *  hash  +  value[ i ],选31的原因,之所以选择31,是因为它是个奇素数,如果乘数是偶数,并且乘法溢出的话,信息就会丢失,因为与2相乘等价于移位运算。使用素数的好处并不是很明显,但是习惯上都使用素数来计算散列结果。31有个很好的特性,就是用移位和减法来代替乘法,可以得到更好的性能:31*i==(i<<5)-i。现在的VM可以自动完成这种优化。

7,equal方法分析,1,比较是不是同一个引用,2,是不是string对象,3,长度是否相同,4,一个个对比

8,compare方法,1,比较长度,2,一个个对比


包含了intern:https://blog.csdn.net/soonfly/article/details/70147205

文中有点理解不一样,就是java7用了intern不会产生新的常量,还是以前的

intern后相当把引用的地方放进string池,不改变原来对象

但已经有了这个string常量,再intern,两个是不一样的(是错误理解

对编译期的理解:之前强记住为什么是不相等的,原来编译期就为什么处理他们不相等,在都是字面量“aa”和”bb“的时候,编译器会优化到同一个块内存,但用了变量a,编译器就帮你创了新对象,自然内存不一样

string学习的更多相关文章

  1. Java的string学习笔记 与char数组和bufferstring的比较

    ---恢复内容开始--- 一直用的C 导致这种类望而生畏 现在终于鼓起勇气学习一下 首先学习string类型 String s1 = "AbCdEf"; String s2 = & ...

  2. Object&&String学习

    Object类 列表项 String类 常用方法 构造方法 public String() public String(byte[] bytes) public String(byte[]bytes, ...

  3. string 学习

    #include <string> 1.取当中某个字符 与传统一样 c[11]="0123456789"; c[1]=1; ps:好慢 .. 会不会GG... #inc ...

  4. String学习之-深入解析String#intern

    引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8 ...

  5. Java String 学习

    String, 首先,String有字面值常量的概念,这个字面值常量是在编译期确定下来的,类加载时直接存入常量池(注意,常量池是类的常量池,类与类之间隔离). 而运行时生成的字符串,是不在常量池中的. ...

  6. C++之string学习

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <list> #include <string& ...

  7. Java String学习笔记

    参照:https://www.jianshu.com/p/2f209af80f84 常量池: Java代码被编译成class文件时,会生成一个常量池(Constant pool)的数据结构,用以保存字 ...

  8. C++ STL String学习 (待续)

    头文件:<string> 字符串类初始化: string s1="aabbba"; s2=string("bbb"); string s3=stri ...

  9. Swift 4.0 字符串(String)学习

    定义字符串常量(常量只有读操作) let lString = "constant" let lString1: String = "constant" 定义字符 ...

随机推荐

  1. 20172305 2018-2019-1 《Java软件结构与数据结构》第五周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第五周学习总结 教材学习内容总结 本周内容主要为书第九章内容: 查找是在某个项目组中寻找到某一指定目标元素,或者确定 ...

  2. [参考]用递归的方法获取 字符 对应的 二进制字符串 (C/C++)

    将字符转换为16进制字符串.十进制字符串可以参考这里:https://www.cnblogs.com/stxs/p/8846545.html 代码及调试结果 举例:字符'a',查ASCII码表它对应的 ...

  3. Python学习札记(二十三) 函数式编程4 sorted

    参考:sorted NOTE 1.sorted,快速排序,时间复杂度O(nlogn)渐进最优. #!/usr/bin/env python3 L = [] for i in range(10): L. ...

  4. 一年25个里程碑!免疫疗法“战胜”癌症,靠的是实力(5篇Science、6篇Nature )--转载

    近几年,免疫疗法的成功使癌症治疗进入了新的时代.无论是科研界,还是商业界,都丝毫没有掩饰对这一领域的热情.2016年,Cell杂志公布的年度十大最佳论文中,免疫疗法占两席.事实上,这两项成果只是去年癌 ...

  5. python 矩阵转置

    arrA=[[,,,],[,,,],[,,,],[,,,]] N= #声明4x4数组arr arrB=[[None] * N for row in range(N)] print('[原设置的矩阵内容 ...

  6. postgresql中终止正在执行的SQL语句

    在Linux系统中可以使用kill [pid]的方式强制删除进程,但对于修改数据表的语句来说,这样可能导致postgresql进入recovery mode,这样会导致锁表. Postgresql的运 ...

  7. Java回顾之网络通信

    在这篇文章里,我们主要讨论如何使用Java实现网络通信,包括TCP通信.UDP通信.多播以及NIO. TCP连接 TCP的基础是Socket,在TCP连接中,我们会使用ServerSocket和Soc ...

  8. css输入框的圆角

    转载:http://jingyan.baidu.com/article/73c3ce28f0b38fe50343d926.html 1.原理是四张圆角的图片放在四个角上,就是圆角矩形的四个角,但这种方 ...

  9. Android之微信开放平台创建应用

    微信开放平台网站:https://open.weixin.qq.com 1:登录之后(未登录就注册),点击移动应用开发进入 点击创建应用之后,进入填写对应信息. 接下来,填写平台信息. 应用签名获取方 ...

  10. hdu——1873(优先队列)

    看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...