首先String类属于java.lang包中的一个final类,即String类不可以被继承。
我们经常使用这两种方式来创建一个新的字符串:
1. String str="123";
2. String str=new String("abc");
尤其第一种方式在我们写代码时用的更多,这两种方式存在一定的区别,主要因为JVM为了减少字符串对象重复创建造成的内存开销。
在JVM中有一段特殊的内存称为常量池。当我们使用第一种方式创建字符串对象时,JVM首先会在常量池中寻找是否有相匹配的字符串对象,
如果有,直接拿出来使用,将变量直接指向字符串对象,不再创建新的字符串对象。如果没有,就在常量池中创建新的字符串对象。
比如:
String s1="abc";
String s2="abc";
创建s2的时候常量池中已存在“abc”的对象,这是s1和s2会指向同一个对象。
System.out.println(s1==s2); //输出是true
对于第二种方式创建字符串对象,JVM会在堆内存中直接创建一个新的对象,只要new,就会有一个新的对象产生。
String s1=new String("abc");
String s2=new String("abc");
这是堆内存会有两个String对象,分别由s1和s2指向。
System.out.println(s1==s2); //输出是false 因为两个引用指向两个对象,地址不同
提示:字符串对象一旦被声明就不能再被改变,对字符串操作都是返回一个新的字符串或者其他类型数据。
String类中一些方法:
1.static String valueOf()
String提供了一组重载的静态方法valueOf,作用是将其他类型转换为字符串类型,常用语java基本类型转换为字符串。
例如:
int i=123;
String str=String.valueOf(i);
System.out.println(str); //输出123
System.out.println(str+3); //输出1233
2.int length()
返回字符串的长度。
例如:
System.out.println("123".length()); //输出为3,代表当前字符串长度为3
3.int indexOf()
返回给定字符串在当前字符串的位置
例如:
String str1="我爱学习";
System.out.println(str1.indexOf("爱")); //输出为1 (位置从0开始)
String str2="上海啊我爱你上海";
System.out.println(str2.indexOf("上海",2)); //输出为6 这是从第二个位置开始寻找匹配的字符串,重载方法 int indexOf(String str, fromIndex)
4.char charAt()
返回当前指定位置的字符。
例如:
String str="1234567";
Char ch=str.charAt(3);
System.out.println(ch); //输出4
5.String substring(int start,int end)
截取当前字符串指定位置的字符串并返回,就是取子串。java中通常不包含end指定的字符。
例如:
System.out.println("我喜欢小泽老师和苍老师".substring(0,7)); //输出 我喜欢小泽老师
6.String toUpperCase(),String toLowerCase()
将当前字符串的英文部分转换为大写或者小写
例如:
String str="abc123";
System.out.println(str.toUpperCase()); //输出为 ABC123
7.String trim()
去除当前字符串中的空白
例如:
String str=" abc ";
System.out.println(str); //输出为 " abc "(并没有引号,只是为了表示有空白)
System.out.println(str.trim()) ; //输出为“abc”
8.boolean startWith(String str), boolean endWith(String str)
判断字符串是否以给定字符串开头或者结尾
例如:
String str="我身高1米8啊";
System.out.println(str.startWith("我")); //输出为 true
9.String concat(String str)
将指定的字符串连接至当前字符串末尾
例如:
String str="123";
str.concat("456");
System.out.println(str); //输出结果为 123456
10.String replace(char oldChar, char newChar)
将指定的字符替换为新的指定字符
例如:
String str="123";
String str2=str.replace("2", "3");
System.out.println(str2); //输出为133
11.boolean matches(String regx)
判断当前字符串是否符合正则表达式
例如:
String regx="a\\d?";
String str="abc";
System.out.println(str.matches(regx)); //输出为false 因为正则要求以a开头接着有0个或1个数字
12.String []split(String regx)
以给定正则内容来分割字符串并返回一个字符串数组
例如:
String s="我爱你,爱着你,就像老鼠爱大米";
String []str=s.split(",");
for(String string:str){
System.out.println(string);
} //遍历str,输出为 我爱你 爱着你 就像老鼠爱大米
13. char[] toCharArray()
将当前字符串返回一个字符数组
例如:
String str="1234asdf";
char []ch=str.toCharArray;
for(int i=0;i<ch.length,i++){
system.out.println(ch[i]);
} //将会将char数组中的每一个元素输出,输出为 1 2 3 4 a s d f
以上是比较基本简单的String类给我们封装的方法,在平时都可能用得到,而其中大部分几乎都要重载方法,这里我没有写出来,
其实相差不是很大,基本都很容易懂。
另外在String类中还重写了两个重要的方法:
public boolean equals(Object obj) //可以比较字符串内容是否匹配
public String toString() //返回一个字符串
其源码是:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
public String toString(){
ruturn this; //返回其本身
}