理解String 是怎么占用内存的
 
    来看一个每个String对象的各个属性,一个String包括如下的属性:
  • 一个char数组(是个独立的对象用来存储字符串中的字符)
  • 一个int 的offset属性(偏移量,用来指出字符串是从char数组中第几个字符开始的)
  • 一个int 的count属性(字符串的长度)
  • 最后一个int的hash属性(用来存储hashCode的值)
 
    也就是说,即使一个String不包含任何字符,也需要在数组的引用上面消耗4个字节,再加上3个int类型的属性,3*4=12字节,加上对象头的8个字节,以上一共24个字节(目前还不需要加上填充字节)。然后,一个char数组的对象头需要12个字节,加上4个填充字节,一个空的String 消耗了40字节。
    如果String 包含了17个字符,那么String 对象本身需要24个字节,但是现在17个字符的char数组要需12字节 加上 17*2=34字节,12+17*2=46字节,46不是8的倍数,加上填充字节46+2=48字节,那么17个字符的字符串会用到48+24 = 72 字节,可以看到在C语言中占据18个字节的String 在JAVA中占据了72个字节。
 
注:开发环境:jdk 1.6   系统:32位
 
子字符串的内存消耗
 
        你可能会感到奇怪为什么字符串会有一个offset的属性和count属性。为什么char数组中的字符直接对应整个字符串呢?是这样的,当你创建一个子字符串,新创建的子字符串的char数组其实是指向的父字符串的char数组的,也就是父子字符串共享一个char数组。(但是他们有不同的offset和count)。这是一件好事还是坏事依赖于你怎么用:
    • 如果在创建完子字符串之后还需要用到父字符串的话,你可以省了些内存。
    • 如果创建完子字符串之后就不再需要用到父字符串的话,那么就浪费了内存
    • 参考文档: JAVA对象是如何占用内存的 http://www.cnblogs.com/niurougan/p/4196057.html;

Java SE之String,字符串和子字符串的存储与区别的更多相关文章

  1. 常用JAVA API :String 、StringBuilder、StringBuffer的常用方法和区别

    摘要 本文将介绍String.StringBuilder类的常用方法. 在java中String类不可变的,创建一个String对象后不能更改它的值.所以如果需要对原字符串进行一些改动操作,就需要用S ...

  2. Java实现 LeetCode 459 重复的子字符串

    459. 重复的子字符串 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" ...

  3. python--基础学习(四)自然字符串、重复字符串、子字符串

    python系列均基于python3.4环境 1.自然字符串和重复字符串 代码示例: str1=r'hello \npython' str2='hello \npython' str3="h ...

  4. Java中的String、StringBuffer以及StringBuilder的用法和区别

    String String的构造方式有n种(据说n==11),常见的例举一二: String s1 = "hello world"; String s2 = new String( ...

  5. Java SE之快速失败(Fast-Fail)与快速安全(Fast-Safe)的区别[集合与多线程/增强For](彻底详解)

    声明 特点:基于JDK源码进行分析. 研究费时费力,如需转载或摘要,请显著处注明出处,以尊重劳动研究成果:博客园 - https://www.cnblogs.com/johnnyzen/p/10547 ...

  6. iOS 查找字符串 相同 子字符串的位置 range

    问题:解决替换同一个字符串的多个相同的字符eg. xxx这个超级大土豪白送xxx一个!赶快来抢把! 将第一个xxx换成名字 将第二个xxx换成物品 两种办法    第二种办法更灵活一点 //第一种办法 ...

  7. Java-从一个字符串获取子字符串

    substring函数 package com.tj; public class MyClass implements Cloneable { public static void main(Stri ...

  8. Java中的String,StringBuffer,StringBuilder详解与区别

    1.String Java中string类是不可变的,其中在声明的源代码中用的final,所以只能声明一次.所以每次在明面上的改变其实是重新生成一个String对象,指针指向新的String对象.同时 ...

  9. [ Java学习基础 ] String字符串的基本操作

    字符串的拼接 String字符串虽然是不可变的字符串,但也同样可以进行拼接,只是会产生一个新的对象.String字符串拼接的时候可以使用"+"运算符或String的concat(S ...

随机推荐

  1. 《微信小程序组件》收集

    https://github.com/liuqian0413/wxappUI https://github.com/liujians/Wa-UI

  2. Guava的RateLimiter在单机限流中的正确用法

    错误使用 在实现限流时,网上的各种文章基本都会提到Guava的RateLimiter,用于实现单机的限流,并给出类似的代码: public void method() { RateLimiter ra ...

  3. selenium之批量执行测试用例生成HTML结果文件

    使用HTMLTestRunner运行测试套件,自动生成html测试报告: import unittest, HTMLTestRunner, sendmail_html import time, os ...

  4. Lodop调整打印项输出顺序 覆盖与层级

    Lodop中的打印项,如果有输出在同一位置,或部分位置重叠的地方,打印项之间是怎么覆盖的呢?在JS里,按照Lodop语句打印项先后的执行顺序,先执行的先输出,后执行的后输出,如果有后面的打印项和前面的 ...

  5. 读取excel思路

    1.输入地址 2.输入指定的sheet  通过sheet()[]方式指定 3.输入执行的单元位置 通过 .cell_value(x,y)方式指定 示例 data = xlrd.open_workboo ...

  6. 洛谷P2397 yyy loves Maths VI (mode)

    P2397 yyy loves Maths VI (mode) 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居 ...

  7. Network POJ - 3694(lca并查集+连通图求桥)

    就是求出原先图中的桥的数量,在每一次询问时加入一条新边,求加入当前边后图中剩余的桥的数量 求出原先图中的桥的数量,然后减去新加入边的两端点之间的桥的数量,就是剩余桥的数量.. 用并查集把属于同一集合的 ...

  8. POJ - 1062(昂贵的聘礼)(有限制的spfa最短路)

    题意:...中文题... 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 54350   Accepted: 16 ...

  9. 点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)

    推荐YCB的总结 推荐你谷ysn等巨佬的详细题解 大致流程-- dfs求出当前树的重心 对当前树内经过重心的路径统计答案(一条路径由两条由重心到其它点的子路径合并而成) 容斥减去不合法情况(两条子路径 ...

  10. 【ARC102E】Stop. Otherwise...(容斥原理,动态规划)

    [ARC102E]Stop. Otherwise...(容斥原理,动态规划) 题面 AtCoder 有\(n\)个骰子,每个骰子有\(K\)个面,上面有\(1\)到\(K\).骰子都是一样的. 现在对 ...