一、字符串具有不变性,即String类型变量被创建后,不可更改。
public class stringdemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a="艰苦奋斗第28天!";
String b="艰苦奋斗第28天!";//"艰苦奋斗第28天!"为常量字符串,多次出现时会被编译器优化,只创建一个对象
String c=new String(a);
String d=new String(b);
System.out.println(a==b);//a和b是同一个对象,返回true
System.out.println(c==d);//c和d是不同对象,返回false
//创建新对象,修改字符串
String s="德莱联盟";
s="欢迎来到"+s;//创建新对象
System.out.println(s);
}
}
字符串对象创建后的内存分配:
二、String类的常用方法:
1. 字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1
2. 使用 indexOf 进行字符或字符串查找时,如果匹配返回位置索引;如果没有匹配结果,返回 -1
3. 使用 substring(beginIndex , endIndex) 进行字符串截取时,包括 beginIndex 位置的字符,不包括 endIndex 位置的字符
练习:
public class stringdemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
String FileName="StringDemo.java";
String Email="wEAoe.@co";
//获取文件名后缀
int Spot=FileName.lastIndexOf(".");
String FileSuffix=FileName.substring(Spot+1, FileName.length());
System.out.println(FileSuffix);
if(Spot!=-1 && Spot!=0 && FileSuffix.equals("java")) {//包含.;.不在第一位;后缀为java。
System.out.println("java文件名为:"+FileName+",格式正确!");
}
else {
System.out.println("java文件名为:"+FileName+",格式不正确!");
}
//判断邮箱是否正确
int index1=Email.indexOf("@");
int index2=Email.indexOf(".");
if(index1==-1 ^ index2==-1 ^ index1>=index2) {
System.out.println("邮箱为:"+Email+",格式不正确!");
}
else {
System.out.println("邮箱为:"+Email+",格式正确!");
}
}
}
字符串处理:
public class stringdemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="艰苦奋斗Day29!";
System.out.println("转换为小写为"+str.toLowerCase());
System.out.println("转换为大写为"+str.toUpperCase());
System.out.println("索引为1的字符为"+str.charAt(1));
//转换为数组
byte[] s=str.getBytes();
System.out.println("转换为数组后为"+s);
for(int i=0;i<s.length;i++) {
System.out.println("第"+i+"位元素为"+s[i]+";");
}
//数组比较
String str2=new String("艰苦奋斗Day29!");
System.out.println(str==str2);
System.out.println(str.equals(str2));
}
}
结果:
注:
==: 判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象
equals(): 比较存储在两个字符串对象中的内容是否一致
package com.javalearn;
/*import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
*/
public class stringcount {
public static void main(String[] args) {
// TODO Auto-generated method stub
//BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//InputStream br=System.in;
String br="sfdhashoie发生科技&*%(hfshdfurnksla";
int len=br.length();
int count=0;
//byte[] a=br.getBytes();
for(int i=0;i<len;i++) {
if(br.charAt(i)=='s') {
count++;
}
}
System.out.println("s出现的次数是:"+count);
}
}
至于 StringBuilder 和StringBuffer ,它们基本相似,不同之处,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此一般情况下,如果需要创建一个内容可变的字符串对象,应优先考虑使用 StringBuilder 类。
示例:
public static void main(String[] args) {
// 创建一个StringBuilder对象,用来存储字符串
StringBuilder hobby=new StringBuilder("艰苦奋斗第30天!");
System.out.println(hobby);
}
StringBuilder类的方法:
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder str=new StringBuilder("艰苦奋斗第30天!");
str.append("奥利给!");
System.out.println(str);
str.insert(4,"的");
System.out.println(str);
String newstr=str.toString();
System.out.println("转换为String类型的"+newstr);
StringBuilder str4=new StringBuilder("fhjksdhjfiorfiorpow");
int n=str4.length();
for(int i=n;i>0;i-=3) {
str4.insert(i, ",");
}
System.out.println(str4);
}