String不是基本数据类型,是Java提供的一个特殊类,也是一种特殊引用数据类型。
String有两种实例化的方式:
(1)String str = “Hello”;
(2)String str = new String(“Hello”);
【说明】
前者是通过直接赋值的方式实例化,会首先在“字符串池”中查找是否有”Hello”,若有则直接将str指向已存在的”Hello”,若不存在则会在堆内存中开辟存储空间来保存”Hello”,再将其在堆内存中的地址保存在str的栈内存中,在这之后要是有其他的String变量的值为”Hello”时,会将相同的地址赋给新变量。除此之外,当str的值发生变化时,不会去修改该堆内存(存储”Hello”的堆内存)中存储的内容,而是修改str栈内存的内容,只有当系统发现该堆内存(存储”Hello”的堆内存)中存储内容不再被任何对象使用时,才会启动垃圾回收机制,释放这一堆内存。
后者使用new来实例化String对象,会直接在堆内存中开辟一块空间来存储”Hello”,并将此堆内存地址赋给str的栈内存,不会考虑“字符串池”中是否存在”Hello”。
【心得】
按照上面的存储机制,相同Application中,所有通过直接赋值方法创建的,值为”Hello”的String对象,它们的栈内存中存储的内容都是一致的,都指向了堆内存中相同的位置。使用new实例化的String对象,其指向的堆内存不会被其他String对象指向,当其值发生改变或者对象被释放时,该堆内存也会被释放。
【举例】
String str = "Hello";
String str1 = new String("Hello");
if (str == str1)
{
System.out.println("step1 --- YES");
} else
{
System.out.println("step1 --- NO");
}
if (str.equals(str1))
{
System.out.println("step2 --- YES");
} else
{
System.out.println("step2 --- NO");
}
-----------输出结果-------------
step1 --- NO
step2 --- YES
------------------------------------
String对象的修改过程会产生一些中间堆内存,优化的方法是使用StringBuffer。
String常用的API
1.toCharArray() 将String转化为char数组(字符数组-----字符流)
String str = “Hello”;
char[] temp = str.toCharArray();
2.charAt(int pos) 取出String中第pos处的char
String str = “Hello”;
char temp = str.charAt(1);
println(temp);
-----------输出结果-------------
e
------------------------------------
3.getBytes() 将String转化为byte数组(字节数组----字节流)
String str = “Hello”;
byte[] bs = str.getBytes();
4.length() 返回String对象中包含的字符数量
String str = “Hello”;
int len = str.length();
println(len);
-----------输出结果-------------
5
------------------------------------
5.indexOf() 返回字符串中查找的字符的位置
String str = “Helool”;
str.indexOf(“H”); // 返回0
str.indexOf(‘H’); // 返回0
str.indexOf(“l”); // 返回2
str.indexOf(“l”, 3); // 返回5
str.indexOf(“a”); // 返回-1
6.split(String regex) //将String对象按照指定字符分割成为String数组
String temp = “a,b,c,d,e,f”;
String[] temps = temp.sqlit(“,”);
println(temps); // 输出数组内容
-----------输出结果-------------
a b c d e f
------------------------------------
7.toUpperCase() 将字符串全部转为大写
String temp = “heLLo”;
temp = temp.toUpperCase();
println(temp);
-----------输出结果-------------
HELLO
------------------------------------
8.toLowerCase() 将字符串全部转为小写
String temp = “HeLLo”;
temp = temp.toLowerCase();
println(temp);
-----------输出结果-------------
hello
------------------------------------
9.startsWith(String t) / endsWith(String t) 检测字符串开始/结尾内容
String str= “HTTP 1.1”;
Println(str.startsWith(“HTTP”));
Println(str.endsWith(“1.0”));
Println(str.endsWith(“1.1”));
-----------输出结果-------------
true
false
false
------------------------------------
10.equals() / equalsIgnoreCase() 字符串内容比较
(1)equals() 比较两个字符串内容是否完全一致
(2)equalsIgnoreCase() 忽略两个字符串字符大小写的情况下比较内容是否一致
String str = “Hello”;
String str1 = “Hello” , str2 = “heLLo”;
Println(str.equals(str1));
Println(str.equalsIgnoreCase(str2));
-----------输出结果-------------
true
true
------------------------------------
11.replaceAll(String b, String a) // 将字符串中的字符b全部替换成a
String str = “Hello”;
str = str.replaceAll(“l” , “x”);
Println(str);
-----------输出结果-------------
Hexxo
------------------------------------