String类的定义及使用方法

定义

String是不可改变的对象
java.lang.String使用了final修饰,不能被继承,字符串一旦创建,对象将永远无法改变,但字符串引用可重新赋值。
String的特点
String类型也就是我们所谓的“字符串类型”,字符串类型对象不可改变,字符串引用变量可以改变。在基本类型(8个)用 == 比较值的大小:int a=9;int b=10;if(a == b){}在引用变量中“==”比较的是:是否指向同一个对象或者是否指向同一个常量池.

String s1 = "ABC";
String s2 = s1;
String s3 = "ABCDEF";
s1 = s1+"DEF";//字符串拼接
System.out.println(s1);//ABCDE
System.out.println(s2);//ABC
System.out.println(s1==s3);//false

String常量池
java为提供性能,静态字符串(字面量/常量/字符串连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串
对应重复出现的字符串,JVM会首先在常量池中查找,如果存在即可返回该对象.

String s1="abc";//不能改变,加拼接符可以改变
String s2=s1;
/*
* “==”用于基本类型比较变量的值大小
* 在引用变量中:说明两个引用是否指向同一个对象
*/
System.out.println(s1==s2);//true
String s3=“abc”;
String s4=“abc”;
//s3和s4引用同一个对象,优点是重用字符串对象。
System.out.println(s3==s4);//true
String s5="a";
String s6=s5+"bc";//变量连接的结果(“abc”)
//创建动态新字符串对象,不会被常量池优化,与静态字符串“abc”不是同一个对象
System.out.println(s3==s6);//false
//这里的字符串对象的参数是常量池中的字符串对象“ABC”
String s7=new String("abc");
System.out.println("s3==s7");//false

经典题型

执行以下代码过程中,创建了几个字符串对象?
String str = new String(“DEF”);//2
String s1=new String(“a”+“bc”);//2

String类的相关常用方法

length()

/*
*使用length()方法检查字符串的个数(字符串的长度),返回int类型
*/
String str="今天真适合敲代码.";
int n=str.length();
System.out.println(n);//9

int[] arr={1,2,3,4,5};
int n1 = arr.length;
System.out.println(n1);//5

/*
*String提供了charAt方法,获取指定位置上的字符,返回一个char类型
*/
char ch = str.char(2);
System.out.println(ch);//真

//利用length方法和charAt方法配合可以实现遍历字符串中每个字符
for(int i=0;i<str.length();i++){
	char c=str.chartAt(i);
	System.out.print(c);//今天真适合敲代码.
}

indexOf()

String str = "https://www.baidu.com";
//在字符串str中检查斜线“/”出现的位置,如果找到一个字符的位置,就返回这个位置,如果没有找到指定字符,则返回-1;
int n = str.indexOf("u");
n=str.indexOf("com");
//String提供了indexOf(String str,int index)从index下标开始检查,检查到str,返回str的检索/下标位置,如果米有搜索到则返回-1
n = str.indexOf("ht",7);
//从后面向前查找,提供lastIndexOf(String str)
n = str.lastIndexOf("/");
int s = str.indexOf(97);//char('a')---->97
byte[] a = str.getBytes();
System.out.println(Arrays.toString(a));//输出的是ASCII编码

subString(起始位置,结束位置)
截取字符串

String str = "http://www.baidu.com";
//String类提供了subString(int beginIndex,int endIndex),含头不含尾(含开始的下标,不含结束的下标)
String s = str.substring(0,4);//截取下标0-4之间的字符http
//截取域名“baidu.com”
String s1 = str.substring(11,20);
//从7开始连续截取4个字符
String s2 = str.substring(7,7+4);
//截取str中的com
//String提供了substring(int index)方法,从起始位置到最后全部截取为子字符串
String s3 = str.substring(16,19);
String s4 = str.subString(16);
//动态截取URL中主机名
//http://xiaoming.org/index.html
String url = "http://xiaoming.org/index.html";
int index = url.indexOf("/",7);
String host = url.substring(7,index);
//截取URL中的文件名可以利用lastIndexOf()
int index1 = url.indexOf("l",18);
String text = url.substring(18,index1);

trim
去除字符串两端的空白

//去除字符串两端的空白,trim()如果两字符串两端有空白则返回这个字符串的一个两端没有空白的副本
String str="    Tom  ";
str=str.trim();
str=" T O M ";//trim()只能去除两端的空格,并不能去除字符中间的空格
String s = " Tom";
//正本和副本是不一样的,但是在常量池中没有
String s1 = s.trim();//Tom
System.out.println(s==s1);//false
//在常量池中没有Tom,生产的副本不在常量池中
String s2 = "Tom";

//前后内容并没有改变,常量池中仍旧是同一个对象
String s3 = "Jerry";
String s4 = s3.trim();
System.out.println(s3==s4);//true

String name = " Tom";
name.trime();//并没有赋值,答案仍旧是“TOM”

split
String类提供了split(),split(String str) str是分隔符返回一个字符串数组

String str = "你好,翠花,我是李狗蛋,我喜欢你";
String[] strArr = str.split(",");
for(int i=0;i<strArr.length;i++){
	System.out.println(strArr[i]);
}

StringBulider
StringBulider是可变字符串,建议采用,StringBulider实现,这样性能可能会好点
StringBuffer和StringBulider区别
1、StringBuffer是线程安全的,同步处理,性能稍慢;
2、StringBulider是线程不安全的,并发处理的,性能稍快;如果我们不考虑线程安全问题,则选择性能快的StringBulider
@since 始于JDK版本
@see java.lang.StringBuilder参见

//方法功能说明@param   参数,@return "" ,@throws  抛出异常
public String test(){
	return "";
}
String Bulider sb = new StringBulider();
//StringBulider类中提供了append增加方法,insert()减少方法delete()删除方法
sb.append("java");
sb.append("php");
//把StringBulider转换成String类型,在StringBulider类调用toString()方法
String str = sb.toString();
//insert(int offset,String str);offset:插入位置(下标),str:插入指定的字符串
sb.insert(4,"c#");
/*
*删除指定的字符串
*sb.delete(int start,int end)
*start:删除指定字符的启始位置
*end:删除指定字符串的结束位置
*含头不含尾
*/
sb.delete(7,10);
StringBulider sb2 = new StringBuilder();
sb2.append("您好").append("我是翠花").insert(2,"狗蛋你好").delete(7,9);
System.out.println(sb2.toString());

startsWith(),endWith()
@Test//类似于main方法

@Test
public void testStartWith(){
//String类提供了startWith(String str)检测一个字符串是否以指定字符串开头
String str = "http://www.baidu.com";
if(str.startsWith("http")){
	System.out.println("是");
	} else {
		System.out.println("否");
	}
}
//String类提供了endWith(String str)就按照一个字符是否以指定字符串结尾
String str = "http://www.baidu.com";
if(str.endsWith("com")){
	System.out.println("T");
	} else {
		System.out.println("F");
	}
}