Java字符串面试问答
字符串是使用最广泛的java的类之一。在这里,我列出了一些重要的java的字符串面试问答。
这将有助于您全面了解string并解决面试中与string有关的任何问题。
java基础面试问题
java中的字符串是什么?字符串是数据类型吗?
string是java中的一个类,并在java.lang包中定义。它不是像int和long这样的原始数据类型。字符串类表示字符串。几乎所有java应用程序都使用string,关于string我们应该了解一些有趣的事实。的java 中不可变的字符串状语从句:java的中的最后的字符串,jvm使用字符串池存储所有字符串对象。
关于字符串的其他一些有趣的事情是我们可以使用双引号和“+”运算符的重载来实例化string对象的方式。
有什么不同的方法来创建字符串对象?
我们可以new
像任何普通的java类一样使用运算符创建string对象,也可以使用双引号创建string对象。string 类中有几个构造函数可用于从char,字节数组,stringbuffer和stringbuilder中获取string。
string str = new string("abc"); string str1 = "abc";
当我们使用双引号创建string时,jvm会在string池中查找是否以相同的值存储了其他string。如果找到,则直接返回该string对象的引用,否则创建一个具有给定值的新字符串对象并将其存储在字符串池中。
当我们使用新的运算符时,jvm将创建字符串对象,但不要将其存储到字符串游泳池中。我们可以使用intern()
方法将字符串对象存储到字符串池中,或者如果池中已经存在具有特定值的string,则返回引用。
编写一种方法来检查输入的string是否为回文?
如果字符串的值在反转时相同,则称其为回文。例如,“abc” 是回文字符串。
string类不提供扭转字符串的方法,但stringbuffer
和stringbuilder
类有,我们可以用它来检查,如果字符串是回文与否反向方法。
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; }
写一个方法来从字符串中删除给定的字符?
我们可以使用replaceall
方法将一个字符串的所有出现替换为另一个字符串。需要注意的重要一点是它接受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参数并使用该locale规则将string转换为大写或小写的变体。
什么是string subsequence方法?
java 1.4引入了charsequence接口,而string实现了此接口,这是在string类中实现subsequence方法的唯一原因。在内部,它调用string子字符串方法。
如何在java程序中比较两个字符串?
java string实现了comparable
接口,它具有两种compareto()
方法变体。
compareto(string anotherstring)
方法将string对象与按字典顺序传递的string参数进行比较。如果string对象在传递的参数之前,则返回负整数;如果string对象在传递的参数string之后,则返回正整数。当两个string具有相同的值时,它返回零,在这种情况下,equals(string str)
方法也将返回true。
comparetoignorecase(string str):此方法与第一个方法类似,只是它忽略大小写。它使用string case_insensitive_order比较器进行不区分大小写的比较。如果该值为零,那么equalsignorecase(string str)
还将返回true。
如何将string转换为char,反之亦然?
这是一个棘手的问题,因为string是字符序列,所以我们不能将其转换为单个字符。我们可以使用use charat
方法来获取给定索引处的字符,也可以使用tochararray()
method将string转换为字符数组。
如何将字符串转换为字节数组,反之亦然?
我们可以使用string getbytes()
方法将string转换为字节数组,也可以使用string构造函数new string(byte[] arr)
将字节数组转换为string。
我们可以在switch case下使用string吗?
这是一个棘手的问题,用于检查您对当前java开发的了解。java 7将switch case的功能扩展为也使用strings,早期的java版本不支持此功能。
如果要为字符串实现条件流,则可以使用if-else条件,如果使用的是java 7或更高版本,则可以使用switch用例。
编写程序以打印string的所有排列?
这是一个棘手的问题,我们需要使用递归来查找字符串的所有排列,例如,“ aab”排列将是“ aab”,“ aba”和“ baa”。
我们还需要使用set来确保没有重复的值。
写一个函数找出给定字符串中最长的回文?
一个字符串中可以包含回文字符串,并且在给定的字符串中找到最长的回文是一个编程问题。
string,stringbuffer和stringbuilder之间的区别?
该字符串在java中是不可变的,并且是最终的,因此,每当我们执行string操作时,它都会创建一个新的string。字符串操作消耗资源,因此java为string操作提供了两个实用程序类-stringbuffer和stringbuilder。
stringbuffer和stringbuilder是可变的类。stringbuffer操作是线程安全的,并且在stringbuilder操作不是线程安全的情况下是同步的。因此,在多线程环境中,我们应该使用stringbuffer,但是在单线程环境中,我们应该使用stringbuilder。
由于没有同步开销,因此stringbuilder的性能比stringbuffer快。
为什么string在java中是不可变的或final?
字符串有几个好处,因为它是不可变的且是final。
- 字符串池是可能的,因为字符串在java中是不可变的。
- 它提高了安全性,因为任何黑客都无法更改其值,并且它用于存储敏感信息,例如数据库用户名,密码等。
- 由于string是不可变的,因此在多线程中使用是安全的,并且我们不需要任何同步。
- 字符串用于java类加载器中,不变性提供了确保类加载器可以加载正确类的安全性。
如何在java中拆分字符串?
我们可以split(string regex)
根据提供的正则表达式将string拆分为string数组。
为什么用char数组而不是string来首选存储密码?
字符串在java中是不可变的,并存储在字符串池中。一旦创建,它将一直保留在池中,直到收集到垃圾为止,因此即使我们使用密码完成操作,它也可以在内存中使用更长的时间,并且无法避免。这存在安全风险,因为任何有权访问内存转储的人都可以找到明文形式的密码。
如果我们使用char数组存储密码,则在完成密码设置后可以将其设置为空白。因此,我们可以控制它在内存中的可用时间,从而避免string带来的安全威胁。
您如何检查java中两个字符串是否相等?
有两种检查两个字符串是否相等的方法–使用“ ==”运算符或使用equals
方法。当我们使用“ ==”运算符时,它会检查string的值以及引用,但是在我们的编程中,大多数时候我们只检查string的相等性是否为value。因此,我们应该使用equals方法检查两个string是否相等。
还有另一个函数equalsignorecase
可以忽略大小写。
string s1 = "abc"; string s2 = "abc"; string s3= new string("abc"); system.out.println("s1 == s2 ? "+(s1==s2)); //true system.out.println("s1 == s3 ? "+(s1==s3)); //false system.out.println("s1 equals s3 ? "+(s1.equals(s3))); //true
什么是字符串池?
顾名思义,字符串池是存储在java堆内存中的字符串池。我们知道string是java中的一个特殊类,我们可以使用new运算符以及提供双引号中的值来创建string对象。
string intern()方法有什么作用?
调用intern方法时,如果池已经包含等于equals(object)方法确定的此string对象的字符串,则返回池中的字符串。否则,将此string对象添加到池中,并返回对此string对象的引用。
此方法始终返回一个与该字符串具有相同内容的字符串,但是保证该字符串来自唯一字符串池。
string在java中是否是线程安全的?
字符串是不可变的,因此我们无法在程序中更改其值。因此,它是线程安全的,可以在多线程环境中安全使用。
为什么string是java中流行的hashmap键?
由于string是不可变的,因此其哈希码将在创建时进行缓存,因此无需再次计算。这使其成为map中密钥的理想候选者,并且其处理速度比其他hashmap密钥对象快。这就是为什么string主要用作object作为hashmap键的原因。
字符串编程问题
-
下面程序的输出是什么?
package com.journaldev.strings; public class stringtest { public static void main(string[] args) { string s1 = new string("pankaj"); string s2 = new string("pankaj"); system.out.println(s1 = s2); } }
这是一个简单但棘手的程序,它将打印“ pankaj”,因为我们将s2字符串分配给s1。不要与==比较运算符混淆。
-
下面程序的输出是什么?
package com.journaldev.strings; public class test { public void foo(string s) { system.out.println("string"); } public void foo(stringbuffer sb){ system.out.println("stringbuffer"); } public static void main(string[] args) { new test().foo(null); } }
上面的程序不会编译错误,因为“方法foo(string)对于test类型是不明确的”。
-
下面的代码片段的输出是什么?
string s1 = new string("abc"); string s2 = new string("abc"); system.out.println(s1 == s2);
因为我们使用_new_运算符创建string,所以它将打印false,因此它将在堆内存中创建,并且s1,s2都有不同的引用。如果我们使用双引号创建它们,则它们将成为字符串池的一部分,并且将显示true。
-
下面的代码片段将输出什么?
string s1 = "abc"; stringbuffer s2 = new stringbuffer(s1); system.out.println(s1.equals(s2));
因为s2不是string类型,它将打印false。如果查看string类中的equals方法实现,则会发现使用instanceof运算符进行检查以检查传递的对象的类型是否为string?如果不是,则返回false。
-
下面程序的输出是什么?
string s1 = "abc"; string s2 = new string("abc"); s2.intern(); system.out.println(s1 ==s2);
这是一个棘手的问题,输出将为false。我们知道intern()方法将从字符串池中返回string对象引用,但是由于我们没有将其分配回s2,因此s2中没有变化,因此s1和s2都有不同的引用。如果将第3行中的代码更改为,
s2 = s2.intern();
则输出为true。 -
在下面的代码片段中创建了多少个string对象?
string s1 = new string("hello"); string s2 = new string("hello");
答案是:3。
第一行,字符串池中的“hello”对象。
第二行–第1行,堆内存中值为“hello”的新字符串。
第三行–第2行,堆内存中值为“hello”的新字符串。在这里,字符串池中的“hello”字符串被重用。
我希望这里列出的问题对你的java面试有所帮助。
“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!
关注公众号:「java 知己」,每天更新java知识哦,期待你的到来!
- 发送「group」,与 10 万程序员一起进步。
- 发送「面试」,领取batj面试资料、面试视频攻略。
- 发送「玩转算法」,领取《玩转算法》系列视频教程。
- 千万不要发送「1024」...