String和面试官那些事,绕不过去的

一、String的API
1.返回指定索引处的 char 值.

    String stu="abcde123abv356";
    char c = stu.charAt(1);
    System.out.println(c);

返回的值为b。
2.将指定字符串连接到此字符串的结尾。

    String st="abcde123abv356";
    String we = st.concat("wwwwwww");
    System.out.println(we);
    System.out.println(st == we);

拼接之后会形成新的字符串,第二句输出的是false。

    String st="abcde123abv356";
    String we = st.concat("");
    System.out.println(we);
    System.out.println(st == we);

拼接一个空串,我们想的肯定是we也是一个新串,但是由于字符串存储在常量池,当we拼接完之后,会先去常量池查找,有没有与之相同的串,答案是有,所有不会在创建新的串,第二个语句输出true。
3.当且仅当此字符串包含指定的 char 值序列时,返回 true。

    String s="abcde123abv356";
    boolean abc = s.contains("123ab");
    System.out.println(abc);

返回的是true。
4.测试此字符串是否以指定的后缀结束。

    String std="abcde123abv356";
    boolean b = std.endsWith("56");
    System.out.println(b);

返回的是true。但是如果是空串呢?

    String std="abcde123abv356";
    boolean b = std.endsWith("");
    System.out.println(b);

返回的也是true。
5.返回指定字符在此字符串中第一次出现处的索引。

    String stdd="abcde123abv356";
    int de = stdd.indexOf("de");
    System.out.println(de);

返回的是3。
6.返回指定字符在此字符串中最后一次出现处的索引。

  String stdd="abcde123abv356";
  int ab = stdd.lastIndexOf("ab");
  System.out.println(ab);

返回的是8
7.替换目标字符串

    String stdd="abcde123abv356";
    String replace = stdd.replace("356", "888");
    System.out.println(replace);

返回的是abcde123abv888
8.分隔

    String a="babcbd";
    String[] as = a.split("b");

返回的是一个数组。
9.截取

    String ss="123ab123";
    String substring = ss.substring(1,3);
    System.out.println(substring);

截取时包含起始处的索引,不包含结束处的索引。返回的是23
10.去前后空格

    String ss=" 123ab123 ";
    String trim = ss.trim();

11.字符串转字符

    String stu="abcde123abv356";
    char[] chars = stu.toCharArray();

12.字符串转小写

    String stu="abcde123abv356ASD";
    String s1 = stu.toLowerCase();

13.字符串转大写

    String stu="abcde123abv356ASD";
    String s2 = stu.toUpperCase();

14 如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。

    String stu="abcde123abv356";
    int abc1 = stu.compareTo("abcde123abv35");
    System.out.println(abc1);

二.区别
(1)String是字符串常量,一旦创建之后不可更改;StringBuffer和StringBuilder是字符串变量,可以更改。String的不可变,所以适合作为Map的键。

(2)StringBuilder 是线程不安全的,StringBuffer是线程安全的,使用了Synchronized关键字,即线程锁。

(3)字符串拼接时的效率:StringBuilder > StringBuffer > String。

(4)如果操作少量的数据用 String,单线程下操作大量数据用StringBuilder,多线程下操作大量数据用StringBuffer。

三.笔试题

    String st="abc";
    String str="abc";
    System.out.println(st==str);
    System.out.println(st.equals(str));

两个返回的都是true
注:==比较在内存中的地址是否相等,equals()比较的是两个字符串的内容是否相同。

    String st="ab";
    String str="abc";
    System.out.println(st==str);
    System.out.println(st.equals(str));

两个返回的都是false

    String st="ab";
    String str=new String("ab");
    System.out.println(st==str);
    System.out.println(st.equals(str));

第一个返回的是false,第二个返回的是true。

    String st=new String("ab");
    String str=new String("ab");
    System.out.println(st==str);
    System.out.println(st.equals(str));

2.String是不可变的有什么好处?

由于String是不可变类,所以在多线程中使用是安全的,我们不需要做任何其他同步操作。

String是不可变的,它的值也不能被改变,所以用来存储数据密码很安全。

因为java字符串是不可变的,可以在java运行时节省大量java堆空间。因为不同的字符串变量可以引用池中的相同的字符串。如果字符串是可变得话,任何一个变量的值改变,就会反射到其他变量,那字符串池也就没有任何意义了。

由于字符串的不可变性,所以字符串可以作为集合中的键。因为字符串是不可变的,当创建字符串时,它的它的hashcode被缓存下来,不需要再次计算。因为HashMap内部实现是通过key的hashcode来确定value的存储位置,所以相比于其他对象更快。这也是为什么我们平时都使用String作为HashMap对象。

3.String s = new String("xyz");创建了几个String Object?并作说明。

共产生了两个2个对象,第一个是字符串常量xyz,存储于常量池中。第二个对象是new String()时产生的,存储于堆中。

4、下面的代码将创建几个字符串对象。

String s1 = new String("Hello");  
String s2 = new String("Hello");

答案是3个对象.
第一,行1 字符串池中的“hello”对象。
第二,行1,在堆内存中带有值“hello”的新字符串。
第三,行2,在堆内存中带有“hello”的新字符串。这里“hello”字符串池中的字符串被重用。

3、写一个方法来判断一个String是否是回文(顺读和倒读都一样的词)?

回文就是正反都一样的词,如果需要判断是否是回文,只需要比较正反是否相等即可。String类并没有提供反转方法供我们使用,但StringBuffer和StringBuilder有reverse方法。

  private static boolean isPalindrome(String str) {
    if (str == null)
        return false;
    StringBuilder strBuilder = new StringBuilder(str);
    strBuilder.reverse();
    return strBuilder.toString().equals(str);
}

假设面试官让你不使用任何其他类来实现的话,我们只需要首尾一一对比就知道是不是回文了。

 private static boolean isPalindromeString(String str) {
    if (str == null)
        return false;
    int length = str.length();
    System.out.println(length / 2);
    for (int i = 0; i < length / 2; i++) {

        if (str.charAt(i) != str.charAt(length - i - 1))
            return false;
    }
    return true;
}

4.对字符串中的字符进行自然排序。

public static String sort(String abc){
    char[] chars = abc.toCharArray();
    Arrays.sort(chars);
    String str=Arrays.toString(chars);
    return str;
}

5.将字符串abcdefg反转为afedcbg

 public static void  trun(String abc,String cba){

    //截取
    String substring = abc.substring(1, 6);

    //利用StringBuilder进行翻转
    StringBuilder stringBuilder = new StringBuilder(substring);
    String str = stringBuilder.reverse().toString();

    //将翻转之后的字符串替换之前的
    StringBuilder sb = new StringBuilder(abc);

    StringBuilder replace = sb.replace(1, 6, str);

}

欢迎识别下方二维码,关注小编微信公众号,可以获取跟多Java资料:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值