String知识点
String:字符串
1.String:实现了final的,不可以被继承
2.String:实现了Serializable接口,表示字符串是可以序列化的
实现了Comparable接口,表示String是可以比较大小的
3.String:内部定义了 final char[] value 用于存储字符串数据
4.String:代表不可变的字符序列,简称:不可变性
String字符串拼接
1.常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量
2.只要其中一个是变量,结果就在堆中
3.如果拼接的结果调用intern()方法,返回值就在常量池中
String str1 = "HelloWorld";
String str2 = "Hello";
String str3 = str2+"World";
System.out.println(str1==str3);//false
final String str4 = "Hello";
String str5 = str4+"World";//常量+常量
System.out.println(str1==str5);//true
System.out.println(str1==str5);//true
String str6 = new String("Hello");
String str7 = new String("Hello");
System.out.println(str2==str6);//false
System.out.println(str6==str7);//false
测试题
public class StringTest2 {
String str = new String("good");
char[] ch = {'t','e','s','t'};
public void change(String str,char ch[]){
str = "test ok";
ch[0] = 'b';
}
public static void main(String[] args) {
StringTest2 t = new StringTest2();
t.change(t.str,t.ch);
System.out.println(t.str+"and");
System.out.println(t.ch);
}
}
String 常用方法
int length():返回字符串长度:return value. length
char charAt(int index):返回某索引处的字符
boolean isEmpty():判断是否是空字符串
String toLowerCase():转换成小写
String toUpperCase():转换成大写
String trim():返回字符串的副本,忽略前后空格
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
String concat(String str):将制定字符串连接到此字符串 等价于+
int compareTo(String str):比较两个字符串的大小
String substring(int beginIndex):返回一个新的字符串,它是此字符串从beginIndex开始截取
String substring(int beginIndex,int endIndex):返回一个新字符串
boolean endsWith(String suffix):测试辞职字符串是否以指定的后缀结束
boolean startWith(String prefix):测试此字符串是否以制定前缀开始
boolean startsWith(String prefix,int toffset):测试此字符串从指定索引开始的字符串是否以制定的前缀开始
boolean contains(charSequence s):当且晋档此字符串包含制定的char值序列时,返回true
int indexOf(String str):返回制定字符串在此字符串中第一次出现的索引
int indexOf(String str,int fromIndex):返回制定字符串在此字符串中第一次出现处的索引
int lastIndexOf(String str):返回制定字符串在此字符串中最右边出现的索引
int lastIndexOf(String str,int fromIndex):返回制定字符串在此字符串中最后一次出现的位置
String replace(char oldchar,char newchar):返回一个新的字符串
String replace(charSequence target,charSequence replacement)
String和其他类型之间的转换
public class StringTest4 {
public static void main(String[] args) throws UnsupportedEncodingException {
/*
复习:String与基本数据类型,包装类之间的转换
String-->基本数据类型,包装类:请用包装类的静态方法:parseXxx(str)
基本数据类型,包装类-->String:调用String重载的valueOf()
*/
String str1 = "123";
int num = Integer.parseInt(str1);
String str2 = String.valueOf(num);
String str3 = num+"1234";//存储在堆里,有字符串拼接在堆里
System.out.println(num);
System.out.printf(str2);
/*
String 与 char[]之间的替换
String-->char[]:String.toCharArray
char[]-->String:调用String构造器
*/
String str4 = "abc123";
char[] charArray = str1.toCharArray();
for(int i=0;i<charArray.length;i++){
System.out.println(charArray[i]);
}
char[] c = new char[]{'a','b','c','d'};
System.out.println(c);
String str5 = new String(c);
System.out.println(str5);
/*
String和字节byte[]之间的转换
String-->byte[]:调用String的getBytes();
byte[]-->String:调用String的构造器
编码:字符串-->字节(看得懂--->看不懂的二进制)
解码:编码的逆过程,字节-->字符串(看不懂二进制数据--->看得懂)
*/
String str6 = "abc123";
String str7 = "abc123中国";//
byte[] bytes = str6.getBytes();
byte[] bytes1 = str7.getBytes();//[97, 98, 99, 49, 50, 51, -28, -72, -83, -27, -101, -67]
byte[] bytes2 = str7.getBytes("gbk");//[97, 98, 99, 49, 50, 51, -42, -48, -71, -6]
System.out.println(Arrays.toString(bytes1));
System.out.println(Arrays.toString(bytes2));
String str8 = new String(bytes1);
String str9 = new String(bytes2);
System.out.println(str8);//abc123中国
System.out.println(str9);//abc123�й�
String str10 = new String(bytes2,"gbk");
System.out.println(str10);
}
}
关于StringBuffer和Stringbuilder的使用
/*
关于StringBuffer和StringBuilder的使用
*/
public class StringBufferTest1 {
/*
String,StringBuffer,StringBuilder三者的异同
String:不可变的字符序列;底层使用char[]存储
StringBuffer:可变的字符序列;线程安全的,效率低,底层使用char[]存储
StringBuilder:可变的字符序列;线程不安全的,效率高,底层使用char[]存储
源码分析:
String str = new String();//new char[0];
String str1 = new String("abc");//new char[]{'a','b','c'};
StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建了一个长度为16的字符数组
sb1.append('a');//value[0]='a';
sb1.append('b');//value[1]='b';
StringBuffer sb2 = new StringBuffer("abc");char[] value = new char["abc".length()+16];
问题1:
System.out.println(sb2.length());//3
问题2:
扩容问题:如果要添加的数据底层数据放不下,那就需要扩容底层的数组
*/
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer("abc");
s1.setCharAt(0,'m');
System.out.println(s1);
System.out.println();
/*
StringBuffer的常用方法
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容
StringBuffer replace(int start,int end,String str):位置替换为str
StringBuffer insert(int offset,xxx)在指定位置插入xxx
StringBuffer reverse():把当前字符序列逆转
public int indexOf(String str)
public String substring(int start,int end);
public int length()
public char CharAt(int n);
public void setCharAt(int n,char ch);
增:append
删:delete
改:setCharAt
查:charAt
插入:insert
遍历:for()+charAt()
长度:length()
*/
StringBuffer s2 = new StringBuffer("abc");
s2.append(1);
s2.append('1');
System.out.println(s2);
//s2.delete(2,4)
s2.replace(2,4,"hello");
System.out.println(s2);
s2.insert(2,false);
System.out.println(s2);
}
}