java-String方法
1、String的两种类创建方式
//第一种:
String name1="Tom";
String name2="Tom";
//==在引用类型中比较地址
System.out.println(name1==name2);
//第二种:
String name3 = new String("lucy");
String name4 = new String("Lucy");
System.out.println(name3==name4);//另外开辟常量池
编译结果:
true
false
第一种中Tom是存在于常量池中,name1,name2均保存在栈中,常量池中Tom有一个地址,name1和name2中存放的就是Tom的地址,编译时会优先在常量池中寻找是否已经存在有Tom,有的话直接将地址存进需赋值的name1或name2栈中,。
第二种中会另外开辟常量池来存放Tom,所以name3和name4中Lucy的地址是不同的,在用==比较是结果即为false。
注: = =在引用类型中是用来比较地址的。
2、String中的常用方法
length(),startsWith(),endsWith(),equals(),equalsIgnoreCase(),
indexOf(),lastIndexOf(),substring(),trim(),replaceAll(),split()
String name1="Welcome to ZZU university.";
System.out.println(name1.length());//得到字符串长度
System.out.println(name1.startsWith("Wel"));//判断字符串是否以某个字符串开头
System.out.println(name1.endsWith("sity."));//判断字符串是否以某个字符串结尾
System.out.println(name1.equals("Welcome to ZZU university."));//判断两个字符串是否相同
System.out.println(name1.equals("welcome to ZZU university."));
System.out.println(name1.equalsIgnoreCase("welcome to ZZU university."));//忽略大小写判断两个字符串是否相同
String letters = "abcdef";
System.out.println(letters.indexOf("a"));//获取某个字符串在原来字符串中第一次出现的位置,从0开始查找
System.out.println(letters.indexOf("d"));
System.out.println(letters.indexOf("bcd"));//将bcd看做一个整体
letters = "abcdedcba";
System.out.println(letters.lastIndexOf("b"));//获取某一个字符串第一次出现的位置,从最后一个字符开始找,但位置仍从第一个开始数
String sub = letters.substring(0);//从第0个字符开始截取到最后,再赋值给变量
System.out.println(sub);
sub = letters.substring(1);//从第0个字符开始截取到最后,再赋值给变量
System.out.println(sub);
//重写:
sub = letters.substring(1,4);//从位置为1的字符(b)开始截取,直到位置为4(e)的字符,但不包括位置为4的字符
System.out.println(sub);
String name = " T o m ";
System.out.println(name.length());//返回字符串长度,包括空格
System.out.println(name.trim());//去掉字符串左右两边的所有空格
System.out.println(name.trim().length());//得到去掉空格后的字符串长度
String name1="Tim#july#Jack";
name1 = name1.replaceAll("#", "&");//把字符串中#改成&
System.out.println(name1);
String [] name2 = name1.split("&");//把字符串按&分割成数组
for(String n:name2) {
System.out.println(n);//输出数组里的元素
}
其中很多方法都存在重写的形式。
4.String与StringBuffer
Student student = new Student();
System.out.println(student);//直接输出对象时,调用对象的 toString方法返回值结果
//可以通过在对象中重写 toString方法来验证
String name0 = new String("Ketty");//创建了两个String类型对象
String name1 = "Jim";//一个String类型对象
String name2 = "Ka"+"te";//一个String类型对象
String str = "To";
String name3 = str+"mmy";//创建两个String类型对象
String letters = "a";
for(int i=1;i<3;i++) {
letters = "a"+letters;
}//共创建了3个String类型对象,每循环一次创建一次新的对象
StringBuffer sb = new StringBuffer("a");
for(int i=1;i<3;i++) {
sb.append("a");//拼接
}//只有创建一个对象
System.out.println(sb.toString());//转换为String类型
System.out.println(sb.length());//返回长度
sb = new StringBuffer("abcde");
System.out.println(sb.reverse());//将字符反转
总结: 可以用StringBuffer来节省内存
4.==和equals的区别
1.对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。
“==”比较两个变量本身的值,即两个对象在内存中的首地址。
“equals()”比较字符串中所包含的内容是否相同。
2.对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
3.如果是基本类型比较,那么只能用 ==来比较,不能用equals,如int 类型的变量在用equals时编译不能通过。
public class Test {
public static void main(String[] args) {
//String equals ==
//基本数据类型比较值
int a=12;
int b=12;
System.out.println(a==b);
System.out.println(12==12);//二者等价相同,都是只的比较
//引用类型比较地址
Test t1 = new Test();//实例化
Test t2 = new Test();
System.out.println(t1==t2);//二者地址不同,存放于不同的栈
//String中的equal只是比较内容是否相同
String name1 = "Tom";
String name2 = "Tom";
Object obj = name2;
System.out.println(name1.equals(obj));//此处查看equals底层代码,String中的equals是Object中的equals的重写,Object中的equals只是比较地址
Test test = new Test();
obj = test;
System.out.println(name1.equals(obj));//二者地址就不相同,并且obj不属于String类型,在第一个if和第二个if中就不成立,返回false
String name3 = new String("Tom");
obj = name3;
System.out.println(name1.equals(obj));//obj下转型为String
String name4 = new String("To");
obj = name4;
System.out.println(name1.equals(obj));//比较长度是否相同
}
}
编译结果为:
true
true
false
true
false
true
false
equals原代码分析:
//==与equals
//==:基本数据类型比较值是否相等;引用类型比较地址是否相同
int a=0;
double b=0.0;
System.out.println(a==b);
String str1 = new String("Jim");
String str2 = new String("Jim");
System.out.println(str1==str2);
//equals
//Object类中equals比较的是地址是否相等;String类重写了equals,比较两个字符串内容是否相同
String name1 = "Jim";
String name2 = "Jim";
System.out.println(name1.equals(name2));
System.out.println(name1.equals(new Test()));
//equals源代码:
public boolean equals(Object anObject) {abObject变量存的是上转型对象的地址
if (this == anObject) {//比较地址是否相同(若相同则为同一个对象,则内容也一定相同)
return true;
}
if (anObject instanceof String) {//判断anObject变量所指向的对象是否是String类型
String anotherString = (String)anObject;//将上转型对象下转型
int n = value.length;//调用equals方法的String对象每个字符组成的char类型数组的长度
if (n == anotherString.value.length) {//判断两字符串长度是否相同
char v1[] = value;//用调用equals方法的String对象每个字符组成的char类型数组给v1赋值
char v2[] = anotherString.value;//用anObject字符串每个字符组成的char类型数组给v2赋值
int i = 0;
while (n-- != 0) {//判断每一位字符是否相同
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}