์ฌ์ค, ์ฃผ์ ๋๋ฌธ์ String.substring(..)์ ์์ธํ ์ดํด๋ณด๊ฒ ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ์๋ง๋ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ ๊ฒ์
๋๋ค. ์น์ ํ๋ Javorashovites ์ฌ๋ฌ๋ถ๊ณผ ๊ณต์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋งํ์๋ฉด, ๊ทธ๊ฒ์ ๋น์ ์ ํ๋จ์ ๋งก๊ธฐ์ญ์์ค. ์ฌ๊ธฐ ์์ต๋๋ค. substring(..) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ๋ฌธ์์ด์ ์๋ ๋ฌธ์์ด์ ๋ฌธ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค๋ ์ค๋ช
์ด ์์ต๋๋ค. ํนํ ๋ค์์ ์กด๊ฒฝ๋ฐ๋ ๊ธฐ์ฌ ์์ ์ต๊ทผ ์ฝ์ "Java Reference. Static Strings" ๊ธฐ์ฌ์์ ๋ฐ์ทํ ๋ด์ฉ์
๋๋ค .
ํ์ ๋ฌธ์์ด ๋ฐฉ๋ฒ์ ๋ํ ์ฐธ๊ณ ์ฌํญ์ด ์์ต๋๋ค. ๋ฐํ๋ ๋ฌธ์์ด์ ์๋ ๋ฌธ์์ด๊ณผ ๋์ผํ ๋ฐ์ดํธ ๋ฐฐ์ด์ ์ฌ์ฉํฉ๋๋ค.๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก Javarash ๊ฐ์๋ ์์ต๋๋ค. 12์ 22์ผ์ ์ธ์ฉ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
substring ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ๋ฌธ์์ด์ ์์ฑํ๋ฉด ์๋ก์ด String ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ฐ์ฒด๋ ์๋ก์ด ๋ฌธ์ ์งํฉ์ด ํฌํจ๋ ๋ฐฐ์ด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ ๋์ ์ด์ ๋ฌธ์ ๋ฐฐ์ด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ ๋์์ ์๋ ๋ฌธ์ ๋ฐฐ์ด์ ์ด๋ ๋ถ๋ถ์ด ์ํ๋์ง ๊ฒฐ์ ํ๋ ๋ ๊ฐ์ ๋ณ์๋ฅผ ์ ์ฅํฉ๋๋ค. ... ํ์ ๋ฌธ์์ด์ด ์์ฑ๋๋ฉด ๋ฌธ์ ๋ฐฐ์ด์ด ์ String ๊ฐ์ฒด์ ๋ณต์ฌ๋์ง ์์ต๋๋ค. ๋์ ๋ ๊ฐ์ฒด ๋ชจ๋ ๋์ผํ ๋ฌธ์ ๋ฐฐ์ด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ํ์ง๋ง! ๋ ๋ฒ์งธ ๊ฐ์ฒด๋ ์ด ๋ฐฐ์ด์ ์ด๋ค ๋ฌธ์์ ์ผ๋ง๋ ๋ง์ ๋ฌธ์๊ฐ ๊ธฐ๋ก๋๋์ง๋ฅผ ํฌํจํ๋ ๋ ๊ฐ์ ๋ณ์๋ฅผ ๋ ์ ์ฅํฉ๋๋ค. ... ๋ฐ๋ผ์ 10,000์ ๊ธธ์ด์ ๋ฌธ์์ด์ ๊ฐ์ ธ์์ ์์ ๊ธธ์ด์ ํ์ ๋ฌธ์์ด 10,000๊ฐ๋ฅผ ๋ง๋ค๋ฉด ์ด๋ฌํ "ํ์ ๋ฌธ์์ด"์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฑฐ์ ์ฐจ์งํ์ง ์์ต๋๋ค. ๋ฌธ์ ๋ฐฐ์ด์ ์ค๋ณต๋์ง ์์ต๋๋ค. ๋ง์ ๊ณต๊ฐ์ ์ฐจ์งํ๋ ๋ฌธ์์ด์ ๋ช ๋ฐ์ดํธ๋ง ์ฐจ์งํฉ๋๋ค.๋ชจ๋ ๊ฒ์ด ๋ช ํํ๊ฒ ์ฐ์ฌ ์๊ณ ์ฌ์ง์ด ์น์ด์ก์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์์ด ์ค๋ ฅ์ ๋๋ฆฌ๋ ค๊ณ ํ๋ค ๋ณด๋ ๊ณต์ ๋ฌธ์๋ฅผ ์์ฃผ ์ฐพ์๋ณด๋๋ฐ, ์ด์ฉ์ง ์ด ์ฌ์ค์ ํ์ธํ ์๊ฐ ์๋๋ผ๊ณ ์... ์ ๋ถ์ฃผ์ ํ์ธ์ง ๊ณ์ํด์ ์์ค ์ฝ๋๋ฅผ ์ดํด๋ดค์ต๋๋ค. substring() (IDEA ๋๋ถ์ ๋ฒํผ์ ํ ๋ฒ๋ง ํด๋ฆญํ๋ฉด ์ด ์์ ์ ์ํํ ์ ์์ต๋๋ค).
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); }
ํฅ๋ฏธ๊ฐ ์๊ฒจ ๋ ๋์๊ฐ์ต๋๋ค. * 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); }
์ฌ๊ธฐ์ Arrays.copyOfRange๋ char์์ ๋ฐฐ์ด์ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ ๊ธฐ๋ณธ ๋ฉ์๋์
๋๋ค... ์์ฃผ ์ฌ์ํ ์ฝ๋์ด๋ฉฐ, ์ ๋ฌธ์ ์งํฉ์ด ํฌํจ๋ ์ ํ์ด ๊ฐ๋จํ ์์ฑ๋๋ ๊ฒ์ด ๋ถ๋ช
ํด ๋ณด์์ต๋๋ค. ๋๋ ๋ญ๊ฐ๋ฅผ ๊ณ ๋ คํ์ง ์์์ต๋๋ค... ๊ทธ๋์ ๋ด ๊ฒฐ๋ก ์ ์์ ํ ๋ฏฟ์ง ์๊ณ ๊ฐ์์ ๋ฌธ๊ตฌ์ ์์กดํ์ฌ ์ด๋ป๊ฒ๋ ์ด ํ์ ๋ฌธ์์ด()์ ํ
์คํธํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๋ฐ๋ผ์ 10,000์ ๊ธธ์ด์ ๋ฌธ์์ด์ ๊ฐ์ ธ์์ ์์ ๊ธธ์ด์ ํ์ ๋ฌธ์์ด 10,000๊ฐ๋ฅผ ๋ง๋ค๋ฉด ์ด๋ฌํ "ํ์ ๋ฌธ์์ด"์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฑฐ์ ์ฐจ์งํ์ง ์์ต๋๋ค.10_000 ๋์ ์ฆ์ 100_000_000์ ๋ง๋ค ๊ฒ์ ๋๋ค. ์ ์ฌ์ํ ์ผ์ ์๊ฐ์ ๋ญ๋นํฉ๋๊น? ๋๋ ์ฌ๋นจ๋ฆฌ ๋ค์ ์ฝ๋๋ฅผ ์ง์ด๋ฃ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ฐ ์ผ์ด ์ผ์ด๋ฌ์ต๋๋ค. bigString.substring(..)์ ์ฌ์ฉํ์ฌ ์ ํ์ ๋ฌธ์์ด์ ์์ฑํ ๋๋ง๋ค ๋ฌธ์ ๋ฐฐ์ด์ด ์ค๋ณต๋ฉ๋๋ค. ์ด๋ฌํ ๋ฉ๋ชจ๋ฆฌ ์๋น ์ฆ๊ฐ๋ฅผ ์ด๋ป๊ฒ ์ค๋ช ํ ์ ์์ต๋๊น? ๊ทธ ํ ์ ๋ ๊ฐ์ธ์ ์ผ๋ก String.substsring() ๋ฉ์๋์ ์๋์ ๋ํด ๋ ์ด์ ์์ฌํ์ง ์์์ต๋๋ค. ๋น์ ์ ์ด๋ป์ต๋๊น?
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
GO TO FULL VERSION