12. تابعی بنویسید تا طولانی ترین پالیندروم را در یک رشته مشخص پیدا کنید
یک رشته می تواند شامل رشته های پالیندروم باشد و یافتن طولانی ترین پالیندروم یک موضوع برنامه نویسی است. نکته کلیدی در اینجا این است که از وسط هر پالیندروم، اگر 1 کاراکتر به راست و چپ برویم، همیشه همان کاراکتر خواهد بود. به عنوان مثال، 12321، وسط 3 است، و اگر به حرکت از موقعیت فعلی در هر دو جهت ادامه دهیم، 2 و سپس 1 خواهیم داشت. ما از منطق مشابهی در برنامه جاوا خود برای یافتن طولانی ترین پالیندروم استفاده می کنیم. با این حال، اگر طول پالیندروم زوج باشد، طول وسط نیز زوج است، بنابراین باید مطمئن شویم که این مورد نیز در برنامه ما ارائه شده است، مثلاً 12333321، وسط آن 33 است و اگر به حرکت ادامه دهیم. در هر دو جهت، 3، 2 و 1 به دست می آوریم. در برنامه ما، رشته به دست آمده را با وسط در وهله اول مرور می کنیم و کاراکترهای چپ و راست را بررسی می کنیم. ما همچنین دو متغیر سراسری برای ذخیره موقعیت اولیه پالیندروم داریم. ما همچنین باید بررسی کنیم که آیا یک پالیندروم طولانیتر از قبل پیدا شده است یا خیر، زیرا میتوانیم چند پالیندروم را در یک رشته مشخص پیدا کنیم. در زیر یک برنامه نمونه است که در همه موارد به خوبی کار می کند. ما می توانیم کد بالا را با انتقال حلقه while به یک متد جداگانه بهبود دهیم، اما من آن قسمت را برای شما می گذارم. لطفاً اگر اجرای بهتری دارید یا اینکه برنامه به نوعی با شکست مواجه می شود، به من اطلاع دهید.package com.journaldev.util;
public class LongestPalindromeFinder {
public static void main(String[] args) {
System.out.println(longestPalindromeString("1234"));
System.out.println(longestPalindromeString("12321"));
System.out.println(longestPalindromeString("9912321456"));
System.out.println(longestPalindromeString("9912333321456"));
System.out.println(longestPalindromeString("12145445499"));
}
public static String longestPalindromeString(String in) {
char[] input = in.toCharArray();
int longestPalindromeStart = 0;
int longestPalindromeEnd = 0;
for (int mid = 0; mid < input.length; mid++) {
// для случая нечетного палиндрома How 12321, 3 будет серединой
int left = mid-1;
int right = mid+1;
// нам необходимо двигаться влево и вправо на 1 позицию до конца
while (left >= 0 && right < input.length) {
// ниже проверка, является ли это палиндромом
if (input[left] == input[right]) {
// обновление глобальных позиций, только если палиндром длиннее имеющегося
if (right - left > longestPalindromeEnd
- longestPalindromeStart) {
longestPalindromeStart = left;
longestPalindromeEnd = right;
}
}
left--;
right++;
}
// для четного палиндрома у нас должна быть подобная логика с размером середины 2
// для этого мы начнем на одну позицию правее
left = mid-1;
right = mid + 2;// к примеру, для 12333321 мы выбрали 33 в качестве середины
while (left >= 0 && right < input.length)
{
if (input[left] == input[right]) {
if (right - left > longestPalindromeEnd
- longestPalindromeStart) {
longestPalindromeStart = left;
longestPalindromeEnd = right;
}
}
left--;
right++;
}
}
// теперь у нас есть позиции для самого длинного палиндрома
return in.substring(longestPalindromeStart, longestPalindromeEnd + 1);
}
}
برنامه خروجی زیر را خواهد داشت:
1
12321
12321
12333321
454454
13. String، StringBuffer و StringBuilder چه تفاوت هایی دارند
یک رشته در جاوا تغییر ناپذیر و نهایی شده است، بنابراین تمام دستکاری های رشته ما همیشه یک رشته جدید ایجاد می کند. دستکاری رشته منابع فشرده است، بنابراین جاوا دو کلاس مفید برای دستکاری رشته ارائه می دهد -StringBuffer
و StringBuilder
. StringBuffer
و StringBuilder
کلاس های قابل تغییر هستند. عملیات با StringBuffer
thread ایمن و همگام هستند، اما روش ها StringBuilder
ایمن نیستند. بنابراین زمانی که چندین رشته روی یک رشته کار میکنند، باید از آن استفاده کنیم StringBuffer
، اما در یک محیط رشتهای باید از آن استفاده کنیم StringBuilder
. StringBuilder
مولدتر از StringBuffer
این است که با همگام سازی سنگینی نمی کند.
14. چرا رشته در جاوا تغییرناپذیر و نهایی شده است؟
چندین مزیت برای تغییر ناپذیری رشته وجود دارد:-
ادغام رشتهها تنها به این دلیل امکانپذیر است که رشته در جاوا تغییرناپذیر است، بنابراین ماشین مجازی فضای پشته زیادی را ذخیره میکند زیرا متغیرهای رشتهای مختلف به متغیر یکسانی در استخر اشاره میکنند. اگر یک رشته تغییرناپذیر نبود، در آن رشته درونسازی امکانپذیر نبود، زیرا اگر هر متغیری مقدار خود را تغییر دهد، سایر متغیرهای ارجاعدهنده آن رشته نیز تحت تأثیر قرار خواهند گرفت.
-
اگر رشته قابل تغییر باشد، یک خطر امنیتی جدی برای برنامه خواهد بود. به عنوان مثال، نام کاربری و رمز عبور پایگاه داده به عنوان یک رشته برای به دست آوردن اتصال به پایگاه داده ارسال می شود و در برنامه نویسی سوکت، جزئیات میزبان و پورت به عنوان یک رشته ارسال می شود. از آنجایی که رشته تغییر ناپذیر است، مقدار آن قابل تغییر نیست، در غیر این صورت هر هکری می تواند ارزش لینک را تغییر دهد و امنیت برنامه را با مشکل مواجه کند.
-
از آنجایی که رشته تغییرناپذیر است، از نظر رشته ای ایمن است و یک نمونه از رشته را می توان بین رشته های مختلف به اشتراک گذاشت. این از همگام سازی برای ایمنی نخ جلوگیری می کند، رشته ها کاملاً ایمن هستند.
-
رشته ها در جاوا استفاده می شوند
classloader
و تغییرناپذیری تضمین می کند که کلاس به درستی با استفاده از بارگذاری می شودClassloader
. برای مثال، زمانی که میخواهیدjava.sql.Connection
یک کلاس را بارگیری کنید، به یک نمونه کلاس فکر کنید، اما مقدار مرجع بهmyhacked.Connection
کلاسی تغییر میکند که ممکن است کارهای ناخواستهای را در پایگاه داده شما انجام دهد. -
از آنجایی که رشته تغییرناپذیر است،
hashcode
در زمان ایجاد کش ذخیره می شود و نیازی به محاسبه مجدد آن نیست. این باعث می شود که رشته یک نامزد عالی برای کلید در باشدMap
و پردازش آن سریعتر از کلیدهای دیگر خواهد بودHashMap
. به همین دلیل است که رشته متداول ترین شیء مورد استفاده به عنوان کلید استHashMap
.
15. چگونه یک رشته را به قطعات تقسیم کنیم؟
ما می توانیم از روشیsplit(String regex)
برای تقسیم یک رشته به آرایه ای از رشته ها با استفاده از یک عبارت منظم به عنوان جداکننده استفاده کنیم.
import java.util.Arrays;
public class JavaSplitString {
public static void main(String[] args) {
String line = "I am a java developer";
String[] words = line.split(" ");
String[] twoWords = line.split(" ", 2);
System.out.println("String split with delimiter: "+Arrays.toString(words));
System.out.println("String split into two: "+Arrays.toString(twoWords));
//split string delimited with special characters
String wordsWithNumbers = "I|am|a|java|developer";
String[] numbers = wordsWithNumbers.split("\\|");
System.out.println("String split with special character: "+Arrays.toString(numbers));
}
}
این روش split(String regex, int numOfStrings)
یک روش اضافه بار برای تقسیم یک رشته به تعداد مشخصی از خطوط است. ما می توانیم از بک اسلش برای استفاده از کاراکترهای خاص عبارت منظم به عنوان کاراکترهای معمولی استفاده کنیم. برنامه خروجی زیر را خواهد داشت:
String split with delimiter: [I, am, a, java, developer]
String split into two: [I, am a java developer]
String split with special character: [I, am, a, java, developer]
16. چرا آرایه رشته ای به رشته ای برای ذخیره رمز عبور ارجحیت دارد؟
یک رشته در جاوا تغییر ناپذیر است و در یک مجموعه رشته ذخیره می شود. پس از ایجاد، در استخر باقی می ماند تا زمانی که زباله جمع شود، بنابراین وقتی فکر می کنیم کار با رمز عبور تمام شده است، برای مدتی در حافظه باقی می ماند و هیچ راهی برای جلوگیری از آن وجود ندارد. این یک خطر امنیتی است زیرا هر کسی که به حافظه خالی دسترسی داشته باشد می تواند رمز عبور را در متن واضح پیدا کند. اگر از یک آرایه کاراکتر برای ذخیره رمز عبور استفاده کنیم، پس از اتمام کار با آن می توانیم آن را پاک کنیم. به این ترتیب می توانیم مدت زمان ماندن آن در حافظه را کنترل کنیم و از خطرات امنیتی ذاتی یک رشته جلوگیری کنیم.17. چگونه دو رشته را برای شباهت در جاوا بررسی می کنید؟
دو راه برای بررسی معادل بودن دو رشته وجود دارد - با استفاده از==
عملگر " " یا استفاده از equals
. وقتی از عملگر “ ” استفاده می کنیم ==
، مقدار رشته را به عنوان مرجع بررسی می کند، اما در برنامه نویسی بیشتر اوقات معادل رشته را فقط برای مقدار بررسی می کنیم. بنابراین، ما باید از روش برابر برای آزمایش هم ارز بودن دو رشته استفاده کنیم. همچنین روشی وجود دارد 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
18. استخر رشته ای چیست؟
همانطور که از نام آن پیداست، یک مجموعه رشته ای مجموعه ای از رشته ها است که در یک پشته جاوا ذخیره می شود. ما می دانیم کهString
این یک کلاس خاص در جاوا است و می توانیم اشیایی از این کلاس را با استفاده از عملگر new درست کنیم، همانطور که می توانیم با ارائه مقدار یک رشته در دو گیومه، اشیاء ایجاد کنیم. نمودار زیر نحوه تخصیص استخر رشته در پشته جاوا را توضیح می دهد و وقتی از روش های مختلف برای ایجاد رشته ها استفاده می کنیم چه اتفاقی می افتد. ادغام رشته ها صرفاً به دلیل تغییرناپذیری رشته ها در جاوا و اجرای ایده رشته های داخلی امکان پذیر است. استخر رشته ای نیز نمونه ای از الگوی Flyweight است. String Pool به ذخیره مقدار زیادی از حافظه کمک می کند، اما از طرف دیگر، ایجاد یک ردیف زمان بیشتری را می طلبد. هنگامی که از دو کوتیشن برای ایجاد یک رشته استفاده می کنیم، ابتدا به دنبال رشته ای در استخر با همان مقدار می گردد، اگر یافت شد، به سادگی یک مرجع برمی گرداند، در غیر این صورت یک رشته جدید در pool ایجاد می شود و سپس یک مرجع برمی گرداند. با این حال، وقتی از عملگر new استفاده می کنیم، کلاس را مجبور می کنیم String
که یک شی رشته جدید ایجاد کند، و سپس می توانیم از متد برای قرار دادن رشته در pool استفاده کنیم ، یا یک مرجع از pool به یک شی دیگر با همان مقدار intern()
دریافت کنیم . String
در زیر مثالی وجود دارد که نشان می دهد استخر رشته چگونه کار می کند.
public class StringPool {
public static void main(String[] args) {
String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");
System.out.println("s1 == s2 :"+(s1==s2));
System.out.println("s1 == s3 :"+(s1==s3));
}
}
برنامه خروجی زیر را خواهد داشت:
s1 == s2 :true
s1 == s3 :false
19. متد intern() چه کاری انجام می دهد؟
هنگامی که متدintern()
فراخوانی می شود، اگر مجموعه رشته از قبل دارای رشته ای معادل شی ما باشد، همانطور که توسط متد تأیید شده است equals(Object)
، آنگاه یک ارجاع به رشته از pool برگردانده می شود. در غیر این صورت، شی رشته به pool اضافه می شود و یک مرجع به آن شی برگردانده می شود. این متد همیشه رشتهای را برمیگرداند که همان مقدار رشته فعلی است، اما تضمین میکند که رشتهای از مجموعه رشتههای منحصربهفرد خواهد بود. در زیر مثالی از نحوه کار این روش آورده شده است intern()
:
public class StringPool { public static void main(String[] args) { String a = "string a"; String b = new String("string a"); String c = b.intern(); System.out.println(a == b); System.out.println(b == c); System.out.println(a == c); } } Программа выведет следующее:
false false true
20. آیا رشته ها در جاوا ایمن هستند؟
رشته ها تغییر ناپذیر هستند، بنابراین نمی توانیم مقدار آنها را در برنامه تغییر دهیم. بنابراین آنها ایمن هستند و می توانند با خیال راحت در یک محیط چند رشته ای استفاده شوند.21. چرا String یک کلید محبوب در HashMap در جاوا است؟
از آنجایی که رشته ها تغییر ناپذیر هستند، کد هش آنها در زمان ایجاد حافظه پنهان می شود و نیازی به محاسبه مجدد ندارد. این باعث می شود رشته ها کاندیدای عالی برای یک کلید باشندMap
و سریعتر از سایر اشیاء کلیدی پردازش شوند HashMap
. به همین دلیل است که از رشته ها به عنوان کلید استفاده می شود HashMap
. امیدوارم سوالات ذکر شده در این مقاله به شما در مصاحبه هایتان کمک کند، لطفا اگر چیزی را از قلم انداختم به من اطلاع دهید. پیوند به مقاله اصلی نویسنده: Pankaj Kumar
GO TO FULL VERSION