Java常用类之String
String:
①final修饰,不可被继承
②实现了Serializable接口,字符串可序列化。实现了Comparable接口,字符串可比较大小。
③String内部定义了 final char [ ] value 接收字符串
④String:代表字符串序列是不可变的,即不可变性
体现:
1.当为String对象重新字面量赋值时,需要在指定的内存中重写,并不会改变原有的value。
2.当String对象调用某些方法时,会有String类型的返回值,并不是直接改变原有的value。
@Test
public void test1() {
String str="abc";
String str1=str;
str1="def";
System.out.println(str);
System.out.println(str1);
String str2=str.replace('a', 'm');
System.out.println(str2);
String s1="123";
String s2=s1;
s1+="4";
System.out.println(s2);
}
⑤ String对象字面量赋值时,会在方法去的字符串常量池中创建。
⑥字符串常量池中不能存放相同的字符串
String的内存结构分析:
String s1="abc";
String s2="abc";
System.out.println(s1==s2);
String s3=new String("abc");
String s4=new String("abc");
System.out.println(s3==s4);
@Test
public void test2() {
String s1="javaEE";
String s2="hadoop";
String s3="javaEEhadoop";
String s4="javaEE"+"hadoop";
String s5=s1+"hadoop";
String s6="javaEE"+s2;
String s7=s1+s2;
System.out.println(s3==s4); //true
System.out.println(s3==s5); //false
System.out.println(s3==s6); //false
System.out.println(s3==s7); //false
System.out.println("********************");
String s8=s5.intern();
System.out.println(s4==s8);
}
规则:
1.常量与常量连接是在字符串的常量池中创建。
2.有变量参与相当于new,在堆空间中创建。
3.调用intern()方法,相当于是在字符串常量池中创建。
public class StringTest {
String str=new String("good");
char [] ch=new char[] {'t','e','s','t'};
public void exchage(String str,char [] ch) {
str="test ok";
ch[0]='b';
}
public static void main(String[] args) {
StringTest test=new StringTest();
test.exchage(test.str, test.ch);
System.out.println(test.str);
System.out.println(test.ch);
}
}
考察点:
1.String的不可变性
2.值传递问题
String中常用方法:
1.length():返回字符串的长度
@Test
public void test3() {
String str="abcdefg";
System.out.println(str.length());
}
2.charAt(int index)方法:返回指定下标的字符
@Test
public void test3() {
String str="abcdefg";
System.out.println(str.charAt(0));
}
3.euqals(Obejct objcet):比较内容是否一致
4. euqalsIgnoreCase(String str):忽略大小写比较内容是否一样
@Test
public void test3() {
String str1="abc";
String str2="Abc";
System.out.println(str1.equalsIgnoreCase(str2));
}
5.toLowerCase():将字符串变成小写
@Test
public void test1() {
String str="ABC";
System.out.println(str.toLowerCase());
}
6.toUpperCase():将字符串变成大写
@Test
public void test1() {
String str="abc";
System.out.println(str.toUpperCase());
}
7.compareTo(String str):比较两个字符串大小
@Test
public void test1() {
String str1="abc"; // 97 98 99
String str2="abe"; // 97 98 101
System.out.println(str2.compareTo(str1));
System.out.println(str1.compareTo(str2));
String str3=str1;
System.out.println(str3.compareTo(str1));
}
8.contains(String str):是否包含它
@Test
public void test1() {
String str1="abcdefg";
String str2="efg";
System.out.println(str1.contains(str2));
}
9.isEmpty():判断字符串长度是否为0
@Test
public void test1() {
String str1="abcdefg";
System.out.println(str1.isEmpty());
}
10.index(String str):返回子字符串第一次出现在字符串内的索引
@Test
public void test1() {
String str="abcdefg";
System.out.println(str.indexOf("defg"));
}
11.index(String str,int fromIndex):从指定下标开始,返回子字符串第一次出现在字符串内的索引
@Test
public void test1() {
String str="abcdefgabcdefg";
System.out.println(str.indexOf("defg",7));
}
12.lastIndexOf(String str):从右往左,第一次出现的下标
@Test
public void test1() {
String str="abcdefgabcdefg";
System.out.println(str.lastIndexOf("def"));
}
13.lastIndexOf(String str,int fromIndex):从制定下标往左,第一次出现的下标
@Test
public void test1() {
String str="abcdefgabcdefg";
System.out.println(str.lastIndexOf("def",7));
}
14.subString(int fromIndex):从下标开始截取
@Test
public void test1() {
String str="abcdefgabcdefg";
System.out.println(str.substring(2));
}
15.subString(int fromIndex,int endIndex): 左闭右开
@Test
public void test1() {
String str="abcdefgabcdefg";
System.out.println(str.substring(2,6));
}
16.repalce(char target,char newchar):将字符target全部换为newchar
@Test
public void test1() {
String str="abbbbbbbba";
System.out.println(str.replace('a', 'm'));
}
17.replaceFirst(String target,String source):将匹配的第一个字符串用source替换
@Test
public void test1() {
String str="ababababab";
System.out.println(str.replaceFirst("ab","m" ));
}
18.replaceAll(String target,String source):将所有符合的字符串替换
@Test
public void test1() {
String str="ababababab";
System.out.println(str.replaceAll("ab","m" ));
}
19.split(String str):以str分割
@Test
public void test1() {
String str="a,b,c,d";
String [] arr=str.split(",");
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
20.trim():去除字符串首尾的空格
@Test
public void test1() {
String str=" a b c d ";
System.out.println(str);
System.out.println(str.trim());
}
21.startWith(String str):判断是否以str开头
@Test
public void test1() {
String str="abcdef";
System.out.println(str.startsWith("abc"));
}
22..startWith(String str,int fromIndex):指定位置判断是否以str开头
@Test
public void test1() {
String str="abcdefabc";
System.out.println(str.startsWith("abc",6));
}
23.endwith(String str):判断是否以str结尾
@Test
public void test1() {
String str="abcdefabc";
System.out.println(str.endsWith("abc"));
}
String与字符数组之间的转换:
①String->字符数组
@Test
public void test1() {
String str="abcd";
char [] ch=str.toCharArray();
System.out.println(ch);
}
②字符数组->String
@Test
public void test1() {
String str="abcd";
char [] ch=str.toCharArray();
System.out.println(ch);
String str1=new String(ch);
System.out.println(str1);
}
String与字节数组之间的转换:
①String->字节数组
@Test
public void test1() {
String str="abcd";
byte [] b= str.getBytes();
for(int i=0;i<b.length;i++) {
System.out.print(b[i]+"\t");
}
}
②字节数组->String
@Test
public void test1() {
String str="abcd";
byte [] b= str.getBytes();
for(int i=0;i<b.length;i++) {
System.out.print(b[i]+"\t");
}
String str1=new String(b);
System.out.println(str1);
}