Java随笔-String有多长?
作为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有多长?相关推荐
- JAVA随笔String与基本类型转换小说明
大家都知道String类型转换为基本类型时,可以用基本类型的静态方法Integer.parseInt(String str)和Integer.valueOf(String str),这两个方法稍微有点 ...
- java随笔三,真正的class大总结
java随笔三:class 一.对象与对象引用 class A{} A pa = new A(); 差不多就是A *pa = new A();显然new的是对象,pa是引用(Java毙了指针,把他换个 ...
- 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监听消息时 ...
- java string改变的影响_为什么Java的string类要设成immutable(不可变的)
最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...
- Java 之String、StringBuffer 和 StringBuilder 三者区别介绍
String:字符串常量,字符串长度不可变,StringBuffer:字符串变量(Synchronized,即线程安全),StringBuilder:字符串变量(非线程安全). String Stri ...
- 2.Java中String,StringBuilder以及StringBuffer的关系与区别
String StringBuffer StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...
- OC与c混编实现Java的String的hashcode()函数
首先,我不愿意大家需要用到这篇文章里的代码,因为基本上你就是被坑了. 起因:我被Java后台人员坑了一把,他们要对请求的参数增加一个额外的字段,字段的用途是来校验其余的参数是否再传递过程中被篡改或因为 ...
- Java输出数组中最长递增子序列的代码
下面内容是关于Java输出数组中最长递增子序列的内容,希望对大伙有较大用途. package com.wzs;import java.util.ArrayList; import java.util. ...
- Java字符串String比较不要用==原因
简述 其实Java的String不是 char [],而是char *. 这么说来,如果使用 ==来做比较,其实是比较两个指针的值.而我们清楚指针的值就是表示对应的数据的逻辑地址.那么这里的相等的含义 ...
最新文章
- 配置错误:未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误信息为: 打不开 RSA 密钥容器。...
- CSS 七层叠层顺序(stacking level)
- 深入理解 CAP 定理
- 全球唯一标识符:GUID在线生成
- linux 命令行 文件管理器,CLEX - 集成命令提示符、“多才多艺”的命令行文件管理器...
- JavaScript基础函数的配置对象Configuration Objects(020)
- C语言中可变参数的宏 __VA_ARGS__
- 嵌入式Ubuntu 搭建caffee环境
- ARM启动流程及启动代码分析
- 计算机无法添加打印机,无法添加打印机,教您无法添加打印机怎么办
- Python库安装之requirements.txt, environment.yml
- 基于MVC的简易图形编辑器
- H2数据库入门,看这篇就对了
- c语言编程输出皮卡丘,c语言001第一节课程-函数方式输出皮卡丘画 2019-06-24
- 大数据工程师四能力你拥有几种?
- W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x419b4c50)
- GEE引擎自定义进度条和自定义属性的脚本展示
- 计算机主机不通电,电脑主机不通电无法开机怎么解决
- 实习一月记——美团点评云计算部
- 【KALI使用】14 被动信息收集——RECON-NG(待完善