面试官:String的最大长度是多少?

简介: 大家好,我是指北君。PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!

之前有提到,指北君在做面试相关的事情。有面试官问了String的最大长度是多少?指北君听到这个问题之后有点懵,还好指北君抗住了。

指北君:面试官你好,可以开始面试了吗?

面试官:你好,那我们现在开始吧。之前我们聊了new object()到底占用多少个字节?看你对JVM有一定的了解。那我今天问问你,一个 String 字符串最大长度是多少?

指北君:从我们平常使用的角度看,String 字符串似乎是没有长度限制。所以也不存在最大长度这个事情。

面试官:真的这样吗?是这样的话,我们今天可以结束了。不用再聊了。

70.jpg

指北君:那等等,我想一下。

指北君大脑中疯狂搜索 String 源代码的相关内容。

71.jpg

指北君终于在String 源码中找到了蛛丝马迹,

72.png

指北君:我记得String 源码中有个构造函数,有个count的参数是int类型的。在Java 中,int的最大长度是2^31-1。也就是说 String 的长度最大是2^31-1

面试官:嗯,没错,这个是理论上的长度吧,实际情况能达到吗?

指北君又陷入了沉思…… 开始计算起存这么大的String需要消耗多大的内存。



73.jpg

指北君:我刚才在脑子里算了下,存储长度2^31-1的字符串需要4GB的内存,也就是说,我们需要有大于4GB的JVM运行内存才行。

74.png


面试官:既然你已经提到了JVM,那String一般都存储在JVM的哪块区域。

指北君:字符串在JVM中的存储分两种情况,我上面说的String ,它是存储在JVM的堆栈中。另外还有字符串常量存储在常量池里面。

面试官:那你觉得常量池中的字符串最大长度是2^31-1吗?

指北君:Java中字符串在常量池中通过CONSTANT_Utf8类型表示。

75.png

指北君:我们只要重点关注bytes[length]即可,length在这里就是代表字符串的长度,length的类型是u2,u2是无符号的16位整数,也就是说最大长度可以做到2^16-1 即 65535。

76.jpg


面试官:按照你说的,我在我的机器上试了一下65535长度的字符串,编译报错了。这是怎么回事呢?

指北君:这是因为javac编译器做了限制,需要length < 65535。所以字符串常量在常量池中的最大长度是65534。你减少1个字符试试看。

面试官:这次编译没问题了。我们今天就先到这里吧。

指北君:好的,我的offer,有戏吗?

面试官:继续努力鸭

77.jpg

总结

今天我们模拟面试了String的最大长度问题。结论是String是有长度限制的,但是不同的状态下,具有不同的长度限制。

  • 字符串常量长度不能超过65534
  • 堆内字符串的长度不能超过2^31-1

面试大全包括:包括 Java 集合、JVM、多线程、并发编程、设计模式、SpringBoot、SpringCloud、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!


相关文章
|
4月前
|
Java
【Java基础面试三十一】、String a = “abc“; ,说一下这个过程会创建什么,放在哪里?
这篇文章解释了在Java中声明`String a = "abc";`时,JVM会检查常量池中是否存在"abc"字符串,若不存在则存入常量池,然后引用常量池中的"abc"给变量a。
|
4月前
|
Java
【Java基础面试三十二】、new String(“abc“) 是去了哪里,仅仅是在堆里面吗?
这篇文章解释了Java中使用`new String("abc")`时,JVM会将字符串直接量"abc"存入常量池,并在堆内存中创建一个新的String对象,该对象会指向常量池中的字符串直接量。
每日一道面试题之String常用的方法有哪些?
每日一道面试题之String常用的方法有哪些?
|
7月前
|
安全 Java 调度
Java基础面试,String,StringBuffer,StringBuilder区别以及使用场景
* String是final修饰的,不可变,每次操作都会产生新的对象。 * StringBuffer和StringBuilder都是在原对象上进行操作 * StringBuffer是线程安全的,StringBuilder是线程不安全的。 * StringBuffer方法是被synchronized修饰的
|
1月前
|
存储 安全 Java
美团面试:String 为什么 不可变 ?(90%答错了,尼恩来一个绝世答案)
45岁老架构师尼恩分享Java面试心得,涵盖String不可变性、字符串常量池、面试技巧等内容。尼恩强调,掌握深层技术原理,如String不可变性的真正原因,可在面试中脱颖而出,赢得高薪Offer。此外,尼恩还提供了大量技术资源和面试指导,帮助求职者提升技术水平,顺利通过大厂面试。
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
|
4月前
|
Java
【Java基础面试二十六】、说一说String和StringBuffer有什么区别
这篇文章区分了Java中的String和StringBuffer类:String是不可变类,一旦创建字符序列就不能改变;而StringBuffer代表可变的字符串,可以通过其方法修改字符序列,最终可以通过`toString()`方法转换为String对象。
【Java基础面试二十六】、说一说String和StringBuffer有什么区别
|
4月前
|
Java API 索引
【Java基础面试二十四】、String类有哪些方法?
这篇文章列举了Java中String类的常用方法,如`charAt()`、`substring()`、`split()`、`trim()`、`indexOf()`、`lastIndexOf()`、`startsWith()`、`endsWith()`、`toUpperCase()`、`toLowerCase()`、`replaceFirst()`和`replaceAll()`,并建议面试时展示对这些方法的熟悉度,同时深入理解部分方法的源码实现。
【Java基础面试二十四】、String类有哪些方法?
|
4月前
|
存储 安全 Go
Go 面试题:string 是线程安全的吗?
Go 面试题:string 是线程安全的吗?
|
4月前
|
安全 编译器 C++
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数