版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013234928/article/details/89408714
String 不是基本数据类型,但是我们却经常使用,且离不开它,面试也常常出现于它相关的面试题,简单整理一下。
1> String、StringBuffer、 StringBuilder的区别
-
从运行速度上说,StringBuilder>StringBuffer>String,因为String是不可变的对象
-
String:是字符串常量(由final修饰),StringBuffer和StringBuilder 是字符串变量
-
StringBuffer:有同步锁,但效率低,适用于多线程下字符缓冲区进行大量操作。
-
StringBuilder:效率高,线程不安全,适用于单线程下的字符缓冲区进行大量操作的情况;
String和StringBuffer中的value[]都用于存储字符序列。但是:
- String中的是常量(final)数组,只能被赋值一次
- StringBuffer中的value[]是一个很普通的数组,通过append()方法将新字符串加入value[]末尾。这样也就改变了value[]的内容和大小了
2> “==”和equals的区别
- “==”:用于基本类型的变量,“值”比较;用于引用类型的变量,对象的内存地址比较;
- equals:默认情况下,比较引用类型的地址值。一般重写都是自动生成,比较对象的成员变量值是否相同
//代码1
String sa = "ab";
String sb = "cd";
String sab=sa+sb;
String s="abcd";
System.out.println(sab==s); // false
//当执行sa+sb时,JVM首先会在堆中创建一个StringBuilder类,将刚生成的String对象的堆地址存放在局部变量sab中
//局部变量 s 存储的是常量池中"abcd"所对应的拘留字符串对象的地址
//代码2
String sc="ab"+"cd";
String sd="abcd";
System.out.println(sc==sd); //true
//"ab"+"cd"会直接在编译期就合并成常量"abcd", 因此相同字面值常量"abcd"所对应的是同一个拘留字符串对象,自然地址也就相同。
3> Sting 常用方法
String(byte[] bytes)
String(byte[] bytes, Charset charset)
//修改编码
//经常使用new String(str.getBytes("ISO-8859-1"), "GBK"); 来转换编码问题
public boolean endsWith(String suffix);//测试此字符串是否以指定的后缀结束
public boolean endsWith(String prefix, int toffset);
public boolean startsWith(String prefix)
public boolean startsWith(String prefix, int toffset) //指定索引开始的子字符串是否以指定前缀开始
public char charAt(int index);//返回指定索引处的 char 值
public int lastIndexOf(int ch)
public int lastIndexOf(int ch,int fromIndex)
public int indexOf(String str)
public int indexOf(String str,int fromIndex) //指定的索引开始反向搜索;字符的方法也有
public String[] split(String regex)
public String[] split(String regex, int limit)//limit为数字的长度
public char[] toCharArray()//字符串转换为一个新的字符数组
public String substring(int beginIndex)
public String substring(int beginIndex, int endIndex)
public String replace(char oldChar,char newChar)
public String replace(CharSequence target, CharSequence replacement)//说白了也就是类型就是字符串
public String replaceAll(String regex, String replacement)
public String replaceFirst(String regex, String replacement)
//如果replaceAll()和replaceFirst()所用的参数据不是基于规则表达式的,则与replace()替换字符串的效果是一样的,即这两者也支持字符串的操作;
public byte[] getBytes(Charset charset)
public int length()
public String trim()
public boolean isEmpty()
public String toLowerCase()
public String toUpperCase()
public boolean equalsIgnoreCase(String anotherString);
public static String valueOf(boolean b)//将参数转换成字符串,还支持char/char[]/double/float/int/long和Object;Object:null对象等于 "null",否则,返回 obj.toString()