首页 > 编程知识 正文

String 有多长,java中string有多长

时间:2023-05-05 21:17:34 阅读:187159 作者:4510

1

串的形状

public final class String String类由final限定,因此为不能被继承的。 在比较字符串时,通常希望比较其中的字符串是否相同,因此在此使用不能用"=="进行字符串的比较,而是需要使用"equals()"方法。===

private final char value[]; String的值实际上以char数组存储,为final,所以字符串对象保持不变,但可以看出会被字符串操作误解,如:

String a='aaaa '; a ='bbbb '; 其实这个时候,a已经指向了新的对象。

到此为止,初级工程师应该很熟悉。

2

串的形状

在考虑字符串的长度之前,让我们先看看字符串定义的各种形式。

//第一个strings=' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.'; //第二种byte [ ] a=读来自文件(new file ) (somelargetext.txt ); stringsuperlongstring=new string (a; 那么,既然考虑String的长度,就应该考虑为什么有长度的限制。 在编译器中定义String的时候,到底有多长不是我们自己输入的吗? 以上两种方法的区别是什么呢?

2.1 字面量的形式

第一个对于文字,Java位于常量池中,在Java版本1.6中位于堆栈的常量池中,在版本1.7、1.8中位于堆的常量池中。 这意味着第一种方式受常量池大小的限制。 是的。 受常量池的限制,但在通过JVM运行之前将其编译为字节码时存在限制。

如上图所示,编译的length类型为u2 (无符号16位),即length的最大值为2^16-1 = 65535。 这意味着我们上面的字符串s的长度可以用MUTF-8 (字节码中的符号)存储65535个字节。

到此为止,如果你是中级工程师的话,知道这么多已经够了。

但实际上,为什么发现只能存储65534字节呢? 网上有很多猜想,大部分是不正确的。 搜索Java编译器的源代码,可以看到以下内容。

这样您就明白了吗? 当Java编译器检查字符串常量时,它确定长度必须为65535才能正常。 否则报告错误。 看起来像编译器的错误。 如果要修改编译器源代码,请使用上面的判断条件改成=65535。 这样,即使保存65535个字符' a '的字符串也不会发生编译错误。

我知道我们在用拉丁字母' a '测试。 a使用UTF-8编码正好是一个字节,所以可以保存65534个字符。 保存汉字后,例如使用我们常见的3358 www.Sina.com/http://www.Sina.com /占用3个字符

//根据我们刚才的分析,“热”汉字String s=“热.热”应该可以保存65534/3个。 那么,试着保存65535/3个字的汉字“热”吧? 结果很好。 没有错误。 诶? 为什么会这样呢? 试着剥离编译器的源代码。

编译处理汉字,他的判断逻辑不同。 条件是65535投出异常。 也就是说,65535以下正常。 真有趣。 写Java编译器的人也很有趣呢。

eft">2.1 new的形式

对于第二种形式的,很显然只有在运行时受限于Java虚拟机了。我们知道String最后保存在char数组中,Java虚拟机是如何做的呢?简单参考下源码:

虚拟机指令newarray [int],size是以整形定义的,所以它的限制其实就是int的最大值,但是在有一些虚拟机上会保留一些头信息在数组中,所以就变成了Integer.MAX_VALUE - 8个char;

到这里呢,基本上你就有了高级工程师的思考高度了。

3

总结

3.1 字面量的形式

受字节码数据结构的限制,字符串使用MUTF-8编码后字节数不超过65535

拉丁字符,受Java编译器代码限制,最多只能存储65534个字节

非拉丁字符,最多存储65535个字节

3.2 new的形式

受虚拟机指令限制,字符数理论上线是Integer.MAX_VALUE,但是实际上有保留头信息的部分,所以会略小

受堆内存的限制,如果堆内存很小,那就不能超过堆内存的限制

看起来本文有点过于追求细节了,有点孔乙己的回字有几种写法的意思。实际则不然,搞技术就是要把握好细节,才能写出优秀的代码,才能成为高阶的工程师而不是码农。

【END】

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「web_resource」,关注后回复「进群」或者扫描下方二维码即可进入无广告交流群。

扫描二维码进群↓

读 

1. 我把废旧 Android 手机改造成了 Linux 服务器

2. 动画: 一个浏览器是如何工作的?

3. 为什么你学不会递归?

4. 一个女生不主动联系你还有机会吗?

5.  团队开发中 Git 最佳实践

在看 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。