سلسلة جافا

سلسلة Java String هي واحدة من أكثر الفئات استخدامًا. تم تعريف فئة Java String في حزمة `java.lang`.

Java String

  • ببساطة ، السلسلة هي تسلسل من الأحرف ولكنها ليست نوعًا أساسيًا.
  • عند إنشاء سلسلة في جافا ، فإنها في الواقع تنشئ كائنًا من نوع String.
  • السلسلة هي كائن غير قابل للتغيير مما يعني أنه لا يمكن تغييره بمجرد إنشائه.
  • السلسلة هي الفئة الوحيدة التي يتم فيها دعم تحميل العمليات في جافا. يمكننا دمج سلسلتين باستخدام عامل +. على سبيل المثال "a"+"b"="ab".
  • جافا توفر فئتين مفيدتين لعمليات تلاعب السلسلة – StringBuffer و StringBuilder.

دعونا نتقدم ونتعلم المزيد عن فئة Java String.

طرق مختلفة لإنشاء سلسلة

هناك العديد من الطرق لإنشاء كائن سلسلة في جافا ، وإليك بعض الطرق الشائعة.

  1. استخدام السلسلة النصية

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

    String str = "abc"; 
    

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

  2. استخدام الكلمة الرئيسية

    يمكننا إنشاء كائن String باستخدام مشغل new، تمامًا مثل أي فئة جافا عادية. هناك العديد من المُنشئات المتاحة في فئة String للحصول على String من مصفوفة char، مصفوفة byte، StringBuffer، و StringBuilder.

    String str  =  new String("abc");
    char[] a = {'a', 'b', 'c'};
    String str2  =  new String(a);
    

مقارنة سلسلة Java

توفر فئة String طرق equals() و equalsIgnoreCase() لمقارنة سلسلتين. تقوم هذه الطرق بمقارنة قيمة السلسلة للتحقق مما إذا كانت السلاسل متساوية أم لا. تعيد true إذا كانت السلاسل متساوية و false إذا لم تكن.

package com.journaldev.string.examples;

/**
 * Java String Example
 * 
 * @author pankaj
 *
 */
public class StringEqualExample {

	public static void main(String[] args) {
		//إنشاء كائني سلسلة
		String s1 = "abc";
		String s2 = "abc";
		String s3 = "def";
		String s4 = "ABC";
		
		System.out.println(s1.equals(s2));//true
		System.out.println(s2.equals(s3));//false
		
		System.out.println(s1.equals(s4));//false;
		System.out.println(s1.equalsIgnoreCase(s4));//true
	}

}

إخراج البرنامج أعلاه هو:

true
false
false
true

فئة السلسلة تنفذ واجهة Comparable ، التي توفر الطريقتين compareTo() و compareToIgnoreCase() وتقارن سلسلتين بشكل لكسوغرافي. يتم تحويل السلسلتين إلى قيم يونيكود للمقارنة وإرجاع قيمة صحيحة تكون أكبر من الصفر أو أصغر منه أو تساويه. إذا كانت السلاسل متساوية ، فإنه يعيد الصفر ، وإلا فإنه يعيد إما أكبر أو أصغر من الصفر.

package com.journaldev.examples;

/**
 * Java String compareTo Example
 * 
 * @author pankaj
 *
 */
public class StringCompareToExample {

	public static void main(String[] args) {
		
		String a1 = "abc";
		String a2 = "abc";
		String a3 = "def";
		String a4 = "ABC";
		
		System.out.println(a1.compareTo(a2));//0
		System.out.println(a2.compareTo(a3));//less than 0
		System.out.println(a1.compareTo(a4));//greater than 0
		System.out.println(a1.compareToIgnoreCase(a4));//0
	}

}

إخراج البرنامج أعلاه هو:

0
-3
32
0

يرجى قراءة هذا بالتفصيل أكثر في مثال على مقارنة السلاسل.

طرق سلسلة جافا

دعونا نلقي نظرة على بعض طرق فئة السلسلة الشهيرة مع برنامج مثال.

  1. split()

    طريقة تقسيم سلسلة Java String split() تُستخدم لتقسيم السلسلة باستخدام التعبير المعطى. هناك نوعان من طرق split().

    • split(String regex): تقسم هذه الطريقة السلسلة باستخدام التعبير العادي المعطى وتُعيد مصفوفة السلاسل.
    • split(String regex, int limit): تقسم هذه الطريقة السلسلة باستخدام التعبير العادي المعطى وتُعيد مصفوفة السلاسل ولكن يتم تحديد عدد العناصر في المصفوفة بواسطة الحد المحدد. إذا كان الحد المحدد هو 2 ، فإن الطريقة تُرجع مصفوفة بحجم 2.
    package com.journaldev.examples;
    
    /**
     * مثال على تقسيم سلسلة Java String
     * 
     * @author pankaj
     *
     */
    public class StringSplitExample {
    
    	public static void main(String[] args) {
    		
    		String s = "a/b/c/d";
    		String[] a1 = s.split("/");
    		System.out.println("تقسيم السلسلة باستخدام التعبير العادي فقط:");
    		for (String string : a1) {
    			System.out.println(string);
    		}
    		System.out.println("تقسيم السلسلة باستخدام التعبير العادي مع الحد المحدد:");
    		String[] a2 = s.split("/", 2);
    		for (String string : a2) {
    			System.out.println(string);
    		}
    	}
    
    }
    

    مخرجات البرنامج أعلاه هي:

    تقسيم السلسلة باستخدام التعبير العادي فقط:
    a
    b
    c
    d
    تقسيم السلسلة باستخدام التعبير العادي مع الحد المحدد:
    a
    b/c/d
    
  2. contains(CharSequence s)

    تقوم طرق Java String contains() بفحص ما إذا كانت السلسلة تحتوي على تسلسل محدد من الأحرف أم لا. تعيد هذه الطريقة قيمة true إذا كانت السلسلة تحتوي على تسلسل محدد من الأحرف، وإلا تعيد قيمة false.

    package com.journaldev.examples;
    
    /**
     * مثال على Java String contains()
     * 
     * @author pankaj
     *
     */
    public class StringContainsExample {
    
    	public static void main(String[] args) {
    		String s = "Hello World";
    		
    		System.out.println(s.contains("W"));//true
    		System.out.println(s.contains("X"));//false
    	}
    
    }
    

    ناتج البرنامج أعلاه هو:

    true
    false
    
  3. طول()

    طريقة طول السلسلة في جافا تعيد طول السلسلة.

    package com.journaldev.examples;
    
    /**
     * طول السلسلة في جافا
     * 
     * @author pankaj
     *
     */
    public class StringLengthExample {
    
    	public static void main(String[] args) {
    		
    		String s1 = "abc";
    		String s2 = "abcdef";
    		String s3 = "abcdefghi";
    		
    		System.out.println(s1.length());//3
    		System.out.println(s2.length());//6
    		System.out.println(s3.length());//9
    
    	}
    
    }
    
  4. replace()

    تستخدم طريقة replace() في لغة Java لاستبدال جزء محدد من السلسلة بسلسلة أخرى. هناك أربعة إصدارات لطريقة replace().

    • replace(char oldChar, char newChar): تستبدل هذه الطريقة جميع حالات oldChar بـ newChar في السلسلة.
    • replace(CharSequence target, CharSequence replacement): تستبدل هذه الطريقة كل النصوص المستهدفة بنصوص الاستبدال في السلسلة.
    • replaceAll(String regex, String replacement): تستبدل هذه الطريقة كل حالة تطابق مع regex بالنص المحدد كاستبدال في السلسلة.
    • replaceFirst(String regex, String replacement): تستبدل هذه الطريقة أول حالة تطابق مع regex بالنص المحدد كاستبدال في السلسلة.
    package com.journaldev.examples;
    
    /**
     * Java String replace
     * 
     * @author pankaj
     *
     */
    public class StringReplaceExample {
    
    	public static void main(String[] args) {
    		
    		//replace(char oldChar,  char newChar)
    		String s = "Hello World";
    		s = s.replace('l', 'm');
    		System.out.println("After Replacing l with m :");
    		System.out.println(s);
    		
    		//replaceAll(String regex, String replacement)
    		String s1 = "Hello journaldev, Hello pankaj";
    		s1 = s1.replaceAll("Hello", "Hi");
    		System.out.println("After Replacing :");
    		System.out.println(s1);
    		
    		//replaceFirst(String regex, String replacement) 
    		String s2 = "Hello guys, Hello world";
    		s2 = s2.replaceFirst("Hello", "Hi");
    		System.out.println("After Replacing :");
    		System.out.println(s2);
    
    	}
    
    }
    

    إخراج البرنامج أعلاه هو:

    After Replacing l with m :
    Hemmo Wormd
    After Replacing :
    Hi journaldev, Hi pankaj
    After Replacing :
    Hi guys, Hello world
    
  5. تنسيق()

    تستخدم طريقة تنسيق سلسلة Java Sting لتنسيق السلسلة. هناك اثنين من الإصدارات لطريقة تنسيق سلسلة Java.

    • format(Locale l، String format، Object… args): تقوم هذه الطريقة بتنسيق السلسلة باستخدام اللغة المحددة، تنسيق السلسلة، والمعطيات.
    • format(String format، Object… args): تقوم هذه الطريقة بتنسيق السلسلة باستخدام تنسيق السلسلة المحدد والمعطيات.
    package com.journaldev.examples;
    
    import java.util.Locale;
    
    /**
     * تنسيق سلسلة Java
     * 
     * @author pankaj
     *
     */
    public class StringFormatExample {
    
    	public static void main(String[] args) {
    		
    		String s = "journaldev.com";
    		// يتم استخدام %s لإلحاق السلسلة
    		System.out.println(String.format("هذا هو %s", s));
    		
    		// باستخدام اللغة كـ Locale.US
    		System.out.println(String.format(Locale.US, "%f", 3.14));
    	}
    }
    

    ناتج البرنامج أعلاه هو:

    هذا هو journaldev.com
    3.140000
    
  6. substring()

    تُرجع هذه الطريقة جزءًا من السلسلة بناءً على فهارس محددة.

    package com.journaldev.examples;
    
    /**
     * استخراج سلسلة Java
     *
     */
    public class StringSubStringExample {
    
    	public static void main(String[] args) {
    		
    		String s = "هذا هو journaldev.com";
    		s = s.substring(8,18);
    		System.out.println(s);
    	}
    }
    

التمويج السلسلة

عملية تمويج السلسلة هي عملية أساسية جدًا في جافا. يمكن دمج السلسلة باستخدام عامل “+” أو باستخدام الطريقة concat().

package com.journaldev.examples;

/**
 * Java String concatenation
 * 
 * @author pankaj
 *
 */
public class StringConcatExample {

	public static void main(String[] args) {
		
		String s1 = "Hello";
		String s2 = "World";
		String s3 = s1 + s2;
		//استخدام عامل +
		System.out.println("Using + operator: ");
		System.out.println(s3);
		
		//استخدام الطريقة concat
		System.out.println("Using concat method: ");
		System.out.println(s1.concat(s2));

	}

}

مخرج البرنامج أعلاه هو:

Using + operator: 
HelloWorld
Using concat method: 
HelloWorld

تحقق من هذه المشاركة لمزيد من المعلومات حول تمويج السلسلة في جافا.

حوض سلسلة جافا

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

package com.journaldev.examples;

/**
 * Java String Pool Example
 * 
 */
public class StringPoolExample {

	public static void main(String[] args) {
		
		String a = "abc";
		String b = "abc";
		String c = "def";
		
		// نفس المرجع
		if (a==b) {
			System.out.println("Both string refer to the same object");
		}
		
		// مرجع مختلف
		if (a==c) {
			System.out.println("Both strings refer to the same object");
		}else {
			System.out.println("Both strings refer to the different object");
		}

	}

}

نتيجة البرنامج أعلاه هي:

Both string refer to the same object
Both strings refer to the different object

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

طريقة intern() للسلسلة

عند إنشاء سلسلة باستخدام العلامة التجارية للسلسلة ، سيتم إنشاؤها في بركة السلاسل ولكن ماذا لو قمنا بإنشاء سلسلة باستخدام الكلمة الرئيسية الجديدة بنفس القيمة الموجودة في بركة السلاسل؟ هل يمكننا نقل السلسلة من الذاكرة العشوائية إلى بركة السلاسل؟ يتم استخدام طريقة intern() لهذا الغرض وتعيد تمثيلًا قاعديًا لكائن السلسلة. عند استدعاء طريقة intern() على كائن سلسلة تم إنشاؤه باستخدام الكلمة الرئيسية الجديدة ، يتحقق إذا كان هناك سلسلة مع نفس القيمة في بركة السلاسل؟ إذا كان الأمر كذلك ، فإنه يعيد المرجع لذلك الكائن سلسلة من بركة السلاسل. إذا لم يكن الأمر كذلك ، فإنه ينشئ سلسلة جديدة بنفس المحتوى في بركة السلاسل ويعيد المرجع.

package com.journaldev.examples;

/**
 * Java String intern
 * 
 * @author pankaj
 *
 */
public class StringInternExample {

	public static void main(String[] args) {
		
		String s1 = "pankaj";
		String s2 = "pankaj";
		String s3 = new String("pankaj");
		
		System.out.println(s1==s2);//true
		System.out.println(s2==s3);//false
		
		String s4 = s3.intern();
		System.out.println(s1==s4);//true

	}

}

تحقق من هذه المقالة لمعرفة المزيد عن طريقة intern لسلسلة Java.

فوائد عدم التغيير للسلاسل

بعض فوائد أن السلسلة تكون من الفئات غير قابلة للتغيير هي:

  1. مجموعة ثوابت السلاسل، وبالتالي يوفر الذاكرة.
  2. الأمان حيث لا يمكن تغييرها.
  3. آمنة للتعامل مع الخيوط
  4. أمان تحميل الفئة

تحقق من هذه المقالة لمعرفة المزيد عن فوائد عدم تغيير السلسلة.

وظيفة انضمام السلسلة في جافا 8

A new static method join() has been added in String class in Java 8. This method returns a new String composed of copies of the CharSequence elements joined together with a copy of the specified delimiter. Let’s look at an example to understand it easily.

List<String> words = Arrays.asList(new String[]{"Hello", "World", "2019"});
String msg = String.join(" ", words);
System.out.println(msg);

الناتج: Hello World 2019

طرق سلسلة جافا 9

هناك طريقتان أضيفتا إلى فئة السلسلة في إصدار جافا 9. هما – codePoints() و chars(). تقوم كلاً من هاتين الطريقتين بإرجاع كائن IntStream يمكننا أن نقوم ببعض العمليات عليه. دعنا نلقي نظرة سريعة على هاتين الطريقتين.

String s = "abc";

s.codePoints().forEach(x -> System.out.println(x));

s.chars().forEach(x -> System.out.println(x));

الناتج:

97
98
99
97
98
99

فئة سلسلة Java 11 الجديدة للطرق

هناك العديد من الطرق الجديدة التي تمت إضافتها في فئة السلسلة في إصدار Java 11.

  • isBlank() – يُرجع true إذا كانت السلسلة فارغة أو تحتوي فقط على نقاط التعريف بالمسافة البيضاء، وإلا فإنه يُرجع false.
  • lines() – يُرجع تيارًا من الأسطر المستخرجة من هذه السلسلة، مفصولة بمحددات الأسطر.
  • strip(), stripLeading(), stripTrailing() – لإزالة المسافات البيضاء البادئة والمُتبقية من السلسلة.
  • repeat() – يُرجع سلسلة قيمتها تكرار هذه السلسلة بعدد محدد من المرات.

دعونا نلقي نظرة على برنامج مثالي لهذه الطرق.

package com.journaldev.strings;

import java.util.List;
import java.util.stream.Collectors;

/**
 * JDK 11 New Functions in String class
 * 
 * @author pankaj
 *
 */
public class JDK11StringFunctions {

	public static void main(String[] args) {
		// isBlank()
		String s = "abc";
		System.out.println(s.isBlank());
		s = "";
		System.out.println(s.isBlank());

		// lines()
		String s1 = "Hi\nHello\rHowdy";
		System.out.println(s1);
		List lines = s1.lines().collect(Collectors.toList());
		System.out.println(lines);

		// strip(), stripLeading(), stripTrailing()
		String s2 = "  Java,  \tPython\t ";
		System.out.println("#" + s2 + "#");
		System.out.println("#" + s2.strip() + "#");
		System.out.println("#" + s2.stripLeading() + "#");
		System.out.println("#" + s2.stripTrailing() + "#");

		// repeat()
		String s3 = "Hello\n";
		System.out.println(s3.repeat(3));
		s3 = "Co";
		System.out.println(s3.repeat(2));

	}

}

الناتج:

false
true
Hi
Hello
Howdy
[Hi, Hello, Howdy]
#  Java,  	Python	 #
#Java,  	Python#
#Java,  	Python	 #
#  Java,  	Python#
Hello
Hello
Hello

CoCo

هذا كل شيء عن فئة سلسلة Java، وأمثلة على طرقها وتلاعبات السلسلة.

يمكنكم مراجعة المزيد من أمثلة السلسلة من مستودعنا على GitHub.

المرجع: مستندات واجهة برمجة التطبيقات

Source:
https://www.digitalocean.com/community/tutorials/java-string