java内部的字符串类型是通过对象来进行管理的,分为String类,StringBuffer类,以及StringBuilder类。三个类都实现了CharSequence[^CharSequence]接口,在java.lang中定义并被声明为final。
String类型实现了CharSequence[^CharSequence],Serializable[^Serializable],Comparable[^Comparable]三个接口,源码中主要的变量有两个:value[]和hash。
PRivate final char value[];private int hash;从上可以看出String类型是使用一个被声明为final的char数组来存储字符串,因此String类型的对象在声明之后不可更改 (注意虽然String类型声明后不可更改,但String类型的引用可以随时更换引用对象)
String name="abc";name="def";//name改变了引用的对象,但是在没有进行垃圾回收前//内存中仍然存在着"abc","def"两个字符串实例String类型内部有超过十种的构造函数,其中比较特殊的有以下几种: 1.String(char value[])
public String(char value[]) { this.value = Arrays.copyOf(value, value.length);//调用Arrays的copyOf()方法拷贝数组 }2.String(char value[], int offset, int count)
public String(char value[], int offset, int count) {//指定了数组中的开始和结尾 if (offset < 0) { throw new StringIndexOutOfBoundsException(offset); } if (count <= 0) { if (count < 0) { throw new StringIndexOutOfBoundsException(count); } if (offset <= value.length) { this.value = "".value; return; } } // Note: offset or count might be near -1>>>1. if (offset > value.length - count) { throw new StringIndexOutOfBoundsException(offset + count); } this.value = Arrays.copyOfRange(value, offset, offset+count); }3.String(byte bytes[], int offset, int length, Charset charset)
public String(byte bytes[], int offset, int length, Charset charset) { //指定特殊的字符集来讲bytes数组中的一部分转换为字符串 if (charset == null) throw new NullPointerException("charset"); checkBounds(bytes, offset, length); //检查指定的子数组是否越界 this.value = StringCoding.decode(charset, bytes, offset, length); }1.获取字符串长度的函数length()
public int length() { //返回数组的长度 return value.length; }2.除了new显示构造一个String实例,也可以直接将字符串字面值当做对象使用
System.out.println("abc".length());//结果显示为33.一般来说,Java不允许对字符串对象使用运算符,但可以使用“+”号来连接字符串,会以生成一个新的字符串对象作为结果。 同时,也可以使用“+”号来连接字符串与非字符串对象,编译器会自动将非字符串类型转换为字符串类型操作(因此在字符串与其他类型在一起的时候要特别小心)
System.out.println("abc"+"def");//结果显示为abcdef//注意由于String类型的特点,此时内存里有abc,def,abcdef三个字符串实例System.out.println("abc"+3+3);//结果为abc33而不是abc6在上面的连接操作中,Java实际上调用了String的类型转换方法valueOf()方法来实现的
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }可见实际上是调用了Object类型的toString()方法(因此可以通过重载子类型的toString()方法来改变valueOf()的结果)
对字符串操作的其中一大部分就是对其中部分字符的提取,String类型中提供了大量的提取字符的方法。 1.charAt(int index)提取单个位置的字符
public char charAt(int index) { if ((index < 0) || (index >= value.length)) { throw new StringIndexOutOfBoundsException(index); } return value[index]; }2.public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) { if (srcBegin < 0) { throw new StringIndexOutOfBoundsException(srcBegin); } if (srcEnd > value.length) { throw new StringIndexOutOfBoundsException(srcEnd); } if (srcBegin > srcEnd) { throw new StringIndexOutOfBoundsException(srcEnd - srcBegin); } System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin); //调用System的arraycopy方法 }[1]:
新闻热点
疑难解答