Java String FAQ

Java String常见面试问题和解答。

创建方法

可用new关键字、双引号创建String对象。String类的构造函数,允许从char数组、byte数组、StringBuffer和StringBuilder中构建String。

String str = new String("abc");
String str1 = "abc";

使用双引号创建String时,JVM会在String Pool中查找是否已存相同的String。若找到返回该String对象引用,否则,创建新String对象,将其存储在String Pool。

new关键字创建的String对象,不会存储到String Pool中。可调用intern()方法将String对象存储到String Pool中,若池中已存在相同String,则返回引用。

定符串回文

字符串反转时字符值相同则为回文结构。如,"aba"是Palindrome字符串。

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);
    }

不借助API检查String回文:从两端比较字符串字符,确定是否回文。

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;
    }

剔除指定字符

replaceAll方法将String中出现的指定字符替换为另一个String。

private static String removeChar(String str, char c) {
        if (str == null)
            return null;
        return str.replaceAll(Character.toString(c), "");
    }

大写/小写

toUpperCase和toLowerCase方法,方法接受Locale参数。

字符串比较

String实现了Comparable接口,compareTo()方法的两个变体。

compareTo(String anotherString)方法,将字符串对象与传递的字符串比较。

若String对象先于传递的参数,则返回负整数,若String对象紧跟传递的参数字符串,则返回正整数。

两个字符串具有相同值,返回0。

示例中,equals(String str)方法将返回true。

String str = "ABC";
System.out.println(str.compareTo("DEF"));//-3
System.out.println(str.compareToIgnoreCase("abc"));//0

compareToIgnoreCase(字符串str)方法与第一个方法相似,使用case_insensive_order比较器,不区分大小写。

如果该值为0,则equalsIgnoreCase(String str)将返回true。

String转char

这是一个棘手的问题,String是一个字符序列,不能将其转换为单个字符。

使用charAt方法指定索引,或使用toCharArray()方法。

switch能否使用String

Java 7扩展了switch,允许使用String,早期java版本不支持。

String排列组合

递归查找字符串的排列组合,如"AAB"排列组合:"AAB"、"ABA"、"BAA",使用Set确保没有重复值。

String、StringBuffer、StringBuilder的区别

String不可变且不能被继承,对String操作会创建新的String。字符串操作是种资源消耗。

Java为字符串操作提供两个实用类:

StringBuffer、StringBuilder,StringBuffer线程安全,StringBuilder线程不安全。多线程中应使用StringBuffer,单线程中使用StringBuilder。

Char数组

String不可变且存储在String pool中。一旦被创建将保留在池中,除非被gc回收,即使已用完的密码,仍在内存中,任何有权访问内存的人,都能将密码作为明文找到。

使用char数组存储密码,使用完成后,将其设置为null,以此控制在内存中的时间避免安全威胁。

串池

Java在堆用存储String Pool,串池是Flyweight模式的一种实现。

intern()方法

intern方法会检索String Pool中是已包含或相同字符串对象,有则返回,无则创建,以保证字符串池中的对象唯一。此方法始终返回与此字符串相同的String。