当前位置: 代码迷 >> J2SE >> .新人问一下子char和 string
  详细解决方案

.新人问一下子char和 string

热度:37   发布时间:2016-04-23 20:06:04.0
.新人问一下char和 string
char的取值范围为0到65535,是特殊的int,是16位的,int把强转成char是不是直接截取后16位,我今天试了下,比如字符'一‘,对它加65536的倍数返回值还是本身,恰恰验证了我的想法,不知道是不是这样的?另外想问一下,string的长度是多少好像听别人说过,不是很理解哎
------解决思路----------------------
引用:
Quote: 引用:

前面说的是正确的。String内部是char[]实现的,长度看你赋什么值了
据说有长度限制,我也不是很清楚貌似

的确是有长度限制的,不过是一个非常大的值,普通使用可以不用考虑
------解决思路----------------------
引用:
如果使用 Sting str = "aaaa";的形式定义一个字,那么双引号里面的ASCII 字符最多只能有 65534 个。为什么呢?因为在class
文件的规范中, CONSTANT_Utf8_info 表中使用一个16 位的无符号整数来记录字的长度的,最多能表示 65536 个字节,而java class 文件是使用一种变体UTF-8来存放字符的,null 值使用两个字节来表示,因此只剩下 65536- 2 = 65534字节。也正是变体UTF-8 的原因,如果字符串中含有中文等非ASCII 字符,那么引号中字符的数量会更少(一个中文字符占用三个字节)。如果超出这个数量,在的时候编译器会报错。


这个只是 字符串字面量 定义时的长度。不是字符串类中所能表示的字符串的长度。
以下就是一个200M的大字符串:

char[] ch1=new char[200*1024*1024];
 String s=new String(ch1);
 System.out.println("200M的大字符串:"+s.length());

------解决思路----------------------
引用:
char的取值范围为0到65535,是特殊的int,是16位的,int把强转成char是不是直接截取后16位,我今天试了下,比如字符'一‘,对它加65536的倍数返回值还是本身,恰恰验证了我的想法,不知道是不是这样的?另外想问一下,string的长度是多少好像听别人说过,不是很理解哎


不一定是截取后16位,这个和处理器的大小端有关系。
new 出来的String长度最长是2147483647,也就是Integer.MAX_VALUE.
如果是"abc",这种创建,最大长度是65534。这跟常量池里面设置的大小有关。


CONSTANT_Utf8_info {
        u1 tag;
        u2 length;
        u1 bytes[length];
}
  相关解决方案