Java字符串问题和解答

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

创建方法

使用new运算符创建String对象,就像创建普通java类一样,也可以使用双引号来创建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运算符时,JVM会创建String对象,但不会将其存储到String Pool中。我们可以使用intern()方法将String对象存储到String池中,或者如果池中已存在具有相等值的String,则返回引用。

检查指定符串是否为Palindrome(回文)

字符串在反转时,字符值相同,则称其为回文结构。例如,“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), "");
    }

String大写或小写

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

字符串比较

Java 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 case能否用于String

Java 7扩展了switch case的功能,能够使用String,早期的java版本不支持这一点。

String所有排列组合

使用递归来查找字符串的所有排列,例如“AAB”排列将是“AAB”,“ABA”和“BAA”。使用Set确保没有重复的值。

String、StringBuffer和StringBuilder间的区别

String在java中是不可变的并且不能继承,每当进行String操作时,它都会创建一个新的String。字符串操作是种资源消耗。java为字符串操作提供了两个实用类 - StringBuffer和StringBuilder。

StringBuffer线程安全,StringBuilder线程不安全。当多个线程在同一个String上工作时,应使用StringBuffer,在单线程环境中,应使用StringBuilder。StringBuilder性能比StringBuffer高效。

Char数组优先于字符串

String在java中是不可变的,并存储在String pool中。一旦被创建将保留在池中,除非被gc回收,即使已使用完的密码,仍在内存存在,这是一个安全问题,任何有权访问内存转储的人,都能将密码作为明文找到。使用char数组存储密码,在使用完成后,将其设置为null,以此控制在内存中的时间,避免安全威胁。

串池

在Java堆中用来存储字符串的pool,String在java中是一个特殊类,可使用new运算符创建String对象,也可用双引号,字符串池是Flyweight模式的一种实现。

intern()方法的作用

调用intern 方法时,如果池中已经包含,或等于此字符串对象的字符串,则返回池中的字符串。否则,鼗此String对象添加到池中,并返回此String对象的引用。此方法始终返回与此字符串,具有相同内容的String,以此保证字符串池中的对象唯一。