Java字符串问题和解答

String是使用最广的Java类之一,在此,列出一些Java String的重要面试问题和解答。

Java中的String是什么?字符串是一种数据类型?

String是java中的一个Class,在java.lang包中定义。它不是像int和long这样的原始数据类型。String类表示字符串。String几乎在所有Java应用程序中都有使用,下面来了解一些有关String的有趣事实。

在Java和JVM中,String是不可变的(immutable ),也是不能继承的(final),JVM使用String池来存储所有的String对象。可以使用双引号和重载操作符“+”来实例化字符串对象,并进行字符串连接。

有什么不同的方法来创建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);
    }

有时面试官要求,不使用任何其他类,来检查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;
    }

编写一个方法,从String中剔除给定的字符?

可以使用replaceAll方法,将String所有出现的字符,替换为另一个String。需要注意的是,它接受String作为参数,因此可用使用Character class来创建String,并使用它来替换空String。

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

怎样才能使String大写或小写?

使用String的toUpperCase和toLowerCase方法,来获取所有大写或小写的String。这些方法有一个接受Locale参数的变体,并使用该Zone设置规则,将String转换为大写或小写。

String subSequence方法是什么?

Java 1.4引入了CharSequence接口,而String实现了这个接口,这是在String实现subSequence方法的唯一原因。在内部,它调用String substring方法。

如何在java程序中比较两个字符串?

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()方法,将String转换为字符数组。

switch case可以使用String吗?

这是在检查对当前Java 版本的了解。Java 7扩展了switch case的功能,能够使用String,早期的java版本不支持这一点。如果要为字符串实现条件流,则可以使用if-else条件,如果使用的是Java 7或更高版本,则可以使用switch case。

编写一个程序来打印String的所有排列?

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

写一个函数来找出给定字符串中最长的回文?

一个String可以在其中包含回文字符串,并在给定的字符串中,找到最长的回文是一个编程问题。

String,StringBuffer和StringBuilder之间的区别?

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

StringBuffer和StringBuilder是可变类。StringBuffer操作是线程安全的,StringBuilder操作是线程不安全的。因此,当多个线程在同一个String上工作时,应该使用StringBuffer,但在单线程环境中,应该使用StringBuilder。StringBuilder性能比StringBuffer快,因为没有同步开销。

为什么在Java中String是不可变的和不可继承的?

String是不可变且不可继承的,但有几个好处。

1、String Pool是可行的,因为String在java中是不可变的。

2、它提高了安全性,因为任何黑客都无法更改其值,并且它用于存储敏感信息,如数据库用户名,密码等。

3、由于String是不可变的,因此在多线程中使用是安全的,不需要任何同步。

4、字符串用于java类加载器,不变性使类能够被类加载器安全正确的加载。

5、由于String是不可变的,因此,其哈希码在创建时被缓存,不需要再次计算。用它作为Map中键是理想的选择,并且,它的处理速度,比其他HashMap键对象快。这就是为什么用String作为HashMap的键。

为什么存储密码时Char数组优先于字符串?

String在java中是不可变的,并存储在String pool中。一旦它被创建,它将保留在池中,除非进行垃圾收集,所以,即使已经用完了密码,它在内存中依然存在,并且,没有办法回避它。这是一个安全问题,因为,任何有权访问内存转储的人,都可以将密码作为明文找到。

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

如何检查Java中两个字符串是否相等?

有两种方法可以检查两个字符串是否相等,使用“==”运算符,或使用equals方法。当使用“==”运算符时,会检查String的值以及引用,但在编程中,大多数时候只检查String的值是否相等。所以,应该使用equals方法,来检查两个字符串是否相等。可以使用equalsIgnoreCase函数来忽略大小写。

什么是字符串池?

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

String intern()方法有什么作用?

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

String在Java中是否是线程安全的?

字符串是不可变的,因此,不能在程序中改变它的价值。所以,它是线程安全的,可以安全地用于多线程环境。

为什么String是Java中流行的HashMap键?

由于String是不可变的,因此,其哈希码在创建时被缓存,不需要再次计算,处理速度比其他HashMap键对象快。