String对象是不可变的,每一个看起来修改String的方法,起始都是创建了一个全新的String对象,以包含修改后的字符串内容,而最初的String对象丝毫未变。
public class Immutabe {
public static String upcase(String s){
return s.toUpperCase();
}
public static void main(String args[]){
String q="howdy";
System.out.println(q);//howdy
String qq=upcase(q);
System.out.println(qq);//HOWDY
System.out.println(q);//howdy
}
}
String a =new String("abc");
String b =new String("abc");
String c="abc";
String d="abc";
System.out.println(a==b+"a------------b");//false
System.out.println(" -----"+a.equals(b)+"------a equsla b--------------");//true
System.out.println(" -----"+c==d+"-----c----------------------d");//false
System.out.println(" -----"+c.equals(d)+"-c equals ----------------d");//true
System.out.println(" -----"+a==c+"--------a--------------------c");//false
System.out.println(a.equals(c)+"---------a--++++++++++++++++++++c");//true
当q传给upcase的时,实际传递的是引用的一个拷贝。每当把String对象当做方法的参数时,都会复制一个引用,该引用所指的对象其实一直呆在单一的物理位置上,所有指向Stirng对象的引用都不可能修改他的值
String mongo ="mongo";
String s="abc"+mongo+"666";
System.out.println(s);//abcmongo666
在这里,其实是先创建依赖一个StringBuilder对象,用来构造最终的String,为每一个字符串调用一次StringBuilder的append()方法,总计三次,最后toString生成结果。
如果你要在toString方法中使用循环,最好自己创建一个StringBuilder对象
public class usingStringBuilder {
public static Random rand=new Random(47);
public String toString(){
StringBuilder result=new StringBuilder("[");
for (int i=0;i<25;i++){
/**
* public StringBuilder append(int i) {
* super.append(i);
* return this;
* }
*/
result.append(rand.nextInt(100));
result.append(",");
}
/**
* public StringBuilder delete(int start, int end) {
* super.delete(start, end);
* return this;
* }
*/
result.delete(result.length()-2,result.length());
result.append("]");
return result.toString();
}
public static void main(String[] args){
usingStringBuilder usingStringBuilder=new usingStringBuilder();
System.out.println(usingStringBuilder);
//[58,55,93,61,61,29,68,0,22,7,88,28,51,89,9,78,98,61,20,58,16,40,11,22,]
}
}
String的常用方法
public class StringMethod {
public static void main(String args[]) {
String str = "自己菜就要知道,“好好加油";
String str1 = "to be Best";
//length()获取字符串的长度
System.out.println(str.length());//13
//charAt()获取指定位置的字符0 1 2 3 4 5..
System.out.println(str.charAt(3));//就
//获取某个字符在字符串中第一次出现的位置
System.out.println(str.indexOf('菜'));//2
//从指定的位置截取字符串
System.out.println(str.substring(5));//知道,“好好加油
//从指定的位置截取字符串
System.out.println(str.substring(5, 8));//知道,
//判断是否与字符串是否相同。忽略大小写
System.out.println(str.equalsIgnoreCase("自己菜就要知道,“好好加油"));//true
System.out.println(str1.equalsIgnoreCase("to be best"));//true
System.out.println(str1.equalsIgnoreCase("to bebest"));//false
//判断起始字符
System.out.println(str1.startsWith("t"));//true
System.out.println(str1.startsWith("a"));//false
//判断字符串对象是否以指定的字符开头,参数toffset为指定从哪个下标开始
System.out.println(str1.startsWith("o", 1));//true
System.out.println(str1.startsWith("o", 2));//false
System.out.println(str1.endsWith("t"));//true
//判断是否为空
System.out.println(str1.isEmpty());//fasle
//去除两端空格
String str2 = " string test to be better";
System.out.println(str2); // string test to be better
System.out.println(str2.trim());//string test to be better
String array[] = str2.split("t");
printString(array);
//字符串装换为字符数组
System.out.println(str2.toCharArray());
//将指定的字符替换
System.out.println(str2.replace('t','P'));
//查看字符串中是否含有指定字符
System.out.println(str2.contains("o"));
//添加字符
System.out.println(str2.concat("susu"));
}
public static void printString(String a[]) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
}
}}