目录
String类的两种实例化方式
String采用共享设计模式
字符与字符串的相互转换(**)
字节与字符串的相互转换
字符串相等比较(比较内容,而不是地址)
字符串比较
字符串查找(**)
字符串替换
字符串拆分
字符串截取
String类的其他方法
StringBuffer \ StringBuilder
1.直接赋值(在堆上分配空间)---常用
String str = "hello";
2.传统方法--通过构造方法实例化String对象(会产生一块垃圾空间)----不推荐
String str = new String("hello");
JVM底层会自动维护一个字符串的对象池(就是一个对象数组:目的为了减小开销),如果现在采用直接赋值的形式进行String的对象实例化,该对象会自动保存在这个对象池中。下次继续使用直接赋值的模式声明String对象,此时对象池中若有指定内容,则直接引用;如果没有,则开辟新的堆空间后将其保存在对象池中供下次使用。
String str1 = "hello"; String str2 = "hello"; String str3 = "hello";
手工入池(本地方法):public native String intern( );
String str1 = "hello";
String str2 = new String("hello").intern( );
//使用String构造方法会开辟一块新的空间存hello,这样有一块成为垃圾空间,也会对字符串共享产生问题,
可以采用手工入池的方法,解决这一问题
System.out.println(str1 == str2);//true
字符串常量不可变更。字符串一旦定义后不可改变。开辟新的堆空间,栈的指向在变..产生垃圾空间
原则:字符串别改变太多,不超过三次。
1.将字符数组-->字符串
public String (char[ ] value) //例 String str = new String(data);
public String (char[ ] value , int offset , int count) //offset起始坐标 count个数
2.将字符串-->单个字符
public char charAt(int index)
例 "hello".charAt(5)
3.将字符串-->字符数组
public char[ ] toCharArray( );
例 char[ ] data = "hello".toCharArray( );
4.取得字符串长度
public int length( );
(※)判断一个字符串是否由数字组成?
public static boolean is Number(String str){
char[] data = str.toCharArray();
for(int i = 0; i '9') {
return false;
} else{
return ture;
}
}
}
1.将字节数组byte[ ]-->字符串 -----网络传输使用
public String (char[ ] value) //例 String str = new String(data);
public String (char[ ] value , int offset , int count) //起始坐标 个数
2.将字符串-->字节数组(**)
public byte[ ] getBytes( );
3.将字符串按照指定编码-->字节数组
public byte[ ] getBytes(String charsetName);
public boolean equals(String anotherString)
例 str1.equals(str2)
解释"=="和"equals"的区别:前者比较的是两个对象所保存的内存地址数值,后者是两个字符串的内容。
字符串常量("...")是String的匿名对象。
public static void main(String[] args) {
String str = null;
System.out.println("hello".equals(str));//推荐写法
System.out.println(str.equals("hello"));
}
//运行结果↓↓↓
Tips:开发中,如果要判断用户输入的字符串是否等同于特定字符串,一定要将String常量写在前面,避免出现NullPointerException空指针异常。
1.区分大小写相等比较
public boolean equals(String anotherString)
2.不区分大小写相等比较
public boolean equalsIgnoreCase(String anotherString)
3.比较两个字符串大小
public int compareTo (String anotherString)
返回大于0:表示大于比较对象
返回等于0:表示两者相等
返回小于0:表示小于比较对象
public boolean contains(String str):判断str在本字符串中是否存在。
public boolean startsWith(String str):判断是否以指定字符串开头
public boolean startsWith(String str,int index):从指定位置开始判断是否以指定字符串开头
public boolean endsWith(String str):判断是否以指定字符串结尾
indexOf(String str) :不存在返回-1 存在返回第一次出现的下标
public String replaceAll(String regex,String replacement):替换所有指定内容
public String replaceFirst(String regex,String replacement):替换首个内容
正则表达式
public String[] split(String regex):将字符串按照指定格式全部拆分
public String[] split(String regex,int limit):将字符串拆分,数组长度为limit
注意:\\. 有特殊含义的字符需要强转
public String substring(int beginIndex):从指定位置截取到字符串结尾
public String substring(int beginIndex,int endIndex):截取部分内容(左闭右开)
1.去掉左右空格
public String trim();
2.字符串转大小写
public String toUpperCase();
public String toLowerCase();
3.判断字符串是否为空(只能判断是否为空字符串,不包含null)
public boolean isEmpty();
方便进行字符串的修改,在java.lang包中
1.字符串修改
public StringBuffer append(各种数据类型)
StringBuffer sb = new StringBuffer();
sb.append ("hello").append(10); //将hello 和 10 拼在一起
String->StringBuffer
调用StringBuffer的构造方法或append();
StringBuffer->String
StringBuffer.toString();
2.字符串反转
public StringBuffer reverse();
3.删除指定范围的数据(因为在一块堆空间)
public StringBuffer delete(int start,int end);
4.插入数据
public StringBuffer insert(int offset,各种数据类型);
5.两者区别
String 的内容不可修改,而这两只sb可以改内容(append)
StringBuffer 采用同步处理,线程安全,效率较低
StringBuilder 采用同步处理,线程不安全,效率较高,String."+"底层会将String->StringBuilder