字符串是可以转变成字节数组,然后统计一下字节数组的长度即可,参考如下代码:
Java语言中,中文字符所占的字节数取决于字符的编码方式,一般情况下,采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节;采用GB2312或GBK编码方式时,一个中文字符占2个字节;而采用UTF-8编码方式时,一个中文字符会占3个字节。
public static void main(String []args) throws UnsupportedEncodingException {
// 运行结果:2
Systemoutprintln("测试"getBytes("ISO8859-1")length);
// 运行结果:4
Systemoutprintln("测试"getBytes("GB2312")length);
// 运行结果:4
Systemoutprintln("测试"getBytes("GBK")length);
// 运行结果:6
Systemoutprintln("测试"getBytes("UTF-8")length);
}
在C语言中,可以通过库函数strlen来计算字符串的长度,也可以通过循环计数来求取字符串长度。
函数原型:unsigned int strlen(char str);
功 能:统计字符串str中字符的个数,不包含'\0'
返 回 值:返回字符个数
具体实现方法可以参考如下程序段:
1、用strlen函数实现
char str[20];
int len; // 保存数组的长度
scanf("%s", str);
len = strlen(str); // 计算字符数组str的长度
注:需将头文件#include<stringh>添加进源文件中。
2、用循环来实现
char str[20];
int len=0; // 保存数组的长度
scanf("%s", str);
while(str[len] != '\0') // 未检测到结束字符
{
len++; // 统计字符数组str的长度
}
严格来说,String确实有长度限制。
String内部使用一个char[]数组来存放字符串的内容,数组下标是整型(也可以参考String的构造方法String(char value[], int offset, int count) ,可以知道字符数量是用整型表示),整型(Java规定32位)表示范围是2G,也就是说,Java数组最大的长度是2G,即字符串不能超过2G个字符。
Java的数组大小还有没有别的限制?事实上数组大小不能超过Java堆的大小,而Java堆的最大尺寸可以通过启动参数指定,如果Java堆开得足够大,数组的最大长度是可以不断增大的。
所以,理论上,字符串不能超过2G个字符,少于2G个字符都有可能。
但编码时有需要注意的地方,采用明文的方式,如果超过65534个字节,可能报编译错误,可参考下列网站(有一处错误,整型考虑到符号位,最大只到2G)。
初看到这个问题心里还是有点尴尬的,平时确实没注意过String最大能有多长。想要知道String到底有多长,只能从源码层面来找答案了。
Java中String不是基本数据类型,而是引用类型并且是final。String定义为final的原因:
高效性
JVM在查找字符串的时候可以直接定位到String类中,更准确的说String不可变,才能实现常量池。
安全性
定义成final,不能被继承和修改,可以防止在子类或者其他地方被修改,导致隐藏Bug产生。
上面提到常量池,JVM创建对象是需要开销的,为了提高性能,对字符串使用字符串常量池进行了优化,每当我们创建一个字符串时,Jvm先去字符串常量池检查,如果字符串常量池存在,直接返回实例引用;否则创建实例,并存入字符串常量池中。
比如常见的判断:
因为a和b都是指向"hello"这个常量池中的常量,即同一个地址所以a==b 为true
因为c是new了一个新对象,且对象是在堆上存放,所以c==a为false,虽然c的内容是创建在堆中,但是他的内部value还是指向JVM常量池的hello的value,它构造hello时所用的参数依然是hello字符串常量。
下面正式进入今天的主题了,String的最大长度到底是多大呢?
翻开String类的源码,你会看到:
可以看到String的length是通过count值返回的,count是int型,最大为2 31 -1,所以String理论上最大长度为2 31 -1,2147483647。
但是由于String底层是通过char[]字符数组来实现,char占用两个字节,2147483647 个 char 类型就是 4294967294 字节,这接近于 4GB 大小,想要申请这么一大块连续的内存空间,失败也就不足为奇了,所以和电脑的硬件条件有关。
总结
String 的最大长度也就是字符数组的最大长度,理论上最大长度为 int 类型的最大值,即 2147483647。
在实际中,一般可获取的最大值小于理论最大值。
EncodingGetBytes ();
EncodingGetString ();
通过这两个方法将汉字字符编码为字节数组,同样知道了汉字GB2312的字节数组编码也就可以将字节数组解码为汉字字符。
Encoding gb=SystemTextEncodingGetEncoding("gb2312");
object[] bytes=gbEncodingGetBytes ("好");
发现得到了一个长度为2的字节数组bytes,使用
string lowCode = SystemConvertToString(bytes[0], 16); //取出元素1编码内容(两位16进制)
string hightCode = SystemConvertToString(bytes[1], 16);//取出元素2编码内容(两位16进制)
这样取出的数组为{ba,c3},刚好是“好”字的十六进制区位码
所以每个汉字字符都能变成一个长度为2的十六进制字节数组。
以上就是关于(java)如何获取字符串的字节数!全部的内容,包括:(java)如何获取字符串的字节数!、如何获取字符串和字符数组的长度、java中String类型有没有限制,最大限制是多少等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)