作为Java中最常用的数据类型之一,通常认为只要内存够用,String要多长就有多长,其实不然,String的实际长度是有限制。本文根据String的两种使用方式探究String的长度。

字面量

基本类型变量赋值的方式就叫做字面量或者字面值,也就是不需要使用new关键字创建。

     String largeString = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

直接赋值的字面量常量通常会被放入常量池中。

执行javac编译时会Gen.java检查一下String的长度。

    /** Max number of char in a string constant. */public static final int MAX_STRING_LENGTH = 0xFFFF;.../** Check a constant value and report if it is a string that is*  too large.*/private void checkStringConstant(DiagnosticPosition pos, Object constValue) {if (nerrs != 0 || // only complain about a long string onceconstValue == null ||!(constValue instanceof String) ||((String)constValue).length() < PoolWriter.MAX_STRING_LENGTH)return;log.error(pos, Errors.LimitString);nerrs++;}

当String长度小于0xFFFF也就是65535时,检查通过,否则会提示“constant string too long”,也就是字符串长度大于等于65535字节时,会提示字符串太长。而且CONSTANT_Utf8_info型常量的最大长度是是65535 - 1 = 65534个字节,若是中文字符,长度为65535 / 3字节。如果运行时方法区设置的比较小,实际长度可能达不到理论字节。

new对象

使用new创建String对象。

     String largeString = new String("xxxxxxxxxxx");

字符串不属于基本数据类型,String是一个对象,默认值为null。以JDK16为例。

实际上使用new创建的String对象就相当于char[ ],此时存储的是字符。

The String class represents character strings. All string literals in Java programs, such as "abc",
are implemented as instances of this class.Strings are constant; their values cannot be changed after
they are created. String buffers support mutable strings. Because String objects are immutable they
can be shared. For example:String str = "abc";is equivalent to:char data[] = {'a', 'b', 'c'};String str = new String(data);

使用new创建的对象会被放置在堆中,堆的内存要比栈的内存要大,垃圾回收也主要回收堆里面的内容。

使用数组存储,默认长度为Integer.MAX_VALUE,也就是231 - 1。

    /*** A constant holding the maximum value an {@code int} can* have, 2<sup>31</sup>-1.*/@Native public static final int   MAX_VALUE = 0x7fffffff;

使用new创建的String,理论长度最长231 - 1个字符,实际长度受虚拟机和堆内存的大小限制。

Java随笔-String有多长?相关推荐

  1. JAVA随笔String与基本类型转换小说明

    大家都知道String类型转换为基本类型时,可以用基本类型的静态方法Integer.parseInt(String str)和Integer.valueOf(String str),这两个方法稍微有点 ...

  2. java随笔三,真正的class大总结

    java随笔三:class 一.对象与对象引用 class A{} A pa = new A(); 差不多就是A *pa = new A();显然new的是对象,pa是引用(Java毙了指针,把他换个 ...

  3. Listener method 'public void com.config.mq.MsgReceiver.process(java.lang.String) throw

    Listener method 'public void com.config.mq.MsgReceiver.process(java.lang.String) throw RabbitMQ监听消息时 ...

  4. java string改变的影响_为什么Java的string类要设成immutable(不可变的)

    最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...

  5. Java 之String、StringBuffer 和 StringBuilder 三者区别介绍

    String:字符串常量,字符串长度不可变,StringBuffer:字符串变量(Synchronized,即线程安全),StringBuilder:字符串变量(非线程安全). String Stri ...

  6. 2.Java中String,StringBuilder以及StringBuffer的关系与区别

    String     StringBuffer     StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...

  7. OC与c混编实现Java的String的hashcode()函数

    首先,我不愿意大家需要用到这篇文章里的代码,因为基本上你就是被坑了. 起因:我被Java后台人员坑了一把,他们要对请求的参数增加一个额外的字段,字段的用途是来校验其余的参数是否再传递过程中被篡改或因为 ...

  8. Java输出数组中最长递增子序列的代码

    下面内容是关于Java输出数组中最长递增子序列的内容,希望对大伙有较大用途. package com.wzs;import java.util.ArrayList; import java.util. ...

  9. Java字符串String比较不要用==原因

    简述 其实Java的String不是 char [],而是char *. 这么说来,如果使用 ==来做比较,其实是比较两个指针的值.而我们清楚指针的值就是表示对应的数据的逻辑地址.那么这里的相等的含义 ...

最新文章

  1. 配置错误:未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误信息为: 打不开 RSA 密钥容器。...
  2. CSS 七层叠层顺序(stacking level)
  3. 深入理解 CAP 定理
  4. 全球唯一标识符:GUID在线生成
  5. linux 命令行 文件管理器,CLEX - 集成命令提示符、“多才多艺”的命令行文件管理器...
  6. JavaScript基础函数的配置对象Configuration Objects(020)
  7. C语言中可变参数的宏 __VA_ARGS__
  8. 嵌入式Ubuntu 搭建caffee环境
  9. ARM启动流程及启动代码分析
  10. 计算机无法添加打印机,无法添加打印机,教您无法添加打印机怎么办
  11. Python库安装之requirements.txt, environment.yml
  12. 基于MVC的简易图形编辑器
  13. H2数据库入门,看这篇就对了
  14. c语言编程输出皮卡丘,c语言001第一节课程-函数方式输出皮卡丘画 2019-06-24
  15. 大数据工程师四能力你拥有几种?
  16. W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x419b4c50)
  17. GEE引擎自定义进度条和自定义属性的脚本展示
  18. 计算机主机不通电,电脑主机不通电无法开机怎么解决
  19. 实习一月记——美团点评云计算部
  20. 【KALI使用】14 被动信息收集——RECON-NG(待完善

热门文章

  1. PS快速抠图、换背景,让抠图速度快…
  2. 动态修改 xm-select 颜色
  3. js中Array.prototype.find() 方法在对象数组上无效果,捉急。。。
  4. RabbitMQ-dlx死信队列
  5. 算数运算符、算术表达式
  6. 百度地图添加多个marker点位标注
  7. element-ui:el-autocomplete实现搜索结果多次点击不关闭弹框
  8. 2W 字详解设计模式
  9. python内置库有哪些_python 内置库
  10. 皇家恩菲尔德子弹500经典男装