الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اسناد كلمة "hellow Java" الى المتغير S من الكتلة String

بدأه ماكسيموس في 22 يونيو 2008 · 14 رد · 2,127 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

بالامس القريب لقد واجهت سؤالاً يكاد يكون صعباً من حيث الحل والاختيار .

فلقد وضع السؤال على شكل اختيارات وقيل اختار اي تعريف من هذه الاربعة هوالاصح

السؤال هو

عندما نريد اسناد جملة "Hellow Java" الى المتغير S من الكتلة String فاي تعريف من هذه التعاريف هو الاصح

String s1 = "Hellow Java";
String s2[] = "Hellow Java";
new String s3 = "Hellow Java";
String s4 = new String("Hellow Java");

مع العلم انه لا يوجد خيار خامس وهو جميع ما سبق .

ولكن السؤال المهم في ذلك . وهو ما الفرق بين هذه التعاريف . وماذا يعني كل تعريف ؟

تم تعديل هذه المشاركة بواسطة ابو سعود الفرنسي في 22 يونيو 2008 في 06:08

#2
String s1 = "Hellow Java";
String s2[] = "Hellow Java";
new String s3 = "Hellow Java";
String s4 = new String("Hellow Java");

1- assign String literal to the String reference s1 IN THE STRING POOL for efficiency reasons

2- assign array of String which is obviously false

3- unreachable String Object false

4- JVM please don't take this object in the String pool I want it as an Object in my Heap

so if you will use this string frequently choose first one and if it just one time use last one

if you don't know how many times this string will be used

choose first one

#3

ليس كل ما سبق صحيح

بل الاول هوا الاصح .. وممكن الرابع ..وليس اكيد

اذا لم يعجبكم جوابي ...لي عودة بالمساء للمناقشة

لكن الان نحتاج الى بعض الراحة بعد الامتحان :S

الله معكم..

#4

جزاك الله خير اخي Xline على هذا الجواب

ولكن ليس من المهم كم مرة استعمل الاسناد وكم مرة لا .

بل ما اريده الي تعريف سوف يسند القيمة Hellow Java الى المتغير S

ويمكن لي ان استعمل الاخير اكثر من مرة ايضا . ويمكن ان استعمل الاول اكثر من مرة ايضا

على حسب برنامجي .

ولكن اذا قلت لك ان البرنامج هو عبارة عن كتابة هذه التعاريف فقط دون كتابة اي شي اخر .

فاي تعريف سوف يكون الاصح مع العلم ان جميع التعريفات سوف يكون ناتجهما واحد عند الطباعة وهو Hellow Java

جزاك الله خير اخي شادو

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

وانت اخترت الاول وقلت انه من الممكن ان يكون الرابع

بل من الاكيد ان يكون الرابع والثالث والثاني والاول

ولك ان تجرب هذا

ولكن اي واحد منهما ولماذا ..؟

جربوا هذا البرنامج

public class StringClass {

	public static void main (String[] args) {

	 String s1 = "Hellow Java";

	 String s2[]=new String [1];
	 s2[0] = "Hellow Java";

	 String s4 = new String("Hellow Java");


	 System.out.println(s1);
	  System.out.println(s2[0]);
	   System.out.println(s4);
}   
}

ولكن اي تعريف سوف يسند القيمة Hellow Java

تم تعديل هذه المشاركة بواسطة ابو سعود الفرنسي في 23 يونيو 2008 في 08:27

#5

الفرق ليس بالطباعه

والطباعه اخر شي فكرت فيه

وعدد مرات تكرار السترنق مهم بتحديد الاجابه الافضل

الفرق في طريقة تمثيلها بالميموري

الاولى تخزن في String pool وهي الطريقه المعتاده

لانه بدل من ان يكون عندك 20 اوبجكت لنفس السترنق يكون عندك سترنق واحده في الString pool

الثانيه تنشئ Array object وهذا منطقيا غلط

الثالثه لايمكنك الوصول اليهاو طباعتها لان الاوبجكت لايمكن الوصول له unreachable

الرابعه مثل الاولى ولكن لو كان عرفت 20 اوبجكت بهذه الطريقه سيكون لديك 20 اوبجكت في الهيب

مثل ماقلتلك سابقا ان لم تكن تعرف-كم مره تتكرر هذه السترنق - فالاولى هي الافضل ( في رايي )

#6

السلام عليكم ...

اقتباس
الثالثه لايمكنك الوصول اليهاو طباعتها لان الاوبجكت لايمكن الوصول له unreachable

اتصور اخي الكريم Xline ان هذا لا ينطبق على الاسترنج لانه ممكن الحصول على قيمته بإستدعاء الميثود toString ... لاحظوا معي ان الميثود

toString هي ضمن الاكلاس الام Object .. و بالتالي فهو يمرر الى كل الكلاسات المبنية في الجافا ..

و عند استدعاءه مع اي اوبجكت فهو يعيد عنوان ذلك الاوبجكت في الذاكرة reference

الا في حالة الـ String فهو يعيد القيمة التي يحويها الاسترنج ...

اما عن رائي فاتصور ان الحل الافضل هو الحل الرابع ...

قد يكون ما لدي مختلف قليلاً و لكنه معلومة قرأتها من زمان ..

مع استبعاد الرد الثاني (تبع المصفوفات الذي اتصور يقطع الاسترنجس الى داخل المصفوفة فتصبح مصفوفة استرنجس)

علامات الاقتباس "" (سواء في جملة طباعة اوغيره) فإننا ننشيء ضمنياً استرنج String له عنوان Reference

نرى انه في الاجابة الاولي و الثالثة يتم بحسب الطرف الايمن انشاء reference لنوع استرنج ، ثم في الطرف الايسر reference اخر للاسترنج hello

و بعدها يتم الاستغناء عن ذلك reference الموجود في الطرف الايمن و يتم استخدام reference الطرف الايسر

(!!!! قصة طويلة صح ؟؟؟ معليش اقرؤها اكثر من مرة :) )

ممكن ابحث لكم عن ذلك مصدر مرة اخرى ... لا ادري :)

سلامي

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#7

بالطبع كلام عيسى صحيح

هناك ما يسمى بالكائنات المتقلبة والكائنات غير المتقلبة Immutable&mutable object

كنت كتبت مقالاً عن هذا الموضوع مسبقاً

يمكنكم مراجعته

بالمختصر أي تعديل على الكائنات غير المتقلبة ينتج عنه كائن جديد

وهذا يمثل حمل على الآلة الافتراضية

صحيح أن الأخ جامع النفايات يقوم بدوره

لكنه يتباطأ أحياناً وأحيناً أخرى يكون قدر التعديلات على الكائن مستمر وبشكل كبير

والفئة String من هذا النوع

لهذا يوجد في جافا مفهوم المجمع String Pool

بالنسبة للجملتين الثانية و الثالثة

ففيهما مشاكل في القواعد syntax

الجملة الثانية

لا تصح عملية إسناد String إلى مصفوفة من String

الجملة الثالثة

لا يصح استخدام المعامل new بدون باني constructor

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#8

الاخت بنت اليمن انا مافهمت

انا معك بان علامات التنصيص تنشئ String ولكن هذا الString هو unreachable خلاص ودع مات توفى الله يرحمه ويرحم اموات المسلمين جميع

ولايمكنك الوصول اليه وكيف راح تستدعين toString وانتي ماعندك reference حي لهالاوبجكت ؟

قد تكونين تقصدين مثل هذه :

String s = "hellow"+"world";

هنا صح ممكن نقول المساله فيها اختلاف .. لكن بالمثال غير هذا

#9
اقتباس
هناك ما يسمى بالكائنات المتقلبة والكائنات غير المتقلبة Immutable&mutable object

كنت كتبت مقالاً عن هذا الموضوع مسبقاً

يمكنكم مراجعته

بالمختصر أي تعديل على الكائنات غير المتقلبة ينتج عنه كائن جديد

نعم صحيح ... و لكن لاحظ اننا لا نتكلم عن اي تعديل الآن و لكن عن طريقة تعريف ....

اقتباس
صحيح أن الأخ جامع النفايات يقوم بدوره

لكنه يتباطأ أحياناً وأحيناً أخرى يكون قدر التعديلات على الكائن مستمر وبشكل كبير

والفئة String من هذا النوع

لهذا يوجد في جافا مفهوم المجمع String Pool

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

String str = "SALAM"

اولاً في String Pool تتكون عندنا "SALAM" كاوابجت له عنوان reference

و بعدين يتم تكوين str و يسند لها عبارة SALAM بعد انهاء الاوبجكت تبعها ...

من اجل ذلك الاعلان بهذه طريقة قصة طويلة لاننا نتعامل مع اثنين عناوين two references

و الطريقة الاصح هي الطريق التقليدية (النموذجية) (اي الجواب الرابع):

String str = new String ("SALAM")

لان هنا نحن نكون اوبجكت واحد فقط ...

هذا و الله اعلى و اعلم

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#10

يظل الموضوع موضوع منطق أختي بنت اليمن

يعني أنتي تنظرين له بمنظور أنها جملة وحيدة

أنا والأخ عيسى نرى أن الجملة الوحيدة

لا تقوم بشيء بدون جمل أخرى

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#11

نونونو

الامر لايختلف من هذه ناحية two references

كل String literal سواءا مررتها للاوبجكت او لم تمررها يكون لها رفرنس

#12
اقتباس
أنا والأخ عيسى نرى أن الجملة الوحيدة

لا تقوم بشيء بدون جمل أخرى

امممممم ...

لاحظ معي ان الجملة التالية :

new Object();

جملة صحيحة و وحيده و لها اثر في الذاكرة ... اي صنع reference و إن لم يكن هناك فائدة واضحة منها ... لكن هذا ما يحدث : صنع reference !!!

اقتباس
نونونو

الامر لايختلف من هذه ناحية two references

كل String literal سواءا مررتها للاوبجكت او لم تمررها يكون لها رفرنس

" كل String literal سواءا مررتها للاوبجكت او لم تمررها يكون لها رفرنس "

اليس هذا ما احاول قوله هنا منذ البداية يا اخي الكريم !!!

و بالتالي :

String str = "SALAM"

تعمل لك اثنين two reference ... لانك تعمل اوبجكت لــ "SALAM" و بعدين تسنده الى اوبجكت الـ str

يعني : يس يس يس :)

كل التوفيق

تم تعديل هذه المشاركة بواسطة بنت اليمن في 25 يونيو 2008 في 21:23

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#13

بالنسبة لما اراه ان ان الخيار الاول هو الاصح من بين الخيارات الاربعة

ولهذا يكون الاسناد صحيح مئة في المائة السبب كما قال الاخ عيسى

Xline كتب:
الفرق في طريقة تمثيلها بالميموري

ولاقرب الصورة اكثر .

فعدنا نقوم بتعريف كلمة او جملة من نوع الكائن String فانه يقوم يتخزين له مرجع في البرنامج

فالخيار والتعريف الاول وهو

String s1 = "Hellow Java";

يقوم التعريف باسناد الجملة الى الكائن . ولكن لن يقوم باعطاءه مرجعيه في البرنامج .

اي يصبح التعريف بعد الترجمة كالتالي :

String Hellow Java = "Hellow Java";

اما في بقية الخيارات وهي التاليه . فانه يقوم بتخزين او اعطاءه مرجعيه في البرنامج

ويقوم البرنامج بتخزين الكلمة او الجملة في الذاكرة

ومثال هذا التعريف التالي

String s4 = new String("Hellow Java");

. فان التعريف يصبح شكله في البرنامج كالتالي بعد الترجمه:

String 15236985 = new String("Hellow Java");

حيث يشير الرقم 15236985 الى مكان الجملة في الذاكره . وولن يقوم التعريف بتخزين الجملة او الكلمة في البرنامج

بل سوف يعطيه مرجعيه وهذه المرجعيه هي التي توصل الى الجملة في الذاكرة

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

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

والله اعلم

تم تعديل هذه المشاركة بواسطة ابو سعود الفرنسي في 26 يونيو 2008 في 06:00

#14
اقتباس
يعني : يس يس يس

نونونو :lol: :D :D

#15

يبدو أنكم تتكلمون عن موضوع آخر غير الذي أتكلم عنه

أنا لا علاقة لي بمؤشرين أو مؤشر واحد

أنا أتكلم عن الأثر الذي يلحق ذلك

بداية الكائنات غير المتقلبة

تعني التالي

أي تعديل على الكائن يتولد عنه كائن جديد

بغض النظر عن أي شيء آخر

والفئة String من هذا النوع

بمعنى أن أي تعديل على الكائن من نوع String

يعني توليد كائن جديد

وبما أن هذه الفئة من الفئات المستخدمة بكثرة

فقد وفرت الجافا موضوع StringPool كحل بديل

أتمنى أن تكون وصلت فكرتي

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة