一、字符串最大的特点:一旦被初始化就不可以改变。
String s=”abc”;《==》String s=new String(“abc”);
s是一个类类型变量,“abc”是一个对象。
不改变的是对象,而不是引用。
s1=”kk”;
这时打印s1是kk的原因是:对象的引用指向了kk对象,不再指向abc对象。abc对象在堆中还在。
二、String中的equals方法
public class StringDemo {
public static void main(String[] args) {
String s1="abc";
String s2=new String("abc");
String s3="abc";
System.out.println(s1==s3);
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
}
输出:false,true ,true
①s1==s2判断的是引用是否相同,明显是new了两个对象,所以引用不同为false。
②if(s1==s3)为真
s1和s3都是常量,在方法区中有个常量池,常量就存在这里,s1、s3均为常量且值相等,就一份就可以了,所以s1,s3指向了同一个地方。
③在Object类中有equals方法,比较的是两个对象的引用,在String类中对equals方法进行复写。
在String中equals:将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
因为这两个对象的序列相同,所以equals为true。
s1和s2区别:
s1:在内存中有一个对象
s2:在内存中有两个对象
三、String类适用于描述字符串事物,那么它提供了多个方法对字符串进行操作。
1:获取
1.1字符串中包含的字符数,也就是字符串的长度。
public int length():返回字符串的长度。
在数组中也数组长度,但是它是通过属性length实现的,在字符串中是通过方法实现的。
1.2根据位置获取位置上的字符
public char charAt(int index)
1.3根据字符获取在该字符串中的位置
public int indexOf(int ch):返回的是ch在字符串中第一次出现的位置
public int indexOf(int ch,int fromIndex):从指定位置开始获取ch在字符串中的位置
public int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引。
public int lastIndexOf(int ch)也有从后往前找的方法
例子演示以上的函数功能
public class StringDemo {
public static void sop(Object obj) {
System.out.println(obj);
}
public static void method_get() {
String str="abcdeaf";
//获取长度
sop(str.length());//7
//获取位置上的特定字符
sop(str.charAt(5));//a
//sop(str.charAt(10));//下标越界:IndexOutOfBoundsException(运行时异常)
//根据字符获取第一次出现的位置
sop(str.indexOf('a'));//0
sop(str.indexOf('n'));//字符不存在,返回-1
//反向寻找特定字符在哪个位置
sop(str.lastIndexOf('a'));//5
}
public static void main(String[] args) {
method_get();
}
}
method_get和sop用静态修饰原因是想调用简单。
因为这些String方法都要打印显示,将此封装成一个方法,让要字符串做什么的方法,调用这个输出方法即可。
打印有int、String类型,所以用Object,相当于装箱操作,小–>大
2判断
2.1字符串中是否包含某个子串
public boolean contains(CharSequence s)
【 CharSequence是个接口,String实现了这个接口,就可以用接口指向子类对象】
** 特殊之处:**indexOf(str)可以索引str第一次出现的位置,如果返回-1,表示该str不在字符串中存在,所以contains方法也可以对指定判断子串是否包含。
if(str.index(“aa”)!=-1)而且该方法既可以判断,也可以获得位置
这两个方法如何选择:若只是判断是否有子串,则用contains
若既判断是否存在子串,以及要返回位置,则用indexOf(str)
2.2字符串中是否有内容
public boolean isEmpty():原理就是判断长度是否为0
2.3字符串是否是以指定内容开头
public boolean startsWith(String prefix)【注意参数是个字符串】
2.4字符串是否是以指定内容结尾
public boolean endsWith(String suffix)
2.5判断字符串内容是否相等,复写了Object类中的equals放法
boolean equals(str)
2.6判断内容是否相同,并忽略大小写
boolean equalsIgnoreCase();
例子演示上述判断内容:
public class StringDemo {
public static void sop(Object obj) {
System.out.println(obj);
}
public static void method_is() {
String str="ArrayDemo.java";
//判断文件名称是否以Array单词开头
sop(str.startsWith("Array"));
//判断文件名称是否以Array单词结尾
sop(str.endsWith(".java"));
//判断文件名称是否包含Demo
sop(str.contains("Demo"));
}
public static void main(String[] args) {
method_is();
}
}
3.转换
3.1将字符数组转换为字符串
构造函数:String(char [] value)
String(char[] value, int offset, int count) :将字符数组的一部分转换为字符串,offset开始位置,count个数
静态方法:public static String copyValueOf(char[] data)
public static String copyValueOf(char[] data,int offset, int count)
3.2将字符串转换为字符数组
public char[] toCharArray()
3.3将字节数组转换为字符串
String(byte [] value)
String(byte[] value, int offset, int count) :将字节数组的一部分转换为字符串,offset开始位置,count个数
3.4将字符串转换为字节数组
public byte[] getBytes(Charset charset)
3.5将基本数据类型转换为字符串
public static String valueOf(int i)
public static String valueOf(double i)
public static void method_trans() {
char[] arr= {'a','b','c','d','e','f'};
//将字符数组转换为字符串
String s=new String(arr);
String s1=new String(arr,1,3);
sop("s="+s);
sop("s="+s1);
//将字符串数组转换为字符数组
String s2="zdeicfh";
char[] ch=s2.toCharArray();
for(int x=0;x<ch.length;x++) {
sop("ch="+ch[x]);
}
}