String类概述
- 字符串是常量,创建之后不可改变
- 字符串字面值存储在字符串池中,可以共享
- String s = "hello";//产生一个对象,字符串池中存储
- String s = new String("hello");//产生两个对象,堆、池各存储一个
- jdk版本不同,字符串池存放位置不同,新版本一般放在堆中,旧版本一般放在方法区中;本篇暂定在方法区中,和堆先区分开,便于理解
package commonclass.stringclass;
public class Demo01 {
public static void main(String[] args) {
String name = "hello";//"hello"常量存储在字符串池中
name = "zhangsan";//"zhangsan"赋值给name变量,给字符串赋值时,并没有修改数据,而是重新开辟了一个空间
String name2 = "zhangsan";//栈中的地址和name一致
System.out.println(name==name2);//true
//字符串另一种创建方式
String str = new String("hello java");
String str1 = new String("hello java");
System.out.println(str==str1);//false
System.out.println(str.equals(str1));//true,比较的是内容
}
}
常用方法
length()
返回字符串长度
String content="java编程语言";
System.out.println(content.length());
//结果:8
charAt(int index)
返回某个位置的字符
String content="java编程语言";
System.out.println(content.charAt(4));
//结果:编
contains(String str)
判断是否包含某个字符串
String content="java编程语言";
System.out.println(content.contains("java"));
//结果True
toCharArray()
将字符串转换成数组
String content="java编程语言";
System.out.println(content.toCharArray());
//结果:
/*
j
a
v
a
编
程
语
言
*/
System.out.println(Arrays.toString(content.toCharArray()));
//结果:[j, a, v, a, 编, 程, 语, 言]
indexOf(String str)
查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1
String content="java编程语言,java开发 java测试";
System.out.println(content.indexOf("java"));
//结果:0
System.out.println(content.indexOf("java",5));//从下标为5开始找
//结果:9
lastIndexOf(String str)
查找str在当前字符串中最后一次出现的下标索引
String content="java编程语言,java开发 java测试";
System.out.println(content.lastIndexOf("java"));
//结果:16
trim()
去掉字符串前后的空格
String content = " java is good ";
System.out.println(content.trim());
//结果:java is good
toUpperCase()/toLowerCase()
将小写转成大写/转换成小写
String content = " java is good ";
System.out.println(content.toUpperCase());
//结果: JAVA IS GOOD
endWith(String str)/startWith(String str)
判断字符串是否以str结尾/判断字符串是否以str开头
String content = " java is good ";
System.out.println(content.endsWith(" "));//是否以空格结尾
//结果:true
replase(char oldChar,char newChar)
将旧字符串转换成新字符串
String content = " java is good ";
System.out.println(content.replace("java","python"));
//结果: python is good
split(String str)
根据str做拆分
String content = "java is good";
String[] contentIndex = content.split(" ");//用空格作为拆分条件
System.out.println(contentIndex.length);
//结果:3
for (String i: contentIndex) { //遍历contentIndex数组
System.out.println(i);
//结果:
/*
java
is
good
*/
}
String content = "java is good,python is nice";
String[] contentIndex1 = content.split("[ ,]");//用空格或者逗号进行拆分
for (String i:contentIndex1) {
System.out.println(i);
//结果:
/*
java
is
good
python
is
nice
*/
}
String content = "java is good,,python is nice";
String[] contentIndex2 = content.split("[ ,]+");//根据逗号和空格拆分,并且逗号和空格存在多个时
for (String i:contentIndex2) {
System.out.println(i);
//结果:
/*
java
is
good
python
is
nice
java
*/
}
equals()/compareTo()
字符串比较
package commonclass.stringclass;
public class Demo04 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO";
//equals()字符串内容比较
System.out.println(s1.equals(s2));//False
//equalsIgnoreCase()字符串内容忽略大小写比较
System.out.println(s1.equalsIgnoreCase(s2));//True
String s3="abc";//97
String s4="xyz";//120
//compareTo()字符串位置的比较,第一位相同,就比第二位
System.out.println(s3.compareTo(s4));//97-120=-23
String s5="abc";//97
String s6="abcdef";//120
//compareTo()上面两个参数,一个参数值是另一个参数值的开头,这种情况比的就是长度
System.out.println(s5.compareTo(s6));//-3
}
}
案例联系
需求:
已知String str = "this is a text";
1.将str中的单词单独获取出来
2.将str中的text替换为practice
3.在text前面插入一个easy
4.将每个单词的首字母改为大写
package commonclass.stringclass;
import java.util.Arrays;
public class Demo05 {
public static void main(String[] args) {
String str = "this is a text";
//1.将str中的单词单独获取出来
String[] strIndex = str.split(" ");
for (String i:strIndex) {
System.out.println(i);
}
//2.将str中的text替换为practice
System.out.println(str.replace("text","practice"));
//3.在text前面插入一个easy
System.out.println(str.replace("text","easy text"));
//4.将每个单词的首字母改为大写
//方式一
String[] strIndex1 = str.split(" ");
for (String i:strIndex1) {
char fist = i.charAt(0);
char upperfirst = Character.toUpperCase(fist);
i = upperfirst + i.substring(1,i.length());
System.out.println(i);
}
str = Arrays.toString(strIndex1);
System.out.println(str);
//方式二
/*
String[] strIndex2 = str.split(" ");
for (int i = 0; i < strIndex2.length; i++) {
char first = strIndex2[i].charAt(0);
char upeerfirst = Character.toUpperCase(first);
strIndex2[i]= upeerfirst + strIndex2[i].substring(1,strIndex2[i].length());
System.out.println(strIndex2[i]);
}
str = Arrays.toString(strIndex2);
System.out.println(str);
*/
}
}
可变字符串
- StringBuffer:可变长字符串,JDK1.0提供,运行效率慢,线程安全
- StringBuilder:可变长字符串,JDK5.0提供,运行效率快,线程不安全;单线程推荐使用这个
StringBuffer和StringBuilder常用方法
package commonclass.stringclass;
public class Demo06 {
public static void main(String[] args) {
//StringBuffer和StringBuilder的方法是一样的
//StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
//1. append()追加
sb.append("java");
System.out.println(sb.toString());
sb.append(" is good");
System.out.println(sb.toString());
//2.insert()添加
sb.insert(0,"编程语言:");
System.out.println(sb.toString());
//3.replace()替换
sb.replace(5,9,"python");
System.out.println(sb.toString());
//4.delete()删除
sb.delete(0,5);
System.out.println(sb.toString());
//5.清空
sb.delete(0,sb.length());
System.out.println(sb.length());
}
}