השוואת מחרוזות ב JAVA

ronitV

New member
השוואת מחרוזות ב JAVA

מתוך JAVA על כוס קפה:
public class StringApp { public static void main(String[] args) { String s1 = "ABC"; String s2 = "ABC"; if (s1 == s2) { System.out.println("s1 == s2"); } if(s1.equals(s2)) { System.out.println("s1 equals s2"); } } }​
רק התנאי השני אמור להתקיים כי ההשוואה הראשונה היא בין 2 המצביעים. אבל שניהם true ושני ההודעות מודפסות טעות בספר או שהפונקציה השתנתה מאז ב JDK החדשים ?
 

ronitV

New member
ועוד שאלה

ב JAVA העצמים מוקצים כולם בערימה אבל מה בנוגע למצביעים עצמם היכן הם מוקצים על הערימה או במחסנית ?
 
כל המצביעים שהם..

משתנים לוקליים מוקצים במחסנית. כל המצביעים שהם שדות של מחלקה מוקצים איפה שאותה מחלקה מוקצה (שזה בערימה). כל המצביעים שהם שדות סטטיים של מחלקה הם חלק מה-static data של התוכנית.
 

neko

New member
המממ... יכול להיות שהקומפיילר

מספיק חכם לזהות ששתי המחרוזות זהות, ומלכתחילה נותן לשתיהן אותו POINTER כדי לחסוך זכרון?
 

ronitV

New member
רעיון יפה אבל לפי מה שכתוב בספר

לא היה אמור לתת בשניהם true.
 
הספר לא יודע..

איך הקומפיילר ממומש. חוץ מזה, אין קומפיילר יחיד לג'אווה. וכל קומפיילר יכול להתנהג איך שבא לו כל עוד הקוד שלו תואם את הספציפיקציות (ולמיטב ידיעתי מה שהבחור מעלי הסביר יחד עם שימוש ב-copy on write לא סותר את הספציפיקציות).
 

neko

New member
דווקא לJAVA כן יש קומפיילר יחיד ../images/Emo13.gif

אמנם בהמון גרסאות, אבל רק של SUN...
 

neko

New member
וואלה? ../images/Emo12.gif מוזר... הייתי מצפה שיגיע

עם ECLIPSE לפחות.
 
תבקר פה

פה. במקרה המרצה שלי בקורס בקומפיילרים, שעובדת במרכז המחקר של IBM שממוקם בקמפוס של אוניברסיטת חיפה סיפרה לנו עליו, ועל כל מני אופטימיזציות שהם ב-IBM מנסים לעשות. גם אני לא הייתי מודע לקיומו של ה-JVM שלהם עד שהיא סיפרה לנו עליו. היא טוענת שהם הגיעו לביצועים שקרובים כמעט לביצועים של ++C. אכן יצא לי לנסות להריץ את הפרוייקט שעשיתי בקורס בינה מלאכותית על ה-JVM שלהם והוא פתר את הבעיות בזמן טיפה יותר קצר ממה שלקח לו לפתור אותן עם ה-JVM של Sun. מצד שני הסביבה של IBM היא מאד כבדה ואוכלת המון זיכרון, אז אני לא יודע עד כמה היא שימושית.
 
קומפיילר יחיד??../images/Emo12.gif

אם אני זוכר נכון גם ל-JBuilder או ל-Visual Cafe היה קומפיילר עצמאי... יש הגדרות לשפה, למה שיהיה רק קומפיילר אחד?...
 

neko

New member
המממ... כשהורדתי JBUILDER

ECLIPSE וINTELLI-J (הייתי חייב לנסות הכל
הייתי חייב להוריד את הSDK של SUN מהאתר, אז הנחתי שאין קומפיילר אחר - ולמה שיהיה בעצם? אבל כנראה שטעיתי, נו שוין.
 
למה יש יותר מקומפיילר C אחד?...

כי כל אחד מהם מנסה (או מתיימר?...
) לייצר קוד יותר אפקטיבי, יותר מהר עם יותר אופטימיזציות...
 

neko

New member
אבל C היא שפה חופשית,

ו-JAVA פותחה ע"י, ושייכת ל-, SUN...
 

neko

New member
יכול להיות שהכוונה של הספר היא

שלא בהכרח יהיה TRUE. תעשי לך ניסוי - במקום להציב את המחרוזות הללו בתוכנית, קבלי אחת מהן בזמן ריצה מהמשתמש, או תייצרי לך אותה בזמן ריצה ע"י חיבור CHAR-ים - יכול להיות שמשהו בסגנון:
string s2 = "A"; string s3 = "BC"; s2 += s3;​
יספיק כדי "לעבוד" על הקופיילר. אם לא, קבלת מחרוזת בזמן ריצה כמעט בטוח תעבוד עליו.
 

ronitV

New member
אתם צודקים

עכשיו זה עובד. מוזר שבספר הוא נותן את הדוגמא כמו שכתבתי. כנראה השתנה מאז משהו כי ניסיתי על 2 גרסאות שונות של JDK ובשניהם היתה אותה תוצאה. תודה ושנה טובה
 

DadleFish

New member
הבעיה היא לא בזמן כתיבת הספר,

אלא בספר עצמו. יש לספרים, בייחוד בעברית, נטיה מרגיזה להניח הנחות בלתי מבוססות. הכותב הלך ובדק עם איזשהו קומפיילר דרעק, וקיבל תוצאת FALSE. כל קומפיילר פשוט ל-JAVA או לכל תוכנה אחרת יידע לכוון את שתי המחרוזות לאותו מיקום בזכרון. כל string בכל שפה נורמלית היום יודע לעשות את זה.
 

ronitV

New member
האמת שהגעתי לזה ממש בטעות

אחרי שהתקנתי סביבה של JAVA במחשב סתם לקחתי את הספר בשביל תכנית דוגמא. הספר הוא של מרכז הדרכה 2000. בנוגע לספרים בעברית אני מסכימה עם כל מילה. אבל לדעתי יש להם את הספר הטוב ביותר בעברית ל ++C וגם הספר של MFC לא רע יחסית גם לספרים אחרים באנגלית. נכון שבאנגלית יש הרבה ספרים מצויינים אבל גם אחוז הזבל מסך כל הספרים הוא עדיין גבוה.
 

DadleFish

New member
כל עוד את יודעת איפה את עומדת,

ויודעת שאת החומר הבסיסי כדאי להשיג ממקורות מהימנים - אני שקט
 
למעלה