java string 字节_java中string究竟占多少字节
以前学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究竟占多少字节相关推荐
- java long 几个字节_java中long类型占多少字节
所谓的占用字节数 就是申请内存的时候所占的空间大小. long 8字节 最小值是 -9,223,372,036,854,775,808(-2^63): 最大值是 9,223,372,036,854,7 ...
- java int几个字节_java中的int占几个字节
java中的int占几个字节 发布时间:2020-06-26 18:07:29 来源:亿速云 阅读:131 作者:Leah 今天就跟大家聊聊有关java中的int占几个字节,可能很多人都不太了解,为了 ...
- java 字符串 面试_JAVA中String介绍及常见面试题小结
字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 深刻认识String 1)String为字符串常量:即String对象一旦 ...
- java new string 图_Java中String直接赋字符串和new String的一些问题
今天课堂测试做了几道String的练习题,做完直接心态爆炸...... 整理自下面两篇博客: 首先先来看看下面的代码: public classStringTest {public static vo ...
- java中的string函数_java中string.trim()函数的作用实例及源码
trim()的作用:去掉字符串首尾的空格. public static void main(String arg[]){ String a=" hello world "; Str ...
- java中string类_Java中String类浅谈
1)String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = "abc&qu ...
- java replaceall函数_JAVA中string.replace和string.replaceAll的区别及用法
展开全部 JAVA中string.replace()和string.replaceAll()的区别及用法乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),32 ...
- Java中string与String区别_JAVA中String与StringBuffer的区别
JAVA中String与StringBuffer的区别 2009-12-3文字大小:大中小 在java中有3个类来负责字符的操作. 1.Character 是执行 单个字符操作的, 2.String ...
- java long类型大小_java中long类型占多少字节
所谓的占用字节数 就是申请内存的时候所占的空间大小. long 8字节 最小值是 -9,223,372,036,854,775,808(-2^63): 最大值是 9,223,372,036,854,7 ...
最新文章
- 第5章 图像分类的数据集
- 斯坦福大学马超:探寻「隐式偏差」的完整理论框架
- Nodejs的http模块
- Revit二次开发之“使用ElementTransformUtils.MoveElement()移动元素”
- C++11类内初始化
- Java BigDecimal初探
- 从C语言中的指针看C#中委托
- Jetty报ArrayIndexOutBoundsException:30305的解决方案
- 在群晖(Synology) 中运行115网盘Linux版(docker)
- linux工作中常用文件操作命令
- 面试拿到外包公司offer该不该去?!
- 小白IT:如何快速写出一个前端页面(网页),Python中如何使用前端语言什么是?JavaScript?BOMDOM?Bootstrap??
- 回顾2021几件印象深刻的事
- 运维的一些日常知识点
- 前端程序员应该去哪个城市发展?
- 用Python做了一个猫狗识别系统~
- XJOI 循环-分解质因式
- 设圆半径r = 1.5,圆柱高h = 3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积
- C语言求字符串数组的长度函数计算
- css透明度属性简介