String类
String类的两种实例化方式
- a.直接赋值
String str = "Hello";
//直接赋值,在堆上分配空间
- b.传统方法(构造方法实例化)
String str1 = new String("hello");
字符串相等比较
- 采用String类提供的equals方法
public boolean equals(String.anotherString)
//成员方法(通过对象调用:对象.equals)
eg:str1.equals(anotherString)
解释String类“==”与“equals”的区别
1.“= =”:进行数值的比较,比较的是两个字符串对象的内存地址数值
2.“equals()”:可以进行字符串内容的比较
- 字符串常量是String类的匿名对象
- 那么在之前出现的
String str = “hello”
,本质上就是讲一个匿名的String类对象设置有名字,而且匿名对象一定保存在堆内存中 - 小tips:在以后开发中,如果要判断用户输入的字符串是否等同于特定字符串,一定要将特定字符串(String常量)写在前面,避免NullPointerException
String str2 = null;
System.out.println("hello".equals(str2));
//任何的字符常量都是String的匿名对象,所以该对象永远不会为null
String类两种实例化区别
-
采用直接赋值,没有开辟新的堆空间
-
为什么没有开辟堆内存空间呢
-
JVM底层会自动维护一个字符串的对象池,如果现在采用直接赋值的形式进行String的对象实例化,该对象会自动保存在这个对象池中。如果下次继续使用直接赋值的模式声明String对象,此时对象池中若有指定内容,则直接引用;如果没有,则开辟新的堆空间后将其保存在对象池供下次使用。
-
采用构造方法
String str = new String("hello");
- 如上我们可以看到,使用String构造方法会开辟两块堆内存空间,并且其中一块成为垃圾空间,并且字符串常量并没有保存在对象池中
- 入池操作
public native String intern();
入池操作:
String str = new String("hello").intern();
字符串常量不可变更
- 字符串定义后,不可改变(在后面加上后,实际匿名对象没变,引用在变,栈的指向在变,只是在增多垃圾空间)
- 字符串上没有任何变化,但是字符串对象的引用一直在改变,会形成大量垃圾空间
- 原则:
- 1.字符串采用直接赋值
- 2.字符串比较采用equals()实现
- 3.字符串别改变太多
字符与字符串的相互转化
- 字符串就是一个字符数组,所以在String类里面支持有字符数组转换为字符串,以及字符串转化为字符的操作方法
- 将字符数组转换为字符串
public String (char[] value)
public String (char[] value,int offset,int count)
- 将字符串转为单个字符
public char charAt(int index):
char c = "hello".charAt(1);//输出为e
- 将字符串变为字符数组
public char[] toCharArray();
char []data = "hello".toCharArray();
- 取得字符串长度
public int length();
字节(byte)与字符串
- 将字节数组转为字符串
public String (char[] value)
public String (char[] value,int offset,int count)
- 将字符串转为字节数组
public byte[] getBytes();
- 将字符串按照指定编码转为字节数组
public byte[] getBytes(String charsetName);
字符串比较
- 不区分大小写相等比较
public boolean equalsIgnoreCase(Srting anotherString)
- 比较两个字符串大小(对象方法:在类里面,要先定义类的对象)
public int compareTo(String anotherString)
返回大于0:表示大于比较对象
返回等于0:表示两者相等
返回小于0:表示小于比较对象
str1.compareTo(str2)
字符串中遇到不相等的第一对相对应的,即输出
字符串查找
public boolean contains(String str):判断str在本字符串中是否存在
public boolean startsWith(String str):判断是否以指定字符串开头
public boolean startsWith(String str,int index):从指定位置开始判断是否以指定字符串开头
public boolean endsWith(String str):判断是否以指定字符串结尾
字符串替换
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
- 字符串拆分处理
- 字符串按部分拆分
- 拆分IP地址
- 多次拆分
字符串的截取
public String substring(int beginIndex):从指定位置截取到字符串结尾 [...
public String substring(int beginIndex,int endIndex):截取部分内容 [ ... )
String类的其他用法
- a.去掉左右空格
public String trim();
- b.转大小写
public String toUpperCase();
public String toLowerCase(); - 这两个函数只转换字母
- c.判断字符串是否为空(只能判断是否为空字符串而不是null)
public boolean isEmpty();
StringBuffer、StringBuilder类—(两只SB)了解一下
为什么有StringBuffer类
- 任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已;
- 通常来讲String的操作比较简单,但是由于String的不可更改性,为了方便字符串的修改,提供了StringBuffer类
字符串修改
public StringBuffer append(各种数据类型);
String类与StringBuffer类之间的转变
- String---->StringBuffer
调用StringBuffer的构造方法或append() - StringBuffer---->String
StringBuffer.toString();
字符串反转
public StringBuffer reverse();
删除指定范围的数据
public StringBuffer delete(int start,int end);
插入数据
public StringBuffer insert(int offset,各种数据类型)
了解
- String的内容不可修改,而两只sb可以修改内容(append)
- StringBuffer采用同步处理,线程安全,效率较低
- StringBuilder采用异步处理,线程不安全,效率较高,String“+”底层会将String–>StringBuiler