目录
(4)将字符串中的内容转为字符数组(String->char[])
一、JDK中String类的声明
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
String实现了多个接口,就具备了多种能力。
为什么String要用final修饰?
可以知道的是被final修饰的类无法被继承,所以String就不存在子类,这样的话就可以保证所有使用JDK的人,大家所用到的String类仅此一个。
二、创建字符串的四种方式
String str1="hello world";
String str2=new String("hello world");
char[] arr={'a','b','c'};
String str3=new String(arr);
String str4=String.valueOf(10);
1、直接赋值
String str=''hello world'';
2、通过String的构造方法产生对象
String str2=new String(''hello world'');
3、通过字符数组产生对象
char[] arr=new char[]{'a','b','c'};
4、通过String的静态方法valueOf(任意类型)
String str=String.valueOf(10);
三、String引用数据类型
1、字面量和字符串对象
String str=''hello world'';等号后面这一部分既是字面量,也是字符串对象。
2、字符串的比较
所有引用数据类型在比较时,等号hi用equals方法比较,JDK的常用类都已经重写了equals方法,大家直接使用即可。引用数据类型使用“==”比较的是地址是否相等。
注意,当牵扯到用户输入时,一定要做判空处理
如果使用第一种比较方法就会出现空指针异常,因为我们要比较的特定内容本身就是字符串字面量,一定不是空对象,把要比较的内容放在equals的前面,就可以方便处理name为空的问题。
3、关于字符串的常量池问题
可以发现,此第一个图中的str1,str2和str3使用“==”比较都返回了true,但是在第二个图中的又都返回了false,这是怎么回事呢?
当使用直接赋值法创建字符串对象时,JVM会维护一个字符串的常量池,若该对象在堆中还不存在,则产生一个新的字符串对象加入常量池中。当继续使用直接赋值法产生字符串对象时,JVM发现该引用指向的内容在常量池中存在了,则此时就不在新建字符串对象,而是复用已有的字符串对象。
4、手工入池
public native String intern();
String类提供的intern方法:
调用intern方法会将当前字符串引用指向的对象保存到字符串常量池中
①若当前常量池中已经存在了该对象,则不在产生新的对象,返回常量池中的String对象
②若当前常量池中不存在该对象,则将该对象入池,返回入池后的地址
对于str1.intern();这行代码来说,只是调用了一下,并没有接收intern方法的返回值,要想让str1等于str2,只需要接收一下返回值就行。
4、字符串的不可变性
所谓的字符串不可变指的是字符串的对象不可变
这里的不可变指的是"hello" "world" "helloworld" "helloworld!!!"这些字符串对象一旦声明后就不可修改其内容了。
String str1="hello";
str1=str1+"world";
str1+="!!!";
System.out.println(str1);
为何字符串的对象无法修改内容呢?
字符串其实就是一个字符数组,字符串保存的值实际上在数组中保存。
5、如何修改字符串内容
(1)在运行时ton过反射破坏Value数组的封装(不推荐使用)
(2)更换使用StringBuilder或者StringBufer类
如果需要频繁的进行字符串的拼接,就可以使用StringBuilder类的append方法
关于StringBuilder类的具体使用:
StringBuilder类和String类是两个独立的类,StringBuilder就是为了解决字符串拼接问题产生的,因为String的对象时无法修改的,为了方便字符的操作,产生了StringBuilder类,StringBuilder类的对象是可以改变的。
(3)String类和StringBuilder类的转换
①String类对象转换为StringBuilder类对象
StringBuilder sb=new StringBuilder("hello");
sb.append("123");
②StringBuilder类对象转换为String类对象
String str= sb.toString();
③StringBuilder类的其他方法
字符串反转操作,使用StringBuilder提供的reserse()方法
删除字符串指定范围的数据,使用StringBuilder提供的delete(int start,int end),删除从start索引开始到end的内容,[start,end)区间范围左闭右开。
插入操作,使用StringBuilder提供的insert(int start,各种数据类型),从索引为start开始插入任意类型的数据
五、字符串的其他常见操作
1、字符串比较
字符串的compareTo方法是按照字符串内部的每个数组进行ASCLL的比较
2、字符和字符串的相互转换
字符串的内部实际上就是使用字符数组存储的
(1)字符转换到字符串,通过字符串的构造方法
char[] ch=new char[]{'a','b','c'};
String str=new String(ch);
System.out.println(str);
(2)字符转换到字符串,通过字符串的有参构造实现
(3)字符串到字符
(4)将字符串中的内容转为字符数组(String->char[])
String str1="hello";
char[] data=str1.toCharArray();
System.out.println(data);
(5)判断一个字符串是否是纯数字组成
public static boolean isAllNumber(String str){
//将字符串转换为字符数组去处理
char[] data=str.toCharArray();
//遍历寻找反例
for (char a:data
) {
if (a<'0'||a>'9'){
return false;
}
}
return true;
}
(6)字符串和字节的相互转换
字节到字符串的转换按照ASCLL转换的
(7)字符串到字符的转换
其中getBytes() 方法是按照默认字符编码转为字节数组的
第二种是按照自定义字符编码转换的
在UTF-8编码下,一个汉字三个字节;在GBK编码下,一个汉字是两个字节
(8)字符串查找操作
String str="helloworld";
//1、判断一个字符串是否存在
System.out.println(str.contains("e"));
//2、从头开始查找字符串,找到了返回字符串位置开始索引,找不到返回-1
int a=str.indexOf("ello");
System.out.println(a);
//3、从指定位置开始查找子字符串位置
int b=str.indexOf("o",3);
System.out.println(b);
//4、由后向前查找子字符串的位置
int c=str.lastIndexOf("llo");
System.out.println(c);
//5、从指定位置从后向前查找
int d=str.lastIndexOf("llo",7);
System.out.println(d);
//6、判断是否以指定字符串开头
System.out.println(str.startsWith("he"));
//7、从指定位置开始判断是否以指定字符串开头
System.out.println(str.startsWith("llo",2));
//8、判断是否以指定字符串结尾
System.out.println(str.endsWith("ld"));
(9)字符串替换
String str="helloworld";
//1、替换所有指定的内容
String str1=str.replaceAll("l","-");
System.out.println(str1);
//2、替换首个字符内容
String str2=str.replaceFirst("l","-");
System.out.println(str2);
(10)字符串的拆分操作
注意:当按照指定的格式去拆分字符串得到了一个空数组时
①这个指定的格式在字符中不存在
②这个指定的格式是个特殊字符,需要转义处理"\\."
(11)字符串截取处理
(12)字符串的其他操作方法
将字符串的手字母大写
六、相关代码
任枭雄/rocket_class_Grammer - Gitee.com