يدرس هذه المقالة بشكل رئيسي مسألة إنشاء كائنات في سلسلة Java ، على النحو التالي.
بادئ ذي بدء ، نحن بحاجة إلى فهم مفهومين: الرجوع إلى المتغيرات والكائنات. يتم إنشاء الكائنات بشكل عام في الكومة من خلال جديد ، والسلسلة هي مجرد متغير مرجعي.
جميع الأوتار هي كائنات سلسلة. نظرًا للكمية الكبيرة من استخدام ثوابت السلسلة ، من أجل توفير الوقت في Java ، في مرحلة التجميع ، سيتم وضع جميع ثوابت السلسلة في البركة الثابتة. تتمثل إحدى ميزة تجمع السلسلة الثابتة في أنه يمكن دمج نفس السلسلة واحتلال مساحة.
على الرغم من أنه لا يمكن الحصول على عنوان المتغير مباشرة في Java ، إلا أنه يمكنك استخدام == لتحديد ما إذا كان المتغيرين المرجعيين يشيران إلى العنوان ، أي كائن.
| مكدس الذاكرة | ذاكرة كومة |
|---|---|
| النوع الأساسي ، مرجع الكائن (عنوان ذاكرة الكومة) | الكائنات والصفائف التي أنشأتها جديدة |
| سرعة الوصول السريع | ذاكرة أبطأ من المكدس |
| يجب تحديد حجم البيانات أثناء دورة الإعلان | تتم إدارة الذاكرة المخصصة بواسطة جامع القمامة التلقائي للماكينة الافتراضية Java. حجم الذاكرة المخصص ديناميكيا |
| الميزات المشتركة ، إذا كانت هناك سلسلة في المكدس ، فسيتم الرجوع إليها مباشرة ؛ إذا لم يكن الأمر كذلك ، افتح مساحة جديدة لتخزين القيمة | كل واحد جديد يولد كائن جديد في ذاكرة الكومة. لا يوجد إعادة استخدام |
package com.demo.test ؛ import java.lang.reflect.field ؛ public class stringdemo {public static void main (string [] args) {// أولاً ، ابحث عن ما إذا كان كائن السلسلة موجودًا في الذاكرة. إذا كان موجودًا ، أشر إلى كائن السلسلة هذا ؛ String Str1 = "ABC" ؛ String Str2 = "ABC" ؛ /* السلسلة العامة tostring () {return this ؛ } */ string str3 = "abc" .toString () ؛ // بغض النظر عما إذا كان كائن السلسلة هذا موجودًا بالفعل في الذاكرة ، سيتم إنشاء كائن جديد. String str4 = سلسلة جديدة ("ABC") ؛ String str5 = سلسلة جديدة ("ABC") ؛ String str6 = str5 ؛ String str7 = "A" + "B" + "C" ؛ String str8 = "A" + "B" + New String ("C") ؛ // String عبارة عن كائن سلسلة غير قابل للتغيير ، stringBuilder و stringBuffer كائنات متغيرة السلسلة (طول صفيف الأحرف داخل متغير) ، stringBuffer هو مؤشر ترابط ، stringbuilder ليس سلسلة آمنة str9 = new StringBuilder (). String str10 = new StringBuffer (). إلحاق ("A"). إلحاق ("B"). إلحاق ("C"). toString () ؛ System.out.println ("---------> ==") ؛ System.out.println ("---> 1") ؛ System.out.println (str1 == str2) ؛ // true system.out.println ("---> 3") ؛ system.out.println (str3 == str1) ؛ // true system.out.println ("-> 4") ؛ system.out.println (str4 == str1) ؛ // false system.out.println (str4 == str3) ؛ // false system.out.println (str4 == str5) ؛ // false system.out.println (str4 == str6) ؛ system.out.println (str7 == str1) ؛ // true system.out.println (str7 == str3) ؛ // true system.out.println (str7 == str4) ؛ // false system.out.println ("----> 8") ؛ System.out.println (str8 == str1) ؛ // false system.out.println (str8 == str3) ؛ // false system.out.println (str8 == str4) ؛ // false system.out.println (str8 == str7) ؛ System.out.println (str9 == str1) ؛ // false system.out.println (str9 == str3) ؛ // false system.out.println (str9 == str4) ؛ // false system.out.println (str9 == str7) ؛ System.out.println (str10 == str1) ؛ // false system.out.println (str10 == str3) ؛ // false system.out.println (str10 == str4) ؛ // false system.out.println (str10 == str7) ؛ system.out.println (str10 == str9) ؛ // false system.out.println ("--------> equals") ؛ System.out.println (str1.equals (str4)) ؛ // true system.out.println (str1.equals (str7)) ؛ // true system.out.println (str1.equals (str8)) ؛ // true system.out.println ("---------> hashcode") ؛ /*صيغة حساب hashcode: s [0]*31^(n-1) + s [1]*31^(n-2) + ... + s [n-1] لذلك ، فإن hashcode هو نفسه ، وهو نفسه في كل مرة يتم تشغيلها*/system.out.println (str1.hashcode ()) ؛ system.out.println (str3.hashcode ()) ؛ system.out.println (str4.hashcode ()) ؛ system.out.println (str5.hashcode ()) ؛ System.out.println (str6.hashCode ()) ؛ system.out.println (str7.hashCode ()) ؛ System.out.println ("--------> قيمة التغيير العادي") ؛ // String هي فئة غير قابلة للتغيير. تشير السلسلة فقط إلى مرجع في ذاكرة الكومة. يقوم بتخزين عنوان الكائن في الكومة ، وليس الكائن نفسه. تعيين قيمة لسلسلة هو فقط لتغيير كائن المرجع الخاص به بدلاً من الكائن نفسه str6 = "123" ؛ System.out.println (str5) ؛ // abc system.out.println (str6) ؛ // 123 system.out.println ("--------> تعكس قيمة التغيير") ؛ /* إذا كان عليك تغيير قيمة السلسلة ، فليس من المستحيل. يمكن استخدام الانعكاس فقط. تقوم سلسلة الفئة النهائية العامة بتنفيذ java.io.serializable ، قابلة للمقارنة <string> ، charsequence {// يتم استخدام القيمة لتخزين الأحرف. قيمة char النهائية الخاصة [] ؛ ...} */ str6 = str5 ؛ حاول {field field = string.class.getDeclaredField ("value") ؛ // field field = str6.getClass (). getDeclaredField ("value") ؛ if (! field.isAccessible ()) {field.setAccible (true) ؛ } char [] value = (char []) field.get (str6) ؛ القيمة [0] = '0' ؛ system.out.println (str5) ؛ // 0bc system.out.println (str6) ؛ // 0bc} catch (NosuchfieldException | securityexception | infaralalArgumentException | alfortalAccessException e) {E.PrintStackTrace () ؛ } system.out.println ("-------> obj.toString ()") ؛ كائن OBJ = كائن جديد () ؛ /* السلسلة العامة toString () {return getClass (). getName () + "@" + integer.toHexString (hashcode ()) ؛ } */system.out.println (obj.toString ()) ؛ // java.lang.object@15db9742 String [] arr1 = {"0"} ؛ String [] arr2 = {"0"} ؛ system.out.println (arr1.equals (arr2)) ؛ // false}}لخص
ما ورد أعلاه هو كل شيء عن تحليل مثيلات إنشاء سلسلة Java ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!