1、JDK中源码
①被String类被final修饰的意义:String类无法被继承,保证所有使用JDK的人都使用的都是同一个String类
2、创建字符串的方式
【常用①④】
①直接赋值:String str =“Hello Word”;
②通过构造方法产生对象 String str =new String(“hello word”);
③通过字符数组产生对象
char[] data =new char[]{‘a’};
④通过String的静态方法valueOf(任意数据类型)—>转为字符串
String str =String.valueOf();
public class StringTest {
public static void main(String[] args) {
//直接赋值
String str1 = "hello word";
//通过构造方法
String str2 =new String("hello word");
//通过字符数组
char[] data =new char[]{'a','b','c'};
String str3 =new String(data);
//通过静态方法
String str4 =String.valueOf(10);
System.out.println(str1+"\n"+str2+"\n"+str3+"\n"+str4);
}
}
//输出结果
//hello word
//hello word
//abc
//10
3、字面量: 直接写出来的数值称为字面量
4、字符串比较:
1、使用 equals() 方法–>大小写有区别
2、使用 equalsIgnoreCase() -->大小写无区别
【当需要由用户输入时,避免空指针异常】
5、字符串常量池:
1、当使用直接赋值法产生字符串对象时,JVM会维护一个字符串的常量池,若该对象在堆中不存在时,则产生一个新的字符串对象加入字符串的常量池中。
2、当继续使用直接赋值法产生字符串对象时,JVM发现该引用指向的内存在常量池已经存在时,不再创建新的字符串对象,而是复用已有对象。
6、手工入池、intern方法:
调用intern方法会将当前字符串引用指向的对象保存到字符串常量池中。
1、若当前常量池中已经存在了该类对象,则不再产生新的对象,返回常量池中的String对象地址
2、若当前常量池中不存在该对象,则将该对象入池,返回入池后的地址,
7、字符串不可变性:
所谓的字符串不可变性,指的是字符串对象的内容不能变,而不是字符串引用不能变
Q:为何字符串对象无法修改内容?
字符串其实就是一个字符数字 char[],字符串保存的值在数组中保存,private修饰且不提同gettter和setter方法,无法修改。
Q:如何修改字符串内容?
1、在运行时通过反射破坏value数组的封装(不推荐)
public class StringTest {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
//在运行时通过反射破坏value数组的封装
String str="hello";
Class<String>cls =String.class;
//获取这个属性
Field field =cls.getDeclaredField("value");
//破坏封装,破坏private
field.setAccessible(true);
//在String类的外部通过反射拿到value数组
char[] value =(char[]) field.get(str);
value[0] ='H';
System.out.println(str);
}
}
//输出结果
//Hello
2、更换使用StringBuilder或者StringBuffer类(此时已经不是一个类型了)
①若需要频繁进行字符串的 拼接 ,使用StringBuild类的append方法
【StringBuffer和StringBuilder使用方法一样,但它是线程安全,性能较差】
public static void main(String[] args) {
//若需要频繁进行字符串的拼接,使用StringBuild类的append方法
StringBuilder str =new StringBuilder();
str.append("h");
str.append("e");
str.append("l");
str.append("l");
str.append("o");
System.out.println(str);
}
//输出
//hello
StringBuilder转换为String类:
调用toString()方法
String转为StringBuilder:
1、使用StringBuilder构造方法
2、append方法
StringBuilder常用方法:
1、字符串翻转:reverse()方法
2、删除指定范围的数组:delete(int start,int end)方法,范围是左闭右开。
3、插入:insert(int start,各种数据类型)方法,从start位置开始插入任意数据类型
字符串常用方法 1、字符串的比较
①equals():
区分大小写
②equalsIgnoreCase():
不区分大小写
③compareTo():
比较两个字符串大小,根据字符串内部每个数组进行ASSCII的比较(按照字典序排列)
1、字符----->字符串
①通过构造方法
char[] arr ={'a','b','c'};
String arr1 =new String(arr);
System.out.println(arr1);
2、字符串----->字符
①charAt(int index): 取出字符串指定索引的字符
②toCharArray: 将字符串中的内容转为字符数组
//判断一个字符串是否为纯数字
public class StringPractice {
public static void main(String[] args) {
String str1 = "123";
String str2 = "123a";
System.out.println(isNumber(str1));
System.out.println(isNumber(str2));
}
/**
* 判断一个字符串是否为纯数字
*/
public static boolean isNumber(String str) {
char[] str1 = str.toCharArray();
for (int i : str1) {
if (i > '9' || i < '0') {
return false;
}
}
return true;
}
}
//输出结果
//true
//true
3、字符串和字节相互转换
①、字符串----->字节
getBytes()
通过构造方法
4、字符串的查找
5、字符串的替换 replaceAll() 替换所有
replaceFirst() 替换首个
6、字符串的拆分 split()
【注】某些拆分规则为特殊字符,需要转义
7、字符串的截取 substring(int beginIndex) 从指定索引截取到结尾
substring(int beginIndex,int endIndex) 截取部分内容
【注】左闭右开
8、其他常用方法
//将一个字符串首字母大写
public static String firstUpper(String str) {
//判空
if (str==null||str.isEmpty()){
return null;
}
//边界
if (str.length()==1){
return str.toUpperCase();
}
return str.substring(0,1).toUpperCase()+str.substring(1);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)