String类

实例化方式

1、直接赋值

String str = "Hello world";
System.out.println(str);

2、传统方法(构造法)

String str = new String("Hello world");
System.out.println(str);

这里补充一个概念:什么是构造方法?
  构造方法是一种特殊的方法,它与类同名,且返回类型是同名类的类型。对象的创建就是通过构造方法完成的,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。

字符串相等比较

如果判断两个int型变量,可以直接使用==完成,但是在String类对象上使用==是否也可以呢?我们可以试一试。
JavaSE三大特殊类之String类
这是因为==本身是进行数值比较的,如果用于对象比较,它所比较的就是两个对象所保存的内存地址数值,而没有比较对象的内容。画个图分析一下:
JavaSE三大特殊类之String类
那么要怎样比较内容呢?String类提供了一个equals()方法,即:

public class Test {
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = new String("hello");
        System.out.println(str1.equals(str2));
    }
}

需要注意的是,如果要判断用户输入的字符串是否等于特定字符串的时候,考虑到用户输入的可能为Null,所以在用equals()进行比较的时候,要把特定字符串写在前面,避免NullPointerException问题。

String str1 = null;
System.out.println("hello".equals(str1));
面试题:请解释String类==equals的区别:

1、“==”进行的是数值比较,比较的是两个字符串的内存地址数值。
2、“equals()”可以进行字符串内容的比较。

实例化区别

前面有说到两种实例化方式,如果采用直接赋值(String str = "hello";)的话,JVM底层实际上会自动维护一个对象池,实例化对象(字符串内容)会自动保存在这个对象池里,如果下次依然使用直接赋值,而且对象池中有制定的内容,就直接引用,如果没有,就开辟新的字符串对象并且保存在这个对象池里。
如果采用构造方法实例化(String str = new String("hello"));,它并不会自动入池,而是会开辟两块堆内存空间,因为所有的字符串常量都是String类的匿名对象,它会先在堆上开辟一块空间,new的时候再开辟一块堆内存空间,之前的那个堆内存空间在把“hello”赋给str的时候就变成了垃圾空间。
但是String类也提供了手工入池的方法public String intern();
JavaSE三大特殊类之String类

面试题:请解释String类中两种对象实例化的区别

1、直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
2、构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,需要使用intern()方法手工入池。

字符与字符串

这里我只总结一下方法,具体的使用以后再练习。
1、public String(char value[]) 将字符数组中的所有内容变成字符串
2、public String(char value[],int offset,int count) 将部分字符数组中的内容变为字符串
3、public char charAt(int index) 取得指定索引位置的字符,索引从0开始
4、public char toCharArray() 将字符串变为字符数组返回

字节与字符串

1、public String(byte bytes[]) 将字节数组变为字符串
2、public String(byte bytes[],int offset,int length) 将部分字节数组中的内容变为字符串
3、public byte[] getBytes() 将字符串以字节数组的形式返回
4、public byte[] getBytes(String charsetName) throws UpsupportedEncodingException 编码转换处理
注意:字节并不适合处理中文,一个字符等于两个字节,字节只适合处理二进制数据。

字符串比较

1、public boolean equals(Object anObject) 区分大小写的比较
2、public boolean equalsIgnoreCase(String anotherString) 不区分大小写的比较
3、public int compareTo(String anotherString) 比较两个字符串大小关系

字符串转换查找

1、public boolean contains(CharSequence s) 判断一个子字符串是否存在
2、public int indexOf(String str) 从头开始查找指定字符串的位置,查到了返回位置的开始索引,如果查不到返回-1
3、public int indexOf(String str,int fromIndex) 从指定位置开始查找子字符串的位置
4、public int lastIndexOf(String str) 从后向前查找子字符串位置
5、 public int lastIndexOf(String str,int fromIndex) 从指定位置由后向前查找
6、public boolean startWith(String prefix) 判断是否以指定字符串开头
7、public boolean startsWith(String prefix,int toffset) 从指定位置开始判断是否以指定字符串开头
8、public boolean endsWith(String suffix) 怕段是否以指定字符串结尾
注意:使用indexOf()的时候,如果内容重复,它只返回查找的第一个位置

字符串替换

1、public String replaceAll(String regex,String replacement) 替换所有的指定内容
2、public String replaceFirst(String regex,String replacement) 替换首个内容

字符串拆分

1、public String[] split(String regex) 将字符串全部拆分
2、public String[] split(String regex,int limit) 将字符串部分拆分,该数组长度就是limit极限

字符串截取

1、public String substring(int beginIndex) 从指定索引截取到结尾
2、public String substring(int beginIndex,int endIndex) 截取部分内容

其他操作方法

1、public String trim() 去掉字符串中的左右空格,保留中间空格
2、public String toUpperCase() 字符串转大写
3、public String toLowerCase() 字符串转小写
4、public native String intern() 字符串入池操作
5、public String concat(String str) 字符串连接,等同于“+”,不入池
6、public int length() 取得字符串长度
7、public boolean isEmpty() 判断是否为空字符串,但不是null,而是长度为0

StringBuffer类

String的常量一旦声明就不可改变,为了方便字符串的修改,提供了StringBuffer类。String使用“+”来进行字符串的连接,在StringBuffer中改为append()方法。
JavaSE三大特殊类之String类
String和StringBuffer类不能直接转换,如果要想互相转换:

  • String转StringBuffer:利用StringBuffer的构造方法或append()方法
  • StringBuffer转String:调用toString()方法

StringBuffer类的其他方法:
1、public synchronized StringBuffer reverse() 字符串反转
2、public synchronized StringBuffer delete(int start,int end) 删除指定范围的数据
3、public synchronized StringBuffer insert (int offset,各种数据类型 b) 插入数据

面试题:请解释String、StringBuffer、StringBuilder的区别

1、String的内容不可以更改,StringBuffer和StringBuilder的内容可以更改。
2、StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作。

相关文章: