Java里String类基础及面试常见题

1.String类

    final类,不能再有子类

    字符串是常量,内存中创建对象后不能修改

2.常用方法

a. 字符串比较

public boolean equals(String another)    //比较字符串与another是否一样

public boolean equalsIgnoreCase(String another)   //比较字符串与another是否一样(忽略大小写);

int compareTo(String another)      //  当前String对象与anotherString比较。相等关系返回0;不相等时,返回第一个不相等的字符差,另一种情况,较长字符串的前面部分恰巧是较短的字符串,返回它们的长度差。

int compareToIgnoreCase(String another)   //忽视大小写

equals只能判断字符串是否相等,compareTo可以用来排序

b. 子串

public String substring(int beginIndex)          //返回该字符串从beginIndex开始到结尾的子字符串;
public String substring(int beginIndex,int endIndex)     ///返回该字符串从beginIndex开始到endsIndex-1结尾的子字符串

c.查找指定字符串

public char charAt(int index)      //返回字符串中第index个字符;
public int indexOf(String str)      //返回字符串中第一次出现str的位置;
public int indexOf(String str,int fromIndex)             //返回字符串从fromIndex开始第一次出现str的位置;
d. 替换

public String replace(char oldchar,char newChar)     //在字符串中用newChar字符替换oldChar字符

public String replace(String regex,String replacement )     //即基于规则表达式的替换,可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号

public String trim()     // 返回该字符串去掉开头和结尾空格后的字符串
public String[] split(String regex)     //将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组

执行了替换操作后,源字符串的内容是没有发生改变的

3. 面试中常考的问题

先说几个问题:

   String  s1=new String("123");                             

                                                                                 语句里的“123”是字符串常量,如果常量池没有会首先在其创建,如果有则直接使用

                                                                                 有了“123"字符串常量后,通过new 在堆空间上实例化字符串对象

                                                                                 最后把地址给引用s1

问题1:

String s1 = “abc”;
String s2 = “abc”;
System.out.println(s1 == s2);

这里的结果是true. 由于字符串是常量(内存中创建对象后不能修改), 而且字符串在程序中经常使用. 所以Java对其提供了缓冲区. 缓冲区内的字符串会被共享. 使用双引号的形式定义字符串常量就是存储在缓冲区中的. 使用”abc”时会先在缓冲区中查找是否存在此字符串, 没有就创建一个, 有则直接使用. 第一次使用”abc”时会在缓冲区中创建, 第二次则是直接引用之前创建好的了.

问题2:

String s1 = new String(“abc”);
String s2 = new String(“abc”);
System.out.println(s1 == s2);

这里的结果是false. 使用构造函数创建的字符串都是在缓冲区外面创建一个新的. 所以只要是使用构造函数创建的字符串, 和任何字符串都不会相等.

问题3:

String s1 = “abc”;
String s2 = “a”;
String s3 = “bc”;
String s4 = s2 + s3;
System.out.println(s1 == s4);

这里的结果是false. Java中字符串的相加其内部是使用StringBuilder类的append()方法和toString()方法来实现的. 而StringBuilder类toString()方法返回的字符串是通过构造函数创建的.

问题4:

String s1 = “abc”;
String s2 = “a” + “bc”;
System.out.println(s1 == s2);

这里的结果是true. 其实这里的s2并没有进行字符串相加, 两个双引号形式的字符串常量相加, 在编译的时候直接会被转为一个字符串”abc”.

问题5:下列代码中有几个引用,几个对象

  String s = new String("abc");
  String s1 = "abc";
  String s2 = new String("abc");

(1)String s = new String("abc");首先括号里的"abc"先到String pool里看有没"abc"这个对象,没有则在pool里创建这个对象,所以这里就在pool创建了一个"abc"对象.然后 通过new语句又创建了一个"abc"对象,而这个对象是放在内存的堆里;这里有一个引用s

(2) String s1 = "abc"; 这条语句,s1当然还是引用。 在pool里查找有没"abc"这个对象,很显然,第一条语句在pool里已经创建了一个"abc".所以这条语句没有创建对象"

(3)String s2 = new String("abc"); 这条语句创建了一个对象,s2是引用

 所以:这三条语句,创建了三个对象,三个引用。



参考文章:http://jingbo2759.blog.163.com/blog/static/98375315200971731522144/

                    http://www.jfox.info/

发布了31 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weijie_home/article/details/49764717