JavaRush /Blog Jawa /Random-JV /substring(..) angker aku
IgorBrest
tingkat

substring(..) angker aku

Diterbitake ing grup
Bener, kanggo alesan saka subyek, Aku ngidini dhewe kanggo delve menyang String.substring(..). Lan aku mbokmenawa teka ing asil sing ora dikarepke, kang aku mutusaké kanggo nuduhake karo sampeyan, dear Javorashovites. Nyedhiyakake marang pangadilan sampeyan, supaya bisa ngomong. Dadi ing kene. Ana pratelan yen senar sing digawe nggunakake metode substring (..) nggunakake array karakter saka senar asli. Ing kene, utamane, minangka kutipan saka artikel sing bubar diwaca "Referensi Jawa. String Statis" dening artikel sing dihormati :
Ana cathetan babagan cara substring - string bali nggunakake array byte sing padha karo sing asli
Lan mesthi, Javarash Lectures. Mangkene kuotasi saka 22 Desember:
Nalika nggawe substring nggunakake metode substring, obyek String anyar digawe. Nanging tinimbang nyimpen referensi kanggo Uploaded karo pesawat anyar saka karakter, obyek iki nyimpen referensi kanggo Uploaded karakter lawas lan ing wektu sing padha nyimpen loro variabel karo kang nemtokake bagean saka Uploaded karakter asli belongs kanggo. ... Nalika substring digawe, array karakter ora disalin menyang obyek String anyar. Nanging, loro obyek nyimpen referensi kanggo array karakter sing padha. Nanging! Obyek kapindho nyimpen rong variabel liyane, sing ngemot endi lan pirang-pirang karakter saka array iki ditulis. ... Mulane, yen sampeyan njupuk senar 10.000 karakter dawa lan nggawe 10.000 substrings saka sembarang dawa saka iku, banjur iki "substrings" bakal njupuk munggah banget sethitik memori, amarga larik karakter ora duplikat. Strings sing kudu njupuk munggah ton spasi mung bakal njupuk munggah saperangan bita.
kabeh ditulis kanthi cetha, malah dikunyah. Nanging, amarga aku nyoba nambah kawruh babagan basa Inggris, aku kerep pindhah menyang dokumentasi resmi, lan piye wae aku ora bisa nemokake konfirmasi saka kasunyatan iki ... Atribut iki kanggo carelessness, Aku isih katon ing kode sumber saka substring () (matur nuwun kanggo IDEA ngidini sampeyan nindakake iki kanthi siji klik tombol). public String substring(int beginIndex, int endIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } if (endIndex > value.length) { throw new StringIndexOutOfBoundsException(endIndex); } int subLen = endIndex - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return ((beginIndex == 0) && (endIndex == value.length)) ? this : new String(value, beginIndex, subLen); } Intrigued, Aku banjur luwih: * Allocates a new {@code String} that contains characters from a subarray * of the character array argument. The {@code offset} argument is the * index of the first character of the subarray and the {@code count} * argument specifies the length of the subarray. The contents of the * subarray are copied; subsequent modification of the character array does * not affect the newly created string. public String(char value[], int offset, int count) { if (offset < 0) { throw new StringIndexOutOfBoundsException(offset); } if (count < 0) { throw new StringIndexOutOfBoundsException(count); } // Note: offset or count might be near -1>>>1. if (offset > value.length - count) { throw new StringIndexOutOfBoundsException(offset + count); } this.value = Arrays.copyOfRange(value, offset, offset+count); } ngendi Arrays.copyOfRange iku cara native sing ngasilake salinan Uploaded saka char ... Cukup kode ora pati penting, lan ketoke ketok kanggo kula sing baris anyar karo pesawat anyar karakter mung digawe. utawa aku ora njupuk soko menyang akun ... Dadi, ora kanthi pracaya ing Serat sandi, Aku mutusaké kanggo piye wae nyoba substring iki (), gumantung ing frase saka kuliah:
Mulane, yen sampeyan njupuk senar 10.000 karakter lan nggawe 10.000 substrings saka sembarang dawa saka iku, banjur iki "substrings" bakal njupuk munggah banget sethitik memori ...
mung tinimbang 10_000 kita bakal langsung nggawe 100_000_000, kok mbuwang wektu ing trifles. Aku cepet mbuwang ing kode ing ngisor iki: lan iki kedaden: i.e. Saben-saben sampeyan nggawe sub senar anyar nggunakake bigString.substring (..), susunan karakter duplikat. Kepiye carane bisa nerangake paningkatan konsumsi memori kasebut? Sawise iki, aku dhewe ora mangu-mangu babagan operasi metode String.substsring () Apa sampeyan? public class Test { public static void main(String[] args) { System.out.println("Начинаем:"); print(); System.out.println("********************************"); char[]big=new char[100_000_000];//создаем нормальный такой массив int j=0;//и заполняем этот массив всякой ерундой for (int k=0;k list=new ArrayList<>();//здесь будут ссылки на строки, что бы сборщик мусора не удалял //не используемые, по его мнению, строки. System.out.println("************************************"); System.out.println("Теперь будем создавть подстроки с помощью substring(..) и наблюдать," + "что же происходит с памятью"); for (int i = 2; i <10; i++) { //создаем подстроку, используя метод String.substring(..) String sub= bigString.substring(1,bigString.length()-1); //если этот метод не создает fully новый массив символов, а только пользуется //исходным из bigString // то при создании новой строки sub мы не будем наблюдать ощутипый расход памяти list.add(sub);//эти ссылки мы должны где нибудь хранить, иначе сборщик мусора //избавится от неипользуемых объктов String System.out.print(String.format("Создаем %d-ую подстроку, при этом ", i - 1)); print(); } System.out.println("***************************************"); print(); } static void print(){ System.out.println("Памяти используется "+(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/1024/1024 + " mb"); } } Начинаем: Памяти используется 0 mb ******************************** создал большую строку bigString на основе массива big. Теперь: Памяти используется 382 mb ************************************ Теперь будем создавть подстроки с помощью substring(..) и наблюдать,что же происходит с памятью Добавляем 1-ую подстроку, при этом Памяти используется 573 mb Добавляем 2-ую подстроку, при этом Памяти используется 763 mb Добавляем 3-ую подстроку, при этом Памяти используется 954 mb Добавляем 4-ую подстроку, при этом Памяти используется 1145 mb Добавляем 5-ую подстроку, при этом Памяти используется 1336 mb Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:3658) at java.lang.String. (String.java:201) at java.lang.String.substring(String.java:1956) at com.javarush.test.tests.Test.main(Test.java:42) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) Process finished with exit code 1
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION