1.字符串的特点
•java.lang.String使用了final修饰,不能被继承;
- 字符串底层封装了字符数组及针对字符数组的操作算法;
- 字符串一旦创建,对象内容永远无法改变,但字符串引用 可以重新赋值;
•Java字符串在内存中采用Unicode编码方式,任何一个字 符对应两个字节的定长编码。
2.常用方法
ndexOf方法
int indexOf(String str)
检索当前字符串中给定字符串的位置.如果当前字符串不 包含给定内容时返回值为-1.
package string;
/**
*int indexOf(String str)
*检索当前字符串中给定字符串的位置.如果当前字符串不包含给定内容时返回值为-1.
*/
public class IndexOfDemo {
public static void main(String[] args)
{
// 0123456789012345
String str = "thinking in java";
//查找in在当前字符串中第一次出现的位置int index = str.indexOf("in"); System.out.println(index);//2
//从指定位置开始检索第一次出现给定字符串的
位置
index = str.indexOf("in",3); System.out.println(index);//5
//检索最后一次出现给定字符串的位置
index = str.lastIndexOf("in");
3. 去除当前字符串两边的空白字符
package string11;
/**
* String trim()
* 去除当前字符串两边的空白字符
*/
public class TrimDemo {
public static void main(String[] args) {
String str = " hello ";
System.out.println(str);
String trim = str.trim();//trim方法返回后的字符串不含有两边的空白字符
System.out.println(trim);
}
}
4.将当前字符串中的英文部分转换为全大写或全小写
package string11;
/**
* String toUpperCase()
* String toLowerCase()
* 将当前字符串中的英文部分转换为全大写或全小写
*/
public class ToUpperCaseDemo {
public static void main(String[] args) {
String str = "我爱Java";
System.out.println(str);
String upper = str.toUpperCase();
System.out.println(upper);
String lower = str.toLowerCase();
System.out.println(lower);
}
}
5.判断当前字符串是否是以给定内容开始或结尾的
package string11;
/**
* boolean startsWith(String str)
* boolean endsWith(String str)
* 判断当前字符串是否是以给定内容开始或结尾的
*/
public class StartsWithDemo {
public static void main(String[] args) {
String str = "www.tedu.com";
//查看str是否是以"www."开始的
boolean starts = str.startsWith("www.");
System.out.println(starts);
boolean ends = str.endsWith(".cn");
System.out.println(ends);//false
ends = str.endsWith(".com");
System.out.println(ends);//true
}
}
6.String提供了一组重载的valueOf方法,作用是将其他类型转换为String.
package string11;
/**
* String提供了一组重载的valueOf方法,作用是将其他类型转换为String.
* 注:这些valueOf都是静态方法
*/
public class valueOfDemo {
public static void main(String[] args) {
int a = 123;
String str = String.valueOf(a);
double dou = 123.123;
String str2 = String.valueOf(dou);
System.out.println(str);
System.out.println(str2);
String str3 = a + "";
System.out.println(str3);
}
}
7.返回当前字符串中指定下标处对应的字符
package string11;
/**
* char charAt(int index)
* 返回当前字符串中指定下标处对应的字符
*/
public class CharAtDemo {
public static void main(String[] args) {
// 0123456789012345
String str = "thinking in java";
//获取第5个字符是什么?
char c = str.charAt(4);
System.out.println(c);
// 0 1 2 3 5 6 7 8
String line = "上海自来水来自海上";//回文
for(int i=0;i<4;i++){
//获取正数位置上的字符
char c1 = line.charAt(i);
//获取倒数位置上的字符
char c2 = line.charAt(line.length()-1-i);
if(c1 != c2){
System.out.print("不");
break;
}
}
System.out.println("是回文!");
}
}
8.常量池
java对字符串有一个优化措施:字符串常量池.
java推荐我们使用字面量形式创建字符串,并且会缓存所有使用字符串字面量形式创建的字符串对象,当使用相同 字面量再次创建字符串时会重用对象来减少内存开销,避 免内存中堆积大量内容相同的字符串对象.
package string;
public class StringDemo {
public static void main(String[] args){
String s1 = "123abc"; System.out.println("s1:"+s1);
//由于s1使用该字面量创建过字符串对象,因此
s2会重用这个对象
String s2 = "123abc"; System.out.println("s2:"+s2);
System.out.println(s1 ==s2);//true,地址相同
String s3 = "123abc"; System.out.println(s1 == s3);
//true s2 = s2 + "!";//修改字符串内容会创建新对 象 !
System.out.println("s2:"+s2);//123abc!
System.out.println("s1:"+s1);//123abc
System.out.println(s1 == s2);//false
String s4 = new String("123abc");//new会创建新对象
System.out.println("s4:"+s4);
System.out.println(s1 ==s4);//false,地址不相同
//实际开发中比较字符串的需求都是比较内容,都应当使用equals进行比较!!!
System.out.println(s1.equals(s4));//true,字符串内容相同
/*
这里触发了编译器的一个特点:
编译器在编译源代码时,只要一个计算表达式可以在编译期间确定结果的,编译器一定
进行计算,并将结果编译到字节码文件中.因此下面的代码会被编译器改为:
String s5 = "123abc";
因此s5在JVM进行执行时会重用s1对象.
*/
String s5 = "123" + "abc";
System.out.println("s5:"+s5);
System.out.println(s1 == s5);//true
String s = "123";
String s6 = s + "abc";//修改内容创建新对象
System.out.println("s6:"+s6);
System.out.println(s1 == s6);//false
}