کلاس
String
یکی از پرکاربردترین کلاس ها در جاوا است. این مقاله چند پرسش و پاسخ مهم مصاحبه رشته جاوا را ارائه می دهد. آنها در بدست آوردن تصویری کامل از کلاس بسیار مفید خواهند بود و شما را برای هر سوال مصاحبه String
مرتبط با کلاس آماده می کنند .String
1. String در جاوا چیست؟ این چه نوع داده ای است؟
String یک کلاس در جاوا است که در بسته java.lang تعریف شده است. این یک نوع داده اولیه مانند int و long نیست. کلاس String یک مجموعه کاراکتر رشته ای را نشان می دهد. رشته ها تقریباً در تمام برنامه های جاوا استفاده می شوند و چند واقعیت وجود دارد که باید در مورد کلاس String بدانیم. این یکimmutable
نوع داده غیرقابل تغییر ( ) و نهایی شده در جاوا است و String
ماشین مجازی تمام اشیاء کلاس را در یک مجموعه رشته ای ذخیره می کند. یکی دیگر از ویژگی های String
این است که راه برای به دست آوردن اشیاء کلاس String
با استفاده از دو نقل قول و بارگذاری بیش از حد عملگر "+" برای الحاق.
2. راه های مختلف ایجاد یک شی String چیست؟
میتوانیم مانند هر کلاس دیگر در جاوا، اشیایی را با استفاده از عملگر جدید ایجاد کنیم یا میتوانیم از دو کوتیشن برای ایجاد یک شی استفاده کنیمString
. String
همچنین چندین سازنده کلاس برای گرفتن یک رشته از یک آرایه کاراکتر، یک آرایه بایت و همچنین استفاده StringBuffer
از یا وجود دارد StringBuilder
.
String str = new String("abc");
String str1 = "abc";
هنگامی که ما یک رشته با استفاده از کوتیشن های دوگانه ایجاد می کنیم، ماشین مجازی جاوا در مجموعه رشته ها به دنبال رشته دیگری با همان مقدار می گردد. اگر رشته پیدا شد، آنگاه فقط یک مرجع به یک شی موجود از کلاس برگردانده می شود String
، در غیر این صورت یک شی جدید با مقدار دریافتی ایجاد می شود و در pool ذخیره می شود. هنگامی که از عملگر جدید استفاده می کنیم، ماشین مجازی یک شی ایجاد می کند String
اما آن را در مجموعه رشته ها ذخیره نمی کند. میتوانیم از این روش intern()
برای ذخیره یک رشته در استخر رشتهای استفاده کنیم یا اگر چنین رشتهای قبلاً در استخر وجود داشته باشد، یک مرجع دریافت کنیم.
3. روشی بنویسید تا بررسی کنید که آیا یک رشته پالیندروم است یا خیر.
یک رشته اگر در هر دو جهت یکسان خوانده شود پالیندروم نامیده می شود. به عنوان مثال، "آبا" یک رشته پالیندرومیک است. کلاسString
هیچ روشی برای معکوس کردن یک رشته ارائه نمیکند، اما کلاسها یک متد معکوس StringBuffer
دارند StringBuilder
که با آن میتوانیم بررسی کنیم که آیا رشته ما یک palindrome است یا خیر.
private static boolean isPalindrome(String str) {
if (str == null)
return false;
StringBuilder strBuilder = new StringBuilder(str);
strBuilder.reverse();
return strBuilder.toString().equals(str);
}
گاهی اوقات ممکن است مصاحبه کننده بخواهد که از کلاس های دیگر برای این بررسی استفاده نشود، در این صورت می توانیم کاراکترهای رشته را در هر دو طرف مقایسه کنیم تا وجود پالیندروم را بررسی کنیم.
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;
}
4. روشی برای حذف یک کاراکتر از یک رشته بنویسید.
میتوانیم از روشیreplaceAll
برای جایگزینی تمام رخدادهای یک رشته با رشتهای دیگر استفاده کنیم. توجه داشته باشید که متد یک رشته را به عنوان آرگومان می گیرد، بنابراین از کلاس Character
برای ایجاد یک رشته از یک کاراکتر استفاده می کنیم و از آن برای جایگزینی همه کاراکترها با رشته خالی استفاده می کنیم.
private static String removeChar(String str, char ch) {
if (str == null)
return null;
return str.replaceAll(Character.toString(ch), "");
}
5. چگونه یک رشته را به حروف بزرگ یا کوچک تبدیل کنیم؟
میتوانیم از متدهای کلاسString toUpperCase
برای toLowerCace
گرفتن رشتههای بزرگ و کوچک استفاده کنیم. این متدها یک اضافه بار دارند که یک آرگومان را می گیرد Locale
و از قوانین محلی سازی آن برای تبدیل رشته به حروف بزرگ یا کوچک استفاده می کند.
6. روش subSequence چه کاری انجام می دهد؟
جاوا 1.4 این رابط را معرفی کردCharSequence
، یک کلاس String
این رابط را به ارث می برد و این تنها دلیل برای پیاده سازی یک متد subSequence
در یک کلاس است String
. در داخل آن را صدا می کند substring
. یک مثال ساده از استفاده از روش:
public class StringSubsequence {
public static void main(String[] args) {
String str = "www.journaldev.com";
System.out.println("Last 4 char String: "+str.subSequence(str.length()-4, str.length()));
System.out.println("First 4 char String: "+str.subSequence(0, 4));
System.out.println("website name: "+str.subSequence(4, 14));
//substring vs subSequence
System.out.println("substring == subSequence ? "
+(str.substring(4, 14) == str.subSequence(4, 14)));
System.out.println("substring equals subSequence ? "
+(str.substring(4, 14).equals(str.subSequence(4, 14))));
}
}
خروجی برنامه موارد زیر را نشان خواهد داد:
Last 4 char String: .com
First 4 char String: www.
website name: journaldev
substring == subSequence ? false
substring equals subSequence ? true
در حالت ایده آل شما باید همیشه از substring
.
7. چگونه دو رشته را در جاوا مقایسه کنیم؟
کلاسString
رابط را به ارث می برد Comparable
و دو گزینه متد دارد compareTo()
. این روش compareTo(String anotherString)
شی را String
با آرگومان دریافتی String
از نظر لغوی مقایسه می کند. اگر خط فعلی قبل از رشته دریافتی باشد، متد یک عدد صحیح منفی برمیگرداند و اگر رشته از آرگومان دریافتی پیروی کند، یک عدد صحیح مثبت برمیگرداند integer
. اگر متد 0 را برگرداند، رشته دارای همان مقدار است، در این صورت متد equals(String str)
نیز true را برمی گرداند. compareToIgnoreCase(String str)
: این روش مشابه روش قبلی است با این تفاوت که حروف بزرگ را نادیده می گیرد. از CASE_INSENSITIVE_ORDER مقایسه کننده برای مقایسه بدون حساسیت به حروف بزرگ و کوچک استفاده می کند. اگر مقدار بازگشتی صفر باشد، متد equalsIgnoreCase(String str)
نیز true را برمی گرداند. بیایید به یک مثال کوچک برای توضیح این روش ها نگاه کنیم:
public class StringCompareToExample {
public static void main(String[] args) {
String str = "ABC";
System.out.println(str.compareTo("DEF"));
System.out.println(str.compareToIgnoreCase("abc"));
}
}
برنامه خروجی زیر را خواهد داشت:
-3
0
8. چگونه یک رشته را به کاراکتر و بالعکس تبدیل کنیم؟
این یک سوال ترفندی است زیرا یک رشته دنباله ای از کاراکترها است، بنابراین ما فقط می توانیم آن را به یک کاراکتر تبدیل کنیم. میتوانیم از یک متدcharAt
برای دریافت کاراکتر در یک موقعیت مشخص استفاده کنیم یا میتوانیم از روشی toCharArray()
برای تبدیل یک رشته به آرایهای از کاراکترها استفاده کنیم. یک مثال ساده که نحوه تبدیل رشته به کاراکتر و کاراکتر به رشته در جاوا را نشان می دهد.
import java.util.Arrays;
public class StringToCharToString {
public static void main(String[] args) {
//String to char array
String str = "123";
char[] chArr = str.toCharArray();
System.out.println("String to char array: "+Arrays.toString(chArr));
//String to char
char c = str.charAt(1);
System.out.println("String to char: "+c);
//char to String
String s = Character.toString(c);
System.out.println("char to String: "+s);
//удалить все заданные символы из строки
System.out.println("removing all chars from String: "
+removeCharFromString("1ABCD12DW", '1'));
}
private static String removeCharFromString(String str, char c) {
return str.replaceAll(Character.toString( c ), "");
}
}
برنامه خروجی زیر را خواهد داشت:
String to char array: [1, 2, 3]
String to char: 2
char to String: 2
removing all chars from String: ABCD2DW
9. چگونه یک رشته را به آرایه بایتی تبدیل کنیم و بالعکس؟
getBytes()
برای تبدیل رشته به آرایه بایتی می توانیم از یک متد و new String(byte[] arr)
برای تبدیل آرایه بایتی به رشته از سازنده استفاده کنیم.
import java.util.Arrays;
public class StringByteArray {
public static void main(String[] args) {
String str = "www.journaldev.com";
//преобразование String в byte array
byte[] byteArr = str.getBytes();
System.out.println("String to byte array : "+Arrays.toString(byteArr));
//преобразование byte array и String
String str1 = new String(byteArr);
System.out.println("byte array to String : "+str1);
//посмотрим, str и str1 одинаковые or нет
System.out.println("str == str1? " + (str == str1));
System.out.println("str.equals(str1)? " + (str.equals(str1)));
}
}
برنامه خروجی زیر را خواهد داشت:
String to byte array : [119, 119, 119, 46, 106, 111, 117, 114, 110, 97, 108, 100, 101, 118, 46, 99, 111, 109]
byte array to String : www.journaldev.com
str == str1? false
str.equals(str1)? true
10. آیا می توانیم از یک رشته در ساختار سوئیچ استفاده کنیم؟
این سوال پیچیده برای آزمایش دانش شما از پیشرفت فعلی زبان استفاده می شود. جاوا 7 دستور switch را برای استفاده از رشته ها گسترش می دهد؛ نسخه های قبلی جاوا این را پشتیبانی نمی کنند. اگر یک جریان شرطی برای رشته ها پیاده سازی می کنید، می توانید از شرایط if-else استفاده کنید و اگر از جاوا 7 یا جدیدتر استفاده می کنید می توانید از دستور switch استفاده کنید. یک مثال کوچک از استفاده از یک رشته در یک دستورswitch
و روش دیگری که همان منطق را با استفاده از شرایط نشان می دهد if-else
.
public class SwitchStringExample {
public static void main(String[] args) {
printColorUsingSwitch("red");
printColorUsingIf("red");
// оператор switch регистрозависимый
printColorUsingSwitch("RED");
printColorUsingSwitch(null);
}
private static void printColorUsingIf(String color) {
if (color.equals("blue")) {
System.out.println("BLUE");
} else if (color.equals("red")) {
System.out.println("RED");
} else {
System.out.println("INVALID COLOR CODE");
}
}
private static void printColorUsingSwitch(String color) {
switch (color) {
case "blue":
System.out.println("BLUE");
break;
case "red":
System.out.println("RED");
break;
default:
System.out.println("INVALID COLOR CODE");
}
}
}
برنامه خروجی زیر را خواهد داشت:
RED
RED
INVALID COLOR CODE
Exception in thread "main"
java.lang.NullPointerException
at com.journaldev.util.SwitchStringExample.printColorUsingSwitch(SwitchStringExample.java:24)
at com.journaldev.util.SwitchStringExample.main(SwitchStringExample.java:10)
نکات کلیدی استفاده switch
از رشته ها در جاوا.
- استفاده از رشته ها در طراحی
switch
با حذف زنجیره های متعدد شرایط، کد را خواناتر می کندif-else
. - رشتهها به
switch
حروف بزرگ و کوچک حساس هستند، مثال بالا این را نشان میدهد. - اپراتور
switch
از روشیString.equals()
برای مقایسه مقدار به دست آمده با مقادیر مورد استفاده می کند ، بنابراین برای اجتناب از آن یک بررسی برای NULL اضافه کنیدNullPointerException
. - با توجه به مستندات جاوا 7 برای رشته ها در
switch
, کامپایلر جاوا بایت کد کارآمدتری را برای رشته ها در یک ساختار تولید می کندswitch
تا برای شرایط پیوستهif-else
. - مطمئن شوید که این با جاوا 7 یا جدیدتر استفاده می شود، در غیر این صورت دریافت خواهید کرد
xception
.
11. برنامه ای بنویسید که تمام جایگشت های یک رشته را چاپ کند.
این یک سوال پیچیده است و ما باید از بازگشت برای یافتن همه جایگشت های یک رشته استفاده کنیم، برای مثال جایگشت های "AAB" می توانند "AAB"، "ABA" و "BAA" باشند. همچنین باید از Set استفاده کنیم تا مطمئن شویم ردیف های تکراری نداریم. برای بدست آوردن همه جایگشت ها، ابتدا کاراکتر اول رشته را می گیریم و کاراکترهای باقیمانده را دوباره مرتب می کنیم. اگر String = "ABC" کاراکتر اول char = A و جایگشت های باقی مانده BC و CB. اکنون می توانیم اولین کاراکتر را در موقعیت های موجود در جایگشت ها قرار دهیم. BC -> ABC، BAC، BCA CB -> ACB، CAB، CBA نمونه برنامه:import java.util.HashSet;
import java.util.Set;
public class StringHelper {
public static Set<String> permutationFinder(String str) {
Set<String> perm = new HashSet<String>();
//Handling error scenarios
if (str == null) {
return null;
} else if (str.length() == 0) {
perm.add("");
return perm;
}
char initial = str.charAt(0); // первый символ
String rem = str.substring(1); // полная строка без первого символа
Set<String> words = permutationFinder(rem);
for (String strNew : words) {
for (int i = 0;i<=strNew.length();i++){
perm.add(charInsert(strNew, initial, i));
}
}
return perm;
}
public static String charInsert(String str, char c, int j) {
String begin = str.substring(0, j);
String end = str.substring(j);
return begin + c + end;
}
public static void main(String[] args) {
String s = "AAC";
String s1 = "ABC";
String s2 = "ABCD";
System.out.println("\nPermutations for " + s + " are: \n" + permutationFinder(s));
System.out.println("\nPermutations for " + s1 + " are: \n" + permutationFinder(s1));
System.out.println("\nPermutations for " + s2 + " are: \n" + permutationFinder(s2));
}
}
خروجی برنامه:
Permutations for AAC are:
[AAC, ACA, CAA]
Permutations for ABC are:
[ACB, ABC, BCA, CBA, CAB, BAC]
Permutations for ABCD are:
[DABC, CADB, BCAD, DBAC, BACD, ABCD, ABDC, DCBA, ADBC, ADCB, CBDA, CBAD, DACB, ACBD, CDBA, CDAB, DCAB, ACDB, DBCA, BDAC, CABD, BADC, BCDA, BDCA]
ادامه مقاله
GO TO FULL VERSION