در این مقاله ی آموزشی به بررسی اشکالات رشته ها در جاوا می پردازیم و یکی از اشکالات مربوط به رشته ها را در قالب یک اپلیکیشن تبیین می کنیم.
دستکاری کاراکترها و گروه های کاراکتری، برای برنامه نویسان تازه کار جاوا مقداری چالش برانگیز است. بعنوان مثال اپلیکیشن TryToCompareStrings را در تصویر 7.1 در نظر بگیرید. در متد main()
یک رشته(String) به نام aName داریم که مقدار “Carmen” را در آن قرار داده ایم. و یک رشته ی دیگر به نام anotherName داریم و پس از آن، از کاربر درخواست کرده ایم که یک نام را وارد کند. این اپلیکیشن، با استفاده از عملگر برابری(==) این دو رشته را با یکدیگر مقایسه می کند و یکی از دو پیغام که مشخص می کنند آیا رشته ها باهم برابر هستند یا نه را نمایش می دهد.
(تصویر 7.1 : اپلیکیشن TryToCompareStrings)
عبارت شماره 1 در تصویر بالا: این کار را انجام ندهید. از == برای مقایسه ی محتوای رشته ها استفاده نکنید.
تصویر 7.2 اجرای این اپلیکیشن را نشان می دهد. وقتی که کاربر عبارت “Carmen” را بعنوان یک مقدار برای anotherName تایپ می کند، نتیجه می گیرد که این دو نام با یکدیگر برابر نیستند.
(تصویر 7.2 : اجرای اپلیکیشن TryToCompareStrings)
به نظر می رسد که اپلیکیشن درون تصویر 7.1 نتایج اشتباهی را تولید می کند. اشکال از این حقیقت ناشی می شود که String در جاوا یک کلاس است و هر String که ایجاد شود، یک آبجکت از یک کلاس محسوب می شود. بنابراین، String یک نوع داده ی ساده نیست. بلکه یک ارجاع(reference) است؛ یعنی یک متغیر است که یک آدرس از حافظه(memory) را نگهداری می کند. بنابراین، وقتی که ما با استفاده از عملگر == دو String را مقایسه می کنیم، درواقع مقادیر آنها را مقایسه نمی کنیم، بلکه موقعیت های حافظه ی کامپیوتری را مقایسه می کنیم.
برنامه نویسان می خواهند محتوای درون موقعیت های حافظه(یعنی مقادیر ذخیره شده در آنجا) را با یکدیگر مقایسه کنند و نمی خواهند خود موقعیت ها(یعنی آدرس ها) را با یکدیگر مقایسه کنند. خوشبختانه سازندگان جاوا، سه کلاس ارائه داده اند که به هنگام کار با داده های متنی، می توانیم از آنها استفاده کنیم. این کلاس ها، متدهایی را به ما ارائه می دهند که می توانیم با استفاده از آنها به صورت ساده تر با کاراکترها و رشته ها کار کنیم:
1. کلاس Character: یک کلاس است که نمونه های(instances) آن می توانند یک مقدار کاراکتریِ تکی را نگهداری کنند. همچنین این کلاس متدهایی ارائه می دهد که می توانند داده های کاراکتری تکی را دستکاری یا بررسی کنند.
2. کلاس String : یک کلاس است که با داده های رشته ای ثابت(fixed-string data) کار می کند؛ یعنی داده های تغییر ناپذیر که از چند کاراکتر تشکیل شده اند.
3. کلاس StringBuilder و StringBuffer : کلاس هایی برای ذخیره و دستکاری داده های قابل تغییر که از چند کاراکتر تشکیل شده اند.
دو عبارت صحیح و یک عبارت اشتباه
موضوع: درک مشکلات داده های رشته ای در جاوا
- یک String درواقع یک نوع داده ی ساده است که می تواند داده های متنی را نگهداری کند.
- برنامه نویسان می خواهند مقادیر String ها را بیشتر به جای آدرس های حافظه(memory addresses) با یکدیگر مقایسه کنند.
- کلاس های Character و String و StringBuilder کلاس های داخلی(built-in) مفیدی برای کار با داده های متنی هستند.
پاسخ:
گزینه ی1 اشتباه است. نام یک متغیر String، یک ارجاع(reference) است؛ یعنی یک آدرس حافظه(memory) را نگهداری می کند.