以前学java基础的时候考虑过string占多少字节,百度后有人说一个汉字占两个字节,所以一个string的字节数是可变的,遇到一个汉字+2,遇到一个字母+1。笔者对此结论严重怀疑,一个string在分配内存空间的过程中怎么可能会动态变化呢。笔者开始尝试测试string所占的字节数。

一:首先想到的是通过string的getBytes方法测试其所占长度,是否与上述结论一致。

请看下面代码:

String  a="中国";

System.out.println(a.getBytes().length);

返回结果为6。

这个结果与上述结论明显有出入,一个汉字占3个字节吗?显然不是这样的,因为一个char占两个字节,char是可以存放一个汉字的。getBytes方法只是将字符串转换为字节码,其转换关系在源码中可以找到,他是使用默认字符集将string转换为byte序列的,至于为啥每个汉字在getBytes的时候是3个,还请大神指教。

二:通过outofmemory异常测试

首先我们的电脑内存空间是有限的,所以如果定义一个数组的长度过长,一定会抛出outofmemory异常,每个人的整块内存空间应该是不一样的,所以笔者先测了下自己电脑上的最大整块内存空间,经多次调试,发现内存空间大小为1365966832字节。

byte b[]=new byte[1365966832];

这是一个临界值,再加1就会抛出outofmemory异常。大概1.3个G。

同理测试,用string数组创建的话,临界值为341491708。

上面的数除以下面的数等于4!故为4个字节。

三:由于创建对象的初期,jvm虚拟机会把分配到的内存空间全部初始化为0(不包括对象头),其值为这些字段的数据类型对应的0值(引自深入理解java虚拟机),所以目前数组中的每个string还是null值(string对应的0值为null),那么根据最开始的可变理论,我们上述的结论还不够有说服力。我们开始为该数组赋值。

String str[]=new String[341491708];

for(int i=0;i

str[i]="f";

}

System.out.println(str[0]);

结果没有抛出异常,数组长度再大也可以。说明字节长度不变就是4个字节。

四.有人可能会说,这样声明的字符串是被放到常量池里了,返回的只是个引用。ok我们利用最后零散的的内存空间new字符串出来。

--------

擦擦擦,刚刚死机了,感谢oschina的自动保存功能。。。

--------

String str[]=new String[341491708];

for(int i=0;i

str[i]=new String("f");

if(i>996710){

System.out.println(i);

}

}

结果我的电脑不到100万就溢出了,换再长的字符串也一样。这里想亲手做实验的童鞋注意,之所以有个if判断才打印是因为打印很耗时,过滤掉前面没用的打印而已。

综上所述string占4字节

----------------------------------------------------割割割割割割----------------------------------------

以上论断是错的,具体原因应该与c语言的指针类型有关,现在笔者还有些东西没有想清楚,想清楚后会改,敬请期待~

java string 字节_java中string究竟占多少字节相关推荐

  1. java long 几个字节_java中long类型占多少字节

    所谓的占用字节数 就是申请内存的时候所占的空间大小. long 8字节 最小值是 -9,223,372,036,854,775,808(-2^63): 最大值是 9,223,372,036,854,7 ...

  2. java int几个字节_java中的int占几个字节

    java中的int占几个字节 发布时间:2020-06-26 18:07:29 来源:亿速云 阅读:131 作者:Leah 今天就跟大家聊聊有关java中的int占几个字节,可能很多人都不太了解,为了 ...

  3. java 字符串 面试_JAVA中String介绍及常见面试题小结

    字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 深刻认识String 1)String为字符串常量:即String对象一旦 ...

  4. java new string 图_Java中String直接赋字符串和new String的一些问题

    今天课堂测试做了几道String的练习题,做完直接心态爆炸...... 整理自下面两篇博客: 首先先来看看下面的代码: public classStringTest {public static vo ...

  5. java中的string函数_java中string.trim()函数的作用实例及源码

    trim()的作用:去掉字符串首尾的空格. public static void main(String arg[]){ String a=" hello world "; Str ...

  6. java中string类_Java中String类浅谈

    1)String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下:      String s = "abc&qu ...

  7. java replaceall函数_JAVA中string.replace和string.replaceAll的区别及用法

    展开全部 JAVA中string.replace()和string.replaceAll()的区别及用法乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),32 ...

  8. Java中string与String区别_JAVA中String与StringBuffer的区别

    JAVA中String与StringBuffer的区别 2009-12-3文字大小:大中小 在java中有3个类来负责字符的操作. 1.Character 是执行 单个字符操作的, 2.String ...

  9. java long类型大小_java中long类型占多少字节

    所谓的占用字节数 就是申请内存的时候所占的空间大小. long 8字节 最小值是 -9,223,372,036,854,775,808(-2^63): 最大值是 9,223,372,036,854,7 ...

最新文章

  1. 第5章 图像分类的数据集
  2. 斯坦福大学马超:探寻「隐式偏差」的完整理论框架
  3. Nodejs的http模块
  4. Revit二次开发之“使用ElementTransformUtils.MoveElement()移动元素”
  5. C++11类内初始化
  6. Java BigDecimal初探
  7. 从C语言中的指针看C#中委托
  8. Jetty报ArrayIndexOutBoundsException:30305的解决方案
  9. 在群晖(Synology) 中运行115网盘Linux版(docker)
  10. linux工作中常用文件操作命令
  11. 面试拿到外包公司offer该不该去?!
  12. 小白IT:如何快速写出一个前端页面(网页),Python中如何使用前端语言什么是?JavaScript?BOMDOM?Bootstrap??
  13. 回顾2021几件印象深刻的事
  14. 运维的一些日常知识点
  15. 前端程序员应该去哪个城市发展?
  16. 用Python做了一个猫狗识别系统~
  17. XJOI 循环-分解质因式
  18. 设圆半径r = 1.5,圆柱高h = 3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积
  19. C语言求字符串数组的长度函数计算
  20. css透明度属性简介

热门文章

  1. English Learning - Day24 作业打卡 2022.12.30 周五
  2. 自己建设网站需要做哪些准备
  3. 距离远的贴图出现模糊的解决方法
  4. 为什么不看好企业做微信公众号了
  5. word 题目和选项保存到数据库(文件解析)
  6. php+ajax 仿百度搜索效果
  7. UE4中使用自动驾驶模拟——Carla
  8. 通过前序中序,中序后序,前序后序来构造一二叉树
  9. Tomcat调优参数
  10. opencv安装路径出错