1.了解Java String类:
1.1 String类:
String类代表字符串。Java程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。 java字符串在内存中采用unicode编码方式,任何一个字符对应两个字节的定长编码,即任何一个字符(无论中文还是英文)都算一个字符长度,占用两个字节。
java.lang.String java.lang.String类使用了final修饰,不能被继承。
1.3 String类所有已实现的接口:
Serializable, CharSequence, Comparable<String>
1.4 创建字符串对象的两种方式及区别:
(1)直接赋值创建: String str="hello";//直接赋值的方式 直接赋值方式创建对象是在方法区的常量池。 (2)构造方法创建: String str=new String("hello");//实例化的方式 通过构造方法创建字符串对象是在堆内存。
String的构造方法: String() 初始化一个新创建的 String 对象,使其表示一个空字符序列。 String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 String(byte[] bytes, Charset charset) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。 String(byte[] bytes, int offset, int length) 通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。 String(byte[] bytes, int offset, int length, Charset charset) 通过使用指定的 charset 解码指定的 byte 子数组,构造一个新的 String。 String(byte[] bytes, int offset, int length, String charsetName) 通过使用指定的字符集解码指定的 byte 子数组,构造一个新的 String。 String(byte[] bytes, String charsetName) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。 String(char[] value) 分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。 String(char[] value, int offset, int count) 分配一个新的 String,它包含取自字符数组参数一个子数组的字符。 String(int[] codePoints, int offset, int count) 分配一个新的 String,它包含 Unicode 代码点数组参数一个子数组的字符。 String(String original) 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。 String(StringBuffer buffer) 分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。 String(StringBuilder builder) 分配一个新的字符串,它包含字符串生成器参数中当前包含的字符序列。
当我们再一次的new一个String对象时:
1.5 String是不可变对象:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];
例2:
public class Immutable { public static String upcase(String s) { return s.toUpperCase(); } public static void main(String[ ] args) { String str1= "Hello World"; System.out.println(str1); //Hello World String str2 = upcase(str1); System.out.println(str2); //HELLO WORLD System.out.println(str1); //Hello World } }
例3:
//Hello World !!!
内存分析:

通过以上的分析可以发现:字符串内容的更改,实际上改变的是字符串对象的引用过程,并且会伴随有大量的垃圾出现,在实际开发中应该避免。
1.6 String的相等问题(== 和 equals):
(1)使用String类经常需要对两个字符串进行对比,看是否相等有==和equals两种选择,这两者方法区别很大:
//fasle ;
; //true ; temp=1; //false
例4: ; int temp=1; //true
//falseString的intern()方法://+的用法//flase// true (intern的含义)//flase//false//true
1.7 String常量池:
classpublic static void= "Hello"//不会创建新的String对象,而是使用常量池中已有的"Hello",== str2); ////使用new关键字会创建新的String对象new String("Hello"== str3); //false
1.8 创建了几个对象的问题:
1 String str1 = "abc"; 2 String str2 = new