জাভাতে স্ট্রিংয়ের সর্বোচ্চ দৈর্ঘ্য - কলিং দৈর্ঘ্য () পদ্ধতি


150

ইন জাভা , কি সর্বোচ্চ আকার একটি হল Stringবস্তুর থাকতে পারে, উল্লেখ length()পদ্ধতি কল?

আমি জানি যে length()একটি Stringহিসাবে একটি আকার ফিরে char [];


5
যদিও ক এর দৈর্ঘ্য Stringতাত্ত্বিকভাবে Integer.MAX_VALUE, উত্সটিতে একটি স্ট্রিং আক্ষরিক দৈর্ঘ্য কেবলমাত্র ইউটিএফ -8 ডেটার 65535 বাইটের মধ্যে সীমাবদ্ধ বলে মনে হয় ।
200_সুকেস

উত্তর:


169

Stringক্লাসের lengthপদ্ধতিটি কোনও রিটার্ন বিবেচনা করে int, পদ্ধতিটি দ্বারা ফিরে আসা সর্বোচ্চ দৈর্ঘ্য হবে Integer.MAX_VALUE, যা 2^31 - 1(বা আনুমানিক 2 বিলিয়ন))

লেন্থ এবং বিন্যাসের ইন্ডেক্স, (যেমন নিরিখে char[], যা সম্ভবত পথ অভ্যন্তরীণ তথ্য উপস্থাপনা জন্য প্রয়োগ করা হয় Stringগুলি), অধ্যায় 10: অ্যারেগুলির এর দ্য জাভা ল্যাঙ্গুএজ স্পেসিফিকেশন, জাভা SE 7 সংস্করণ নিম্নলিখিত বলেছেন:

অ্যারেতে থাকা ভেরিয়েবলগুলির কোনও নাম নেই; পরিবর্তে সেগুলি অ্যারে অ্যাক্সেস এক্সপ্রেশন দ্বারা উল্লেখ করা হয় যা nonnegative পূর্ণসংখ্য সূচক মান ব্যবহার করে। এই ভেরিয়েবলগুলিকে অ্যারের উপাদানগুলি বলা হয় । একটি অ্যারের থাকে nউপাদান, আমরা বলতে nহয় দৈর্ঘ্য অ্যারের; অ্যারের উপাদান থেকে পূর্ণসংখ্যা সূচকের ব্যবহার রেফারেন্সড হয় 0করতে n - 1সমেত।

অধিকন্তু, অনুচ্ছেদ 10.4 বিভাগেint উল্লিখিত হিসাবে মানগুলি অনুসারে হতে হবে :

অ্যারেগুলি intমান দ্বারা সূচী করা আবশ্যক ;

অতএব, এটি প্রদর্শিত হয় যে সীমাটি প্রকৃতপক্ষে 2^31 - 1, কারণ এটি একটি ননজিটিভ intমানের জন্য সর্বাধিক মান।

তবে সম্ভবত অন্যান্য সীমাবদ্ধতা হতে চলেছে যেমন অ্যারের জন্য সর্বোচ্চ বরাদ্দযোগ্য আকার।


26
পূর্ণসংখ্যার। MAX_VALUE আসলে 2 ^ 31-1 হয়। :)
মাইকেল মায়ার্স

1
দুর্দান্ত উত্তর! আমি স্ট্রিং.জভা সোর্স কোডটি দেখেছি এবং এটি সঠিক, 'গণনা' হ'ল চার্ট অ্যারের দৈর্ঘ্য ফিরিয়ে দেয় এমন ইনটার ভেরিয়েবল এবং চর অ্যারেটি 'মান' ভেরিয়েবলে (চর হিসাবে []) সংরক্ষণ করা হয় যার অর্থ স্ট্রিংয়ের আকারটি 2GB এর কাছাকাছি হতে পারে। অবশ্যই এ জাতীয় মেমরির আকার বরাদ্দ করার সীমাবদ্ধতা থাকতে পারে। ধন্যবাদ!
তাইচি

5
আমি শুধু একটি হ্যালো দুনিয়া জাভা প্রোগ্রাম যা 65546. চেয়ে দীর্ঘতর ছিল একটি স্ট্রিং আক্ষরিক সংজ্ঞা চেষ্টা javac: অত্যন্ত দীর্ঘ সম্পর্কে আক্ষরিক হচ্ছে একটি ত্রুটি দেয়javac HelloWorld.java 2>&1|head -c 80 HelloWorld.java:3: constant string too long
dlamblin

2
@dlamblin: তা একটি সীমাবদ্ধতা মত শোনায় javacজন্য String লিটারেল (না Stringবস্তু), আমি না মাপ সীমা কোনো রেফারেন্স জানতে পারেন Stringজাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন এবং জেভিএম নির্দিষ্টকরণ মধ্যে লিটারেল। আমি Stringআক্ষরিক তৈরির চেষ্টা করেছি যা ১০০,০০০ টির চেয়ে বেশি অক্ষরের চেয়ে বড় ছিল এবং এক্সপ্লাইস সংকলকটি এটি সংকলন করতে সমস্যা হয়নি। (এবং প্রোগ্রামটি চালানোর ফলে আক্ষরিক অর্থে এক String.lengthলক্ষেরও বেশি ছিল তা দেখাতে সক্ষম হয়েছিল ))
কুইবার্ড

3
@ প্রমরাজ এটি তিন বছর আগে ছিল তাই আমাকে এটি সম্পর্কে ভাবতে হয়েছিল। ;) আমি যা বোঝাতে চেয়েছিলাম; সর্বাধিক আকারের স্ট্রিং তৈরি করতে আপনার প্রচুর স্মৃতি দরকার, আপনার যেকোনো উপায়ে সম্ভবত বেশি more চরিত্রের জন্য আপনার 4 বাইটের দুটি বাইট প্রয়োজন, তবে আপনার এটি স্ট্রিংবিল্ডার বা চর থেকে তৈরি করতে হবে [অর্থাত্ এটি প্রথম স্থানে তৈরি করতে আপনার চরিত্রের জন্য আরও দুটি বাইট প্রয়োজন, অর্থাত্ অন্য 4 গিগাবাইট (কমপক্ষে সাময়িকভাবে))
পিটার লরে

25

java.io.DataInput.readUTF()এবং java.io.DataOutput.writeUTF(String)বলুন যে কোনও Stringবস্তু দৈর্ঘ্যের তথ্যের দুটি বাইট এবং স্ট্রিংয়ের প্রতিটি অক্ষরের পরিবর্তিত UTF-8 প্রতিনিধিত্ব করে। এই উপসংহারে যে স্ট্রিং এর দৈর্ঘ্য যখন সঙ্গে ব্যবহার স্ট্রিং এর পরিবর্তিত হল UTF-8 প্রতিনিধিত্বের বাইটের সংখ্যা দ্বারা সীমাবদ্ধ DataInputএবং DataOutput

উপরন্তু, এর স্পেসিফিকেশনCONSTANT_Utf8_info জাভা ভার্চুয়াল মেশিন স্পেসিফিকেশন পাওয়া নিম্নরূপ গঠন সংজ্ঞায়িত করে।

CONSTANT_Utf8_info {
    u1 tag;
    u2 length;
    u1 bytes[length];
}

আপনি জানতে পারেন যে 'দৈর্ঘ্য' আকার দুই বাইট

একটি নির্দিষ্ট পদ্ধতি (যেমন ফেরত যে ধরনের String.length()) হল intসবসময় অর্থ এই নয় যে তার অনুমতি সর্বাধিক মান Integer.MAX_VALUE। পরিবর্তে, বেশিরভাগ ক্ষেত্রে, intকেবল কার্য সম্পাদনের কারণে বেছে নেওয়া হয়। জাভা ভাষার স্পেসিফিকেশন বলছে যে পূর্ণসংখ্যার আকার যার চেয়ে ছোট intসেগুলি intগণনার আগে রূপান্তরিত করা হয় (যদি আমার স্মৃতি আমাকে সঠিকভাবে পরিবেশন করে) এবং intকোনও বিশেষ কারণ না থাকার পরে এটি বেছে নেওয়ার এক কারণ।

সংকলনের সময় সর্বাধিক দৈর্ঘ্য সর্বোচ্চ 65536 again আবার নোট করুন যে দৈর্ঘ্যটি কোনও পরিবর্তিত UTF-8 উপস্থাপনার বাইট সংখ্যা, কোনও Stringবস্তুর অক্ষরের সংখ্যা নয় ।

Stringরানটাইমে অবজেক্টস আরও অনেক বেশি অক্ষর রাখতে সক্ষম হতে পারে। তবে আপনি যদি ও ইন্টারফেসের Stringসাথে অবজেক্টগুলি ব্যবহার করতে চান তবে খুব দীর্ঘ অবজেক্ট ব্যবহার না করা ভাল । আমি এই সীমাবদ্ধতাটি খুঁজে পেয়েছি যখন আমি এবং এর উদ্দেশ্য-সি সমতুল্য প্রয়োগ করেছি ।DataInputDataOutputStringDataInput.readUTF()DataOutput.writeUTF(String)


1
এটি ডিফল্ট উত্তর হওয়া উচিত।
নিক

20

যেহেতু অ্যারেগুলি অবশ্যই পূর্ণসংখ্যার সাথে সূচী করা উচিত তাই অ্যারের সর্বাধিক দৈর্ঘ্য Integer.MAX_INT(2 31 -1, বা 2 147 483 647)। এটি ধরে নেওয়া হচ্ছে যে অবশ্যই আপনার অবশ্যই সেই আকারের অ্যারে ধরে রাখতে যথেষ্ট মেমরি রয়েছে।


9

আমার 820 র‌্যামের সাথে 2010 এর আইম্যাক রয়েছে, যা জাভা 1.8.0_25 সহ এক্লিপ্স নিওন ২ রিলিজ (4.6.2) চালাচ্ছে। ভিএম যুক্তি -Xmx6g সহ, আমি নিম্নলিখিত কোডটি চালিয়েছি:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
    try {
        sb.append('a');
    } catch (Throwable e) {
        System.out.println(i);
        break;
    }
}
System.out.println(sb.toString().length());

এই মুদ্রণ:

Requested array size exceeds VM limit
1207959550

সুতরাং, মনে হয় সর্বাধিক অ্যারের আকার ~ 1,207,959,549। তখন আমি বুঝতে পেরেছিলাম যে জাভা স্মৃতি থেকে বেরিয়ে আসলে আমরা আসলে যত্নশীল নই: আমরা কেবল সর্বাধিক অ্যারে আকার খুঁজছি (যা কোথাও একটি ধ্রুবক হিসাবে সংজ্ঞায়িত বলে মনে হয়)। তাই:

for (int i = 0; i < 1_000; i++) {
    try {
        char[] array = new char[Integer.MAX_VALUE - i];
        Arrays.fill(array, 'a');
        String string = new String(array);
        System.out.println(string.length());
    } catch (Throwable e) {
        System.out.println(e.getMessage());
        System.out.println("Last: " + (Integer.MAX_VALUE - i));
        System.out.println("Last: " + i);
    }
}

কোন মুদ্রণ:

Requested array size exceeds VM limit
Last: 2147483647
Last: 0
Requested array size exceeds VM limit
Last: 2147483646
Last: 1
Java heap space
Last: 2147483645
Last: 2

সুতরাং, মনে হয় সর্বাধিকটি পূর্ণসংখ্যা। MAX_VALUE - 2, বা (2 ^ 31) - 3

দ্রষ্টব্য আমি নিশ্চিত নই কেন আমার StringBuilderএ maxed আউট 1207959550যখন আমার char[](2 ^ 31) এ খুঁজে maxed -3। দেখে মনে হচ্ছে এটি বাড়ার AbstractStringBuilderজন্য এটির অভ্যন্তরের আকার দ্বিগুণ হয় char[], যাতে সম্ভবত সমস্যাটি ঘটে ।


1
প্রশ্নের একটি খুব দরকারী ব্যবহারিক চিকিত্সা
পাভলো মাইস্ত্রেঙ্কো


4

স্ট্রিং ক্লাসের পদ্ধতি দৈর্ঘ্য () প্রত্যাবর্তন প্রকার int- এ

জনসাধারণের দৈর্ঘ্য ()

পড়ুন http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#length ()

সুতরাং int এর সর্বাধিক মান 2147483647

স্ট্রিংকে অভ্যন্তরীণভাবে চর অ্যারে হিসাবে বিবেচনা করা হয়, সুতরাং সীমাবদ্ধতা সীমাবদ্ধ সীমাতে করা হয়। এর অর্থ আমরা 2147483648 তম সদস্যকে সূচক করতে পারি না o সুতরাং জাভাতে স্ট্রিংয়ের সর্বাধিক দৈর্ঘ্য 2147483647।

জাভাতে প্রাথমিক তথ্য টাইপ int 4 বাইট (32 বিট) হয়। 1 বিট (এমএসবি) হিসাবে সাইন বিট হিসাবে ব্যবহৃত হয় , পরিসীমা -2 ^ 31 থেকে 2 ^ 31-1 (-2147483648 থেকে 2147483647) এর মধ্যে আবদ্ধ হয়। আমরা সূচকের জন্য নেতিবাচক মানগুলি ব্যবহার করতে পারি না o সুতরাং স্পষ্টতই আমরা যে পরিসরটি ব্যবহার করতে পারি তা 0 থেকে 2147483647 এর মধ্যে।


0

টাকাহিকো কাওয়াসাকির উত্তরে উল্লিখিত হিসাবে , জাভা ইউনিকোড স্ট্রিংগুলিকে পরিবর্তিত ইউটিএফ -8 আকারে এবং জেভিএম-স্পেস CONSTANT_UTF8_info কাঠামোতে 2 বাইটকে দৈর্ঘ্যের জন্য বরাদ্দ করা হয় (এবং স্ট্রিংয়ের অক্ষরের সংখ্যা নয়)।
উত্তরটি প্রসারিত করতে, ASM jvm বাইটকোড লাইব্রেরির putUTF8পদ্ধতিতে এটি রয়েছে:

public ByteVector putUTF8(final String stringValue) {
    int charLength = stringValue.length();
    if (charLength > 65535) {   
   // If no. of characters> 65535, than however UTF-8 encoded length, wont fit in 2 bytes.
      throw new IllegalArgumentException("UTF8 string too large");
    }
    for (int i = 0; i < charLength; ++i) {
      char charValue = stringValue.charAt(i);
      if (charValue >= '\u0001' && charValue <= '\u007F') {
        // Unicode code-point encoding in utf-8 fits in 1 byte.
        currentData[currentLength++] = (byte) charValue;
      } else {
        // doesnt fit in 1 byte.
        length = currentLength;
        return encodeUtf8(stringValue, i, 65535);
      }
    }
    ...
}

কিন্তু যখন কোড-পয়েন্ট ম্যাপিং> 1 বাইট, এটি encodeUTF8পদ্ধতিটি কল করে :

final ByteVector encodeUtf8(final String stringValue, final int offset, final int maxByteLength /*= 65535 */) {
    int charLength = stringValue.length();
    int byteLength = offset;
    for (int i = offset; i < charLength; ++i) {
      char charValue = stringValue.charAt(i);
      if (charValue >= 0x0001 && charValue <= 0x007F) {
        byteLength++;
      } else if (charValue <= 0x07FF) {
        byteLength += 2;
      } else {
        byteLength += 3;
      }
    }
   ...
}

এই অর্থে, সর্বাধিক স্ট্রিংয়ের দৈর্ঘ্য 65535 বাইট, অর্থাৎ utf-8 এনকোডিং দৈর্ঘ্য। এবং charগণনা করা হয় না
আপনি উপরের ইউটিএফ 8 স্ট্রাক লিঙ্ক থেকে জেভিএমের সংশোধিত-ইউনিকোড কোড-পয়েন্টের সীমাটি পেতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.