1. ما هي السلاسل في جافا

السلاسل هي نوع الكائنات التي يمكنها تخزين أحرف القيم وفي Java، يتم تخزين كل حرف في 16 بت، أي باستخدام ترميز UTF 16 بت. تعمل السلسلة بنفس الطريقة التي تعمل بها مجموعة من الأحرف في Java. 

  1. طرق إنشاء سلسلة

هناك طريقتان لإنشاء سلسلة في جافا:

1- سلسلة حرفية: أكثر كفاءة في الذاكرة (لأنَّه لا يتم إنشاء java لجعل كائنات جديدة إذا كانت موجودة بالفعل في تجمع السلسلة ثابت).

مثال: String demoString = “GeeksforGeeks”

2- استخدام كلمة رئيسية جديدة:  

  • سلسلة ق = سلسلة جديدة (“مرحبا”).
  • في مثل هذه الحالة سيقوم JVM بإنشاء كائن سلسلة جديد في ذاكرة الكومة العادية (غير المجمعة) وسيتم وضع “الترحيب” الحرفي في تجمع ثابت السلسلة. سيشير المتغير s إلى الكائن الموجود في الكومة (غير المجمع).

مثال: String demoString = new String “GeeksforGeeks”

3- واجهات وفئات في سلاسل جافا:

واجهة CharBuffer:

تُطبق هذه الفئة واجهة CharSequence. يتم استخدام هذه الفئة للسماح باستخدام المخازن المؤقتة للأحرف بدلاً من CharSequences. مثال على هذا الاستخدام هو حزمة التعبير العادي java.util.regex.

السلسلة: عبارة عن سلسلة من الأحرف. فيJava، كائنات السلسلة غير قابلة للتغيير مما يعني أنَّها ثابتة ولا يمكن تغييرها بمجرد إنشائها.

واجهة CharSequence:

يتم استخدام هذه الواجهة لتمثيل تسلسل الأحرف في جافا.

الفئات التي يتم تنفيذها باستخدام واجهة charsequence مذكورة أدناه وتوفر الكثير من الوظائف مثل السلسلة الفرعية، والحدث الأخير، الحدث الأول، التسلسل، الجزء العلوي، والاقل وما الى ذلك كالتالي:

String

StringBuffer

StringBuilder

لنناقش أكثر هذه الفئات:

String:

السلسلة هي فئة غير قابلة للتغيير مما يعني أنَّها ثابتة ولا يمكن تغييرها بمجرد إنشائها، وإذا كنا نرغب في التغيير، نحتاج إلى إنشاء كائن جديد وحتى الوظائف التي توفرها مثل toupper وtolower وما إلى ذلك، كل ذلك يُرجع كائناً جديداً، وليس تعديلاً الكائن الأصلي. إنه آمن تلقائياً.

بناء الجملة: String str= “geeks”; or String str= new String(“geeks”)

StringBuffer:

هي فئة نظيرة من String ، وهي قابلة للتغيير بطبيعتها وهي فئة آمنة للخيط، ويمكننا استخدامها عندما يكون لدينا بيئة متعددة الخيوط وكائن مشترك من المخزن المؤقت للسلسلة، أي يستخدم بواسطة خيط متعدد. نظراً لأنه آمن على الخيط، لذلك هناك حمل إضافي، لذلك فهو يستخدم بشكل أساسي في البرامج متعددة الخيوط.

بناء الجملة: StringBuffer demoString = new StringBuffer(“GeeksforGeeks”) 

StringBuilder:

يمثل stringBuilder في Java بديلاً لفئة String وStringBuffer، لأنه يُنشئ تسلسلاً قابلاً للتغيير من الأحرف وهو ليس آمناً. يتم استخدامه فقط داخل الخيط، لذلك لا يوجد حمل إضافي، لذلك يتم استخدامه بشكل أساسي لبرنامج ترابط واحد.

بناء الجملة: StringBuilder demoString = new StringBuilder demoString.append(“GFG”)

StringTokenizer:

يتم استخدام فئة stringtokenizer في Java لتقسيم السلسلة إلى رموز مميزة.

مثال:

يحتفظ كائن StringTokenizer داخلياً بالموضع الحالي داخل السلسلة المراد تحويلها إلى رمز مميز. تقدم بعض العمليات هذا الموضع الحالي بعد الأحرف التي تمت معالجتها. يتم إرجاع الرمز المميز عن طريق أخذ سلسلة فرعية من السلسلة التي تم استخدامها لإنشاء كائن StringTokenizer.

Stringjoiner هي فئة حزمة jav.util والتي يتم استخدامها لإنشاء سلسلة من الأحرف (السلاسل) مفصولة بمحدد وتبدأ اختيارياً ببادئة مقدمة وتنتهي بلاحقة مقدمة. على الرغم من أنه يمكن القيام بذلك أيضاً بمساعدة فئة StringBuilder لإلحاق محدد بعد كل سلسلة، إلَّا أنَّ StringJoiner يوفر طريقة سهلة للقيام بذلك دون الحاجة إلى كتابة الكثير من التعليمات البرمجية.

بناء الجملة: public StringJoiner(CharSequence delimiter)

رأينا أعلاه أنه يمكنك إنشاء سلسلة بواسطة String Literal 

String demoString =” Welcome”; 

JVM هنا يقوم بفحص مجموعة السلسلة الثابتة. إذا كانت السلسلة غير موجودة، فسيتم إنشاء مثيل سلسلة جديد ووضعه في التجمع. إذا كانت السلسلة موجودة، فلن تقوم بإنشاء كائن جديد. بدلاً من ذلك، فإنه سيتم إرجاع المرجع إلى نفس المثيل. تُعرَّف ذاكرة التخزين المؤقت التي تخزن مثيلات السلسلة هذه باسم مجموعة String Constant  أو .String Pool في الإصدارات السابقة من Java، كان ما يصل إلى JDK 6 String Pool موجوداً داخل مساحة PermGen (الجيل الدائم). ولكن في JDK 7 يتم نقله إلى منطقة الكومة الرئيسية. 

  1. سلسلة غير قابلة للتغيير في جافا

كائنات السلسلة غير قابلة للتغيير في جافا غير قابل للتغيير يعني ببساطة أنَّه غير قابل للتعديل أو غير قابل للتغيير. بمجرد إنشاء كائن سلسلة، لا يمكن تغيير بياناته أو حالته ولكن يتم إنشاء كائن سلسلة جديد.

تخصيص الذاكرة للسلسلة:

عندما يتم إنشاء كائن سلسلة ككائن حرفي، سيتم إنشاء الكائن في تجمع سلسلة ثابتة. يسمح هذا لـ JVM بتحسين تهيئة السلسلة الحرفية.

مثال: String demoString = “Geeks”;

يمكن أيضاً الإعلان عن السلسلة باستخدام عامل تشغيل جديد ، أي تم تخصيصه ديناميكياً. في حالة تخصيص السلسلة ديناميكياً، يتم تعيين موقع ذاكرة جديد لها في الكومة. لن تتم إضافة هذه السلسلة إلى تجمع سلسلة ثابتة.

مثال: String demoString = new String(“Geeks”) 

إذا كنت تريد تخزين هذه السلسلة في التجمع الثابت فسوف نحتاج الى تدريبها.

مثال: String internedString = demoString.intern

يُفضَّل استخدام String literals لأنه يسمح لـ JVM بتحسين تخصيص الذاكرة.

لماذا انتقل تجمع السلسلة من permen الى منطقة الكومة العادية؟ 

محدودة الحجًم الافتراضي هو ١٦ ميجابايت فقط هو مساحة permen لقد كانت مشكلة في إنشاء وتخزين عدد كبير جدا من كائنات السلسلة في Permen لهذا السبب تم نقل تجمع السلسلة إلى منطقة كومة أكبر. لجعل أكثر كفاءة في الذاكرة، يتم استخدام مفهوم السلسلة الحرفية. من خلال استخدام الكلمة الاساسية سيقوم بإنشاء كائن سلسلة جديد في JVM في منطقة الكومة العادية حتى لو كان نفس كائن السلسلة موجودا في تجمع السلسلة.

على سبيل المثال: String demoString = new String(“Bhubaneswar”);

  1. منشأ السلسلة في جافا

String (byte [] byte_arr) – 1

أنشئ سلسلة جديدة عن طريق فك تشفير مصفوفة البايت. ويستخدم مجموعة الأحرف الافتراضية للنظام الأساسي لفك التشفير. 

مثال: 

byte [] b_arr = {71, 101, 101, 107, 115}; String s_byte =new String(b_arr); //Geeks


String (byte [] byte_arr, Charset char_set) – 2

أنشئ سلسلة جديدة عن طريق فك تشفير مصفوفة يستخدم charset لفك تشفير البايت.

مثال:

byte [] b_arr = {71, 101, 101, 107, 115}; Charset cs = Charset.defaultCharset
String s_byte_char = new String (b_arr, cs); //Geeks

String (byte [] byte_arr, String char_set_name) -3

انشئ سلسلة جديدة عن طريق مصفوفة لفك التشفير ويستخدم البايت char_set_name لفك التشفير يبدو مشابها للبنيات المذكورة أعلاه وتظهر قبل السلسلة ولكنها تأخذ وظائف مماثلة كمعلمة.

مثال: 

byte [] b_arr = {71, 101, 101, 107, 115}; String s = new String (b_arr, “US-ASCII”); //Geeks

String (byte [] byte_arr, int start_index, int length) -4

أنشئ مصفوفة جديدة من مصفوفة البايتات اعتماداً على مؤشر البداية (موقع البداية) والطول (عدد الأحرف من موقع البداية).

مثال:

byte [] b_arr = {71, 101, 101, 107, 115}; String s = new String (b_arr, 1, 3); // eek
String (byte [] byte_arr, int start_index, int length, Charset char_set) -5

أنشئ سلسلة مصفوفة جديدة من مصفوفة البايتات اعتماداً على الطول وموقع البداية يستخدم charset لفك تشفير الحروف من موقع البداية. 

مثال:

byte [] b_arr = {71, 101, 101, 107, 115} ; Charset cs = Charset.defaultCharset
String s = new String(b_arr, 1, 3, cs); // eek

String(byte[] byte_arr, int start_index, int length, String char_set_name) -6

أنشئ سلسلة جديدة من مصفوفة البايتات اعتماداً على الأحرف من موقع البداية والطول ويستخدم char_set_name لفك التشفير.

مثال:

byte[] b_arr = {71, 101, 101, 107, 115}; String s = new String(b_arr, 1, 4, “US-ASCII”); // eeks


String (char [] char_arr) -7

يخصص سلسلة جديدة من مجموعة الأحرف المحددة. 

مثال: char char_arr[] = {‘G’, ‘e’, ‘e’, ‘k’, ‘s’}; String s = new String(char_arr); //Geeks


String (int [] uni_code_points, int offset, int count) -8

يخصص سلسلة من uni_code_arry ولكن اختر عدد الأحرف من start_index.

مثال:

int [] uni_code = {71, 101, 101, 107, 115}; String s = new String (uni_code, 1, 3); //eek


String (StringBuffer s_buffer) -9

يخصص سلسلة جديدة من السلسلة في s_buffer.

مثال: 

StringBuffer s_buffer = new StringBuffer(“Geeks”); String s = new String(s_buffer); //Geeks


String (StringBuilder s_builder) -10

يخصص سلسلة جديدة من السلسلة في s_builder.

مثال:

StringBuilder s_builder = new StringBuilder(“Geeks”); String s = new String(s_builder); //Geeks

  1. طرق السلسلة في جافا

طول كثافة العمليات: إرجاع عدد الاحرف في السلسلة. 

مثال: GeeksforGeeks“. length

Char CharAt (int i) -1

إرجاع الحرف i

مثال: GeeksforGeeks”. charAt(3);

String substring (int i) -2

مثال: “GeeksforGeeks”. substring (3); 

String substring (int I,int j) -3

مثال: “GeeksforGeeks”. substring (2, 5);

String concat(string str) -4

يسلسل السلسلة المحددة الى نهاية هذه السلسلة. 

مثال:

String s1 =” Geeks”;
String s2 =” forGeeks”;
String output = s1. concat(s2);

Int indexOf(string s) -5

مثال:

1.   String s =” Learn Share Learn”;
      int output = s.indexOf(“Share”); // returns 6
2. String s = “Learn Share Learn”
    int output = s.indexOf(“Play”);  // return -1

Int indexOf (string s, int i) -6

ارجاع الفهرس ضمن سلسلة التواجد الاولى للسلسلة المحددة إذا لم تكن موجودة في سلسلة الادخال فسيتم إرجاع قيمة -١كقيمة افتراضية.

مثال:

String s =” Learn Share Learn”;
int output = s.indexOf(“ea”,3);

Int LastindexOf(string s) -7

ارجاع الفهرس ضمن سلسلة التواجد الاخيرة للسلسلة المحددة إذا لم تكن موجودة في سلسلة الادخال فسيتم إرجاع -١كقيمة افتراضية. 

مثال:

1. String s = ”Learn Share Learn”;
    int output = s.lastIndexOf(“a”); // returns 14
2. String s = “Learn Share Learn”
    int output = s.indexOf(“Play”);  // return -1

 Boolean equals (object otherobj) -8

يقارن هذه السلسلة بالكائن المحدد.

مثال:

Boolean out = “Geeks”.equals(“Geeks”); // returns true
Boolean out = “Geeks”.equals(“geeks”); // returns false

Boolean equalsIgnorecase(string anotherstring) -9

يقارن السلسلة بسلسلة أخرى متجاهلا اعتبارات الحالة. 

مثال:

Boolean out= “Geeks”.equalsIgnoreCase(“Geeks”); // returns true
Boolean out = “Geeks”.equalsIgnoreCase(“geeks”);

Int compareTo (string anotherstring) -10

يقارن سلسلتين معجمياً.

مثال:

int out = s1. compareTo(s2); 
// where s1 and s2 are
// strings to be compared
This returns difference s1-s2. If:
out < 0 // s1 comes before s2
out = 0 // s1 and s2 are equal.
out > 0   // s1 comes after s2.

Int compareTolgnoreCase (string anotherstring) -11

يقارن سلسلتين معجميا متجاهلاً اعتبارات الحالة.

مثال:

int out = s1. compareToIgnoreCase(s2); 
// where s1 and s2 are
// strings to be compared
This returns difference s1-s2. If:
out < 0 // s1 comes before s2
out = 0   // s1 and s2 are equal.
out > 0   // s1 comes after s2

String tolowerCase- 12

تحويل كافة الأحرف في السلسلة الى حالة صغيرة. 

مثال:

String word1 = “HeLLo”;
String word3 = word1.toLowerCase();

String toupperCase -12

تحويل كافة الأحرف في السلسلة الى حالة كبيرة. 

مثال:

String word1 = “HeLLo”;
String word2 = word1.toUpperCase();

Stringtrim -13

ارجاع نسخة من السلسلة عن طريق إزالة المسافات البيضاء في كلا الطرفين ولا يؤثر على المسافات البيضاء في المنتصف.

مثال:

String word1 = “Learn Share Learn “;
String word2 = word1.trim(); 

String replace (char oldchar,char newchar)- 14

تقوم بإرجاع سلسلة جديدة عن طريق استبدال كافة تكرارات olderchar ب newchar.

مثال:

String s1 = “feeksforfeeks“;
String s2 = “feeksforfeeks”.replace(‘f’ ,’g’);

Boolean contains(string) -15

يُرجع صحيحاً إذا كانت السلسلة تحتوي على السلسلة المحددة. 

مثال:

String s1=”geeksforgeeks”;
String s2=”geeks”;
s1.contains(s2)

Boolean starswith(string) -16

يُرجع صحيحاً إذا كانت السلسلة تبدأ بهذه البادئة.

مثال:

String s1=”geeksforgeeks”;
String s2=”geeks”;
s1.startsWith(s2)

  1. الخاتمة

وهكذا كنا قد أخذنا نظرة عامة عن سلاسل جافا من حيث فئاتها وواجهاتها ومنشئو هذه السلاسل وطرقها ونتابع في موضوع لاحق مواضيع تخص سلاسل جافا.

Facebook
Twitter
YouTube
LinkedIn