<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Java 字符串面試問題與答案 > 原文: [https://howtodoinjava.com/interview-questions/interview-stuff-about-string-class-in-java/](https://howtodoinjava.com/interview-questions/interview-stuff-about-string-class-in-java/) 我們所有人都必須經過與 Java 中的[字符串](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html)類相關的[面試問題](//howtodoinjava.com/java-interview-questions/)。 這些**字符串面試問題**的范圍從[不變性](https://en.wikipedia.org/wiki/Immutable_object#Java "immutability in java")到內存泄漏問題。 我將在這篇文章中嘗試解決此類問題。 ```java Frequently asked String Interview Questions 1\. Is String keyword in Java? 2\. Why are strings immutable? 3\. What is String constant pool? 4\. Keyword 'intern' usage 5\. Matching Regular expressions? 6\. String comparison with equals() and '=='? 7\. Memory leak issue in String class 8\. How does String work in Java? 9\. What are different ways to create String Object? 10\. How to check if String is Palindrome. 11\. How to remove or replace characters from String. 12\. How to make String upper case or lower case? 13\. How to compare two Strings in java program? 14\. Can we use String in the switch case? 15\. Write a program to print all permutations of String? 16\. Write a java program to reverse each word of a given string?? 17\. How to Split String in java? 18\. Why is Char array preferred over String for storing password? 19\. Is String thread-safe in Java 20\. Why String is popular HashMap key in Java 21\. Difference between String, StringBuffer and StringBuilder? 22\. How to concatenate multiple strings. 23\. How many objects will be created with string initialization code? 24\. How do you count the number of occurrences of each character in a string? 25\. Write a java program to reverse a string? ``` ## 1\. Java 中的`String`是關鍵字嗎? 沒有。 `String`不是 Java 保留的關鍵字。 它是派生類型數據類型,即類。 ```java public class StringExample { public static void main(String[] args) { Integer String = 10; System.out.println(String); //Prints 10 } } ``` ## 2.為什么字符串是不可變的? 我們都知道 java 中的字符串是[不可變的](https://howtodoinjava.com/java/string/java-interview-question-why-strings-are-immutable/)。 如果您想知道什么是不變性以及如何實現? 按照這篇文章:[如何使 java 類不可變](//howtodoinjava.com/java/related-concepts/how-to-make-a-java-class-immutable/ "How to make a java class immutable")? 這里的問題是為什么? 為什么一成不變? 讓我們分析一下。 1. 我能想到的第一個原因是***性能提升***。 開發 Java 語言是為了加快應用程序開發,因為以前的語言并沒有那么快。 JVM 設計人員必須足夠聰明,才能識別出現實世界中的應用程序將主要由標簽,消息,配置,輸出等多種形式的字符串組成。 看到這種過度使用,他們想像到不正確使用字符串會帶來多大的危險。 因此,他們提出了字符串池的概念(下一部分)。 字符串池不過是一些大多數唯一字符串的集合。 字符串池背后的最基本思想是重新創建字符串。 這樣,如果一個特定的字符串在代碼中創建了 20 次,則應用最終將只有一個實例。 2. 第二個原因是***安全注意事項***。 字符串是 Java 編程各個方面中最常用的參數類型。 無論是加載驅動程序還是打開 URL 連接,您都需要以字符串形式將信息作為參數傳遞。 如果字符串不是最終的,那么它們就打開了一個安全問題的潘多拉盒。我們所有人都必須通過與 Java 中的[`String`](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html)類相關的[面試問題](//howtodoinjava.com/java-interview-questions/)。 這些問題的范圍從[不變性](https://en.wikipedia.org/wiki/Immutable_object#Java "immutability in java")到內存泄漏問題。 我將在這篇文章中嘗試解決此類問題。 除了上述兩個原因外,我沒有找到任何令人信服的答案。 如果您有任何吸引人的內容,請與我分享。 ## 3.字符串池概念 字符串池是一個特殊的內存區域,與存儲這些字符串常量的常規堆內存分開。 這些對象在應用的生命周期中稱為字符串變量。 在 Java 中,可以通過多種方式創建`String`。 讓我們了解它們: #### 1)字符串賦值 ```java String str = "abc"; ``` 上面的代碼使 JVM 驗證是否已經有一個字符串`"abc"`(相同的字符序列)。 如果存在這樣的字符串,則 JVM 僅將現有對象的引用分配給變量`str`,否則,將創建一個新的對象`"abc"`,并將其引用分配給變量`str`。 #### 2)使用`new`新關鍵字 ```java String str = new String("abc"); ``` 此版本最終**在內存**中創建兩個對象。 字符串池中的一個對象具有`char`序列`"abc"`,第二個對象在堆存儲器中由變量`str`引用,并且具有與`"abc"`相同的`char`序列。 正如 java 文檔所說的: ***除非需要顯式的原始副本,否則不需要使用此構造器,因為字符串是不可變的。*** ## 4.關鍵字“實習生”的用法 [java 文檔](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#intern--) 最好地描述了這一點: 調用`intern()`方法時,如果池已經包含一個與`equals(Object)`方法確定的等于`String`對象的字符串,則返回池中的字符串。 否則,將此`String`對象添加到池中,并返回對此`String`對象的引用。 ```java String str = new String("abc"); str.intern(); ``` 因此,對于`s`和`t`中的任何兩個字符串,當且僅當`s.equals(t)`為`true`時,`s.intern() == t.intern()`才為`true`。 意味著如果`s`和`t`都是不同的字符串對象,并且具有相同的字符序列,則在這兩個變量上調用`intern()`將導致兩個變量引用的單個字符串池文本。 ## 5.匹配正則表達式 如果您還沒有探索的話,它并不是那么秘密,但很有用。 您必須已經看到[`Pattern`](https://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html "java util Pattern")和`Matcher`用于正則表達式匹配的用法。 字符串類提供了自己的快捷方式。 直接使用。 此方法還使用函數定義內的`Pattern.matches()`。 ```java String str = new String("abc"); str.matches("<regex>"); ``` ## 6.使用`equals()`和`==`進行字符串比較 面試中另一個最喜歡的領域。 通常有兩種比較對象的方法 * 使用`==`運算符 * 使用`equals()`方法 **`==`運算符比較對象引用**,即內存地址相等性。 因此,如果兩個字符串對象引用字符串池中的相同文本或堆中的相同字符串對象,則`s==t`將返回`true`,否則返回`false`。 `equals()`方法在`String`類中被覆蓋,**它驗證字符串對象**持有的`char`序列。 如果它們存儲相同的字符序列,則`s.equals(t)`將返回`true`,否則返回`false`。 ## 7.內存泄漏問題 到目前為止,我們已經完成了基本的工作。 現在發生了嚴重的事情。 您是否嘗試過從字符串對象創建子字符串? 我敢打賭,是的。 您知道 Java 中子字符串的內部嗎? 他們如何造成內存泄漏? Java 中的子字符串是使用方法`substring(int beginIndex)`和此方法的其他一些重載形式創建的。 所有這些方法都會創建一個新的`String`對象,并更新在本文開頭看到的`offset`和`count`變量。 *原始值數組不變。 因此,如果您創建一個包含 10000 個字符的字符串,并創建 100 個每個包含 5-10 個字符的子字符串,則所有 101 個對象將具有大小為 10000 個字符的相同字符數組。 毫無疑問,這是內存浪費。* 讓我們使用程序來看看: ```java import java.lang.reflect.Field; import java.util.Arrays; public class SubStringTest { public static void main(String[] args) throws Exception { //Our main String String mainString = "i_love_java"; //Substring holds value 'java' String subString = mainString.substring(7); System.out.println(mainString); System.out.println(subString); //Lets see what's inside mainString Field innerCharArray = String.class.getDeclaredField("value"); innerCharArray.setAccessible(true); char[] chars = (char[]) innerCharArray.get(mainString); System.out.println(Arrays.toString(chars)); //Now peek inside subString chars = (char[]) innerCharArray.get(subString); System.out.println(Arrays.toString(chars)); } } Output: i_love_java java [i, _, l, o, v, e, _, j, a, v, a] [i, _, l, o, v, e, _, j, a, v, a] ``` 顯然,兩個對象都存儲有相同的`char`數組,而`subString`只需要四個字符。 讓我們使用自己的代碼解決此問題: ```java import java.lang.reflect.Field; import java.util.Arrays; public class SubStringTest { public static void main(String[] args) throws Exception { //Our main String String mainString = "i_love_java"; //Substring holds value 'java' String subString = fancySubstring(7, mainString); System.out.println(mainString); System.out.println(subString); //Lets see what's inside mainString Field innerCharArray = String.class.getDeclaredField("value"); innerCharArray.setAccessible(true); char[] chars = (char[]) innerCharArray.get(mainString); System.out.println(Arrays.toString(chars)); //Now peek inside subString chars = (char[]) innerCharArray.get(subString); System.out.println(Arrays.toString(chars)); } //Our new method prevents memory leakage public static String fancySubstring(int beginIndex, String original) { return new String(original.substring(beginIndex)); } } Output: i_love_java java [i, _, l, o, v, e, _, j, a, v, a] [j, a, v, a] ``` 現在,子字符串只有它需要的字符,并且可以無用地收集用于創建正確子字符串的中間字符串,從而不占用任何內存。 ## 8\. `String`如何在 Java 中工作? Java 中的字符串類似于任何其他編程語言,都是字符序列。 這更像是用于該`char`序列的工具類。 此`char`序列在以下變量中維護: ```java /** The value is used for character storage. */ private final char value[]; ``` 要在不同的情況下訪問此數組,請使用以下變量: ```java /** The offset is the first index of the storage that is used. */ private final int offset; /** The count is the number of characters in the String. */ private final int count; ``` ## 10.如何檢查回文中的字符串? 如果字符串的值在反轉時相同,則稱其為[回文](https://en.wikipedia.org/wiki/Palindrome)。 要檢查回文,只需反轉字符串并檢查原始字符串和受尊敬的字符串的內容。 ```java public class StringExample { public static void main(String[] args) { String originalString = "abcdcba"; StringBuilder strBuilder = new StringBuilder(originalString); String reverseString = strBuilder.reverse().toString(); boolean isPalindrame = originalString.equals(reverseString); System.out.println(isPalindrame); //true } } ``` ## 11.如何從`String`中刪除或替換字符? 要替換或刪除字符,請使用`String.replace()`或`String.replaceAll()`。 這些方法有兩個參數。 第一個參數是要替換的字符,第二個參數是將放置在字符串中的新字符。 如果要刪除字符,請在第二個參數中傳遞空白字符。 ```java String originalString = "howtodoinjava"; //Replace one character System.out.println( originalString.replace("h", "H") ); //Howtodoinjava //Replace all matching characters System.out.println( originalString.replaceAll("o", "O") ); //hOwtOdOinjava //Remove one character System.out.println( originalString.replace("h", "") ); //owtodoinjava //Remove all matching characters System.out.println( originalString.replace("o", "") ); //hwtdinjava ``` ## 12.如何使`String`大寫或小寫? 使用`String.toLowerCase()`和`String.toUpperCase()`方法將字符串轉換為小寫或大寫。 ```java String blogName = "HowToDoInJava.com"; System.out.println(blogName.toLowerCase()); //howtodoinjava.com System.out.println(blogName.toUpperCase()); //HOWTODOINJAVA.COM ``` ## 13.如何在 Java 程序中比較兩個字符串? 始終使用`equals()`方法來驗證字符串是否相等。 切勿使用`"=="`運算符。 雙重等于運算符始終檢查內存中的對象引用。 `equals()`方法檢查字符串內容。 ```java String blogName = "HowToDoInJava.com"; String anotherString = new String("HowToDoInJava.com"); System.out.println(blogName == anotherString); //false System.out.println(blogName.equals(anotherString)); //true ``` ## 14.我們可以在開關盒中使用 String 嗎? 是的,自 Java7 起,您可以在`switch`語句中使用[`String`類](https://howtodoinjava.com/java7/string-class-is-supported-in-switch-statement-in-java-7/)。在 Java7 之前,這是不可能的,您必須使用`if-else`語句才能實現類似的行為。 ```java String number = "1"; switch (number) { case "1": System.out.println("One"); //Prints '1' break; case "2": System.out.println("Two"); break; default: System.out.println("Other"); } ``` ## 15.編寫一個程序以打印`String`的所有排列? 排列是對字符的有序列表的元素進行重新排列,以使每個排列相對于其他排列都是唯一的。 例如,以下是字符串“`ABC`”的排列 – `ABC ACB BAC BCA CBA CAB`。 > 長度為`N`的字符串具有`N!`(`N`的階乘)個排列。 ```java import java.util.HashSet; import java.util.Set; public class StringExample { public static void main(String[] args) { System.out.println(getPermutations("ABC")); //Prints //[ACB, BCA, ABC, CBA, BAC, CAB] } public static Set<String> getPermutations(String string) { //All permutations Set<String> permutationsSet = new HashSet<String>(); // invalid strings if (string == null || string.length() == 0) { permutationsSet.add(""); } else { //First character in String char initial = string.charAt(0); //Full string without first character String rem = string.substring(1); //Recursive call Set<String> wordSet = getPermutations(rem); for (String word : wordSet) { for (int i = 0; i <= word.length(); i++) { permutationsSet.add(charInsertAt(word, initial, i)); } } } return permutationsSet; } public static String charInsertAt(String str, char c, int position) { String begin = str.substring(0, position); String end = str.substring(position); return begin + c + end; } } ``` ## 16.編寫一個 Java 程序來反轉給定字符串的每個單詞? 要分別反轉每個單詞,首先,對字符串進行標記,并在數組中將所有單詞分開。 然后對每個單詞應用反向單詞邏輯,最后連接所有單詞。 ```java String blogName = "how to do in java dot com"; //spilt on white space String[] tokens = blogName.split(" "); //It will store reversed words StringBuffer finalString = new StringBuffer(); //Loop all words and reverse them for (String token : tokens) { String reversed = new StringBuffer(token).reverse().toString(); finalString.append(reversed); finalString.append(" "); } //Check final string System.out.println(finalString.toString()); //woh ot od ni avaj tod moc ``` ## 17.如何在 Java 中拆分字符串? 使用[`String.split()`](https://howtodoinjava.com/java/string/4-ways-to-split-tokenize-strings-in-java/)方法可在給定正則表達式的匹配項附近中斷給定字符串。 也稱為基于定界符的獲取**字符串令牌**。 `split()`方法返回字符串數組。 數組中的每個字符串都是單獨的標記。 ```java String numbers = "1,2,3,4,5,6,7"; String[] numArray = numbers.split(","); System.out.println(Arrays.toString(numArray)); //[1, 2, 3, 4, 5, 6, 7] ``` ## 18.為什么用`Char`數組而不是`String`來首選`Char`數組來存儲密碼? 我們知道字符串存儲在 Java 的常量池中。 一旦在字符串池中創建了一個字符串,它將一直保留在該池中,直到收集到垃圾為止。 這時,任何惡意程序都可以訪問物理內存位置中的內存位置,也可以訪問字符串。 如果我們將密碼存儲為字符串,那么它也將存儲在 spring 池中,并且在內存中的可用時間比要求的更長,因為垃圾收集周期是不可預測的。 這使得敏感的密碼字符串**容易遭到黑客攻擊和數據盜竊**。 使用后可以將`String`留空嗎? 不,我們不可以。 我們知道,一旦創建了字符串,我們將無法對其進行操作,例如,您不能更改其內容。 字符串是最終的且不可變的。 但是`char`數組是可變的,使用后它們的內容可以被覆蓋。 因此,您的應用應使用`char[]`存儲密碼文本,并在使用密碼后,將數組內容替換為空白。 ```java String password = "123456"; //Do not use it char[] passwordChars = new char[4]; //Get password from some system such as database //use password for(char c : passwordChars) { c = ' '; } ``` ## 19\. Java 中的字符串線程安全嗎? 是的,字符串是[線程安全的](https://howtodoinjava.com/java/multi-threading/what-is-thread-safety/)。 它們是不可變的,默認情況下,java 中所有不可變的實例都是線程安全的。 ## 20.為什么`String`是 Java 中流行的`HashMap`鍵? 在 Java 中,必須在`Map`中使用的鍵是不可變的,并且應遵循`equals()`和`hashCode()`方法之間的約定。 `String`類滿足這兩個條件。 另外,`String`類提供了許多有用的方法來比較,排序,標記化或小寫。 在`Map`上執行 CRUD 操作時可以使用這些方法。 這使它成為在`Map`中使用而不是創建自己的類的非常有用的類。 ## 21\. `String`,`StringBuffer`和`StringBuilder`之間的區別? * `String`類表示字符序列,并提供了使用字符的有用方法。 字符串類實例是不可變的。 因此,每次使用字符串類執行字符串連接時,都會使用連接的字符串創建一個新對象。 * `StringBuilder`類用于以更節省內存的方式執行字符串連接操作。 它在內部維護一個`char`數組并僅操作該數組中的內容。 執行完所有操作后需要獲取完整的連接字符串時,它將創建一個具有字符數組內容的新`String`。 * `StringBuffer`與`StringBuilder`類非常相似。 唯一的區別是它是線程安全的。 所有方法都是`synchronized`。 ## 22.如何連接多個字符串? 根據您是否需要線程安全來使用`StringBuffer`或`StringBuilder`類。 在兩個類中都使用`append()`方法來連接字符串。 ```java StringBuffer buffer = new StringBuffer(); buffer.append("how") .append("to") .append("do") .append("in") .append("java") .append(".") .append("com"); String blogName = buffer.toString(); System.out.println(blogName); //howtodoinjava.com ``` ## 23.使用字符串初始化代碼將創建多少個對象? ```java String s1 = "howtodoinjava.com"; String s2 = "howtodoinjava.com"; String s3 = new String("howtodoinjava.com"); ``` 1. 上面的代碼將創建 **2 個對象**。 2. 第一個語句將在字符串池中創建第一個對象。 3. 第二條語句不會創建任何新對象,并且`s2`將引用與`s1`相同的字符串常量。 4. 第三條語句將在堆內存中創建一個新的字符串對象。 ## 24.如何計算字符串中每個字符的出現次數? 為了找到給定字符串中每個字符的出現次數,我們使用了`HashMap`,并將該字符作為鍵,并將其出現作為值。 每次出現新的字符時,我們將增加該字符的值。 ```java String blogName = "howtodoinjava.com"; HashMap<Character, Integer> occurancesMap = new HashMap<Character, Integer>(); char[] strArray = blogName.toCharArray(); for (char c : strArray) { if(occurancesMap.containsKey(c)) { occurancesMap.put(c, occurancesMap.get(c)+1); } else { occurancesMap.put(c, 1); } } System.out.println(occurancesMap); //{a=2, c=1, d=1, h=1, i=1, j=1, m=1, n=1, .=1, o=4, t=1, v=1, w=1} ``` ## 25.編寫一個 Java 程序來不使用`StringBuilder`或`StringBuffer`反轉字符串? 反轉字符串的最佳方法肯定是`StringBuffer.reverse()`和`StringBuilder.reverse()`方法。 不過,面試官可能會要求您編寫自己的程序,以檢查您的技能水平。 使用下面給出的基于遞歸的示例來反轉字符串。 該程序從字符串中獲取第一個字符,并將其放置在字符串中的最后一個位置。 它將替換字符串中的所有字符,直到驗證整個字符串為止。 ```java public class StringExample { public static void main(String[] args) { String blogName = "howtodoinjava.com"; String reverseString = recursiveSwap(blogName); System.out.println(reverseString); } static String recursiveSwap(String str) { if ((null == str) || (str.length() <= 1)) { return str; } return recursiveSwap(str.substring(1)) + str.charAt(0); } } ``` 我可以想到這些**常見的`String`面試問題**將為您的下一次面試提供幫助。 如果您還有其他關于`String`類的問題,請分享。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看