{"id":937,"date":"2015-02-27T10:44:19","date_gmt":"2015-02-27T09:44:19","guid":{"rendered":"http:\/\/www.webotlet.hu\/?p=937"},"modified":"2015-04-10T12:05:41","modified_gmt":"2015-04-10T10:05:41","slug":"java-programozas-19-stringbuilder","status":"publish","type":"post","link":"https:\/\/www.webotlet.hu\/?p=937","title":{"rendered":"Java programoz\u00e1s 19. &#8211; StringBuilder"},"content":{"rendered":"<h1>StringBuilder, avagy String kezel\u00e9s profiknak<\/h1>\n<p>A String megv\u00e1ltoztathatatlan. Ez t\u00e9ny. Ha m\u00e9gis m\u00f3dos\u00edtjuk, akkor egy \u00faj Stringet hozunk l\u00e9tre, az el\u0151z\u0151t meg mag\u00e1ra hagyjuk. Ez 1-2 l\u00e9p\u00e9s eset\u00e9n nem t\u00fal nagy gond, de amikor egy Stringet sokszor kell megv\u00e1ltoztatni, vagy sok kis darabb\u00f3l kell \u00f6sszerakni, akkor ez a m\u00f3dszer rendk\u00edv\u00fcl lass\u00fa, pazarl\u00f3, \u00e9s er\u0151sen ker\u00fclend\u0151. Ha sokszor v\u00e1ltoztatni akarjuk, akkor m\u00e1sra van sz\u00fcks\u00e9g\u00fcnk.<\/p>\n<h2>StringBuilder<\/h2>\n<p>A StringBuilder oszt\u00e1lyt kifejezetten az\u00e9rt \u00edrt\u00e1k, hogy seg\u00edts\u00e9g\u00e9vel a Stringek m\u00f3dos\u00edthat\u00f3ak legyenek. Ez egy m\u00f3dos\u00edthat\u00f3 karakterl\u00e1nc. Rendk\u00edv\u00fcl hat\u00e9konyan tudjuk b\u0151v\u00edteni, m\u00f3dos\u00edtani a benne l\u00e9v\u0151 tartalmat, amelyb\u0151l b\u00e1rmikor \u00fajra statikus Stringet k\u00e9sz\u00edthet\u00fcnk.<\/p>\n<p>A StringBuilder oszt\u00e1ly haszn\u00e1lat\u00e1hoz semmilyen speci\u00e1lis csomagot, oszt\u00e1lyt nem kell import\u00e1lni. N\u00e9zz\u00fck meg akkor p\u00e1r p\u00e9ld\u00e1n kereszt\u00fcl, mi mindenre haszn\u00e1lhatjuk.<\/p>\n<h2>StringBuilder deklar\u00e1ci\u00f3 \u00e9s \u00e9rt\u00e9kad\u00e1s<\/h2>\n<p>StringBuilder deklar\u00e1ci\u00f3ja formailag \u00edgy n\u00e9z ki:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">StringBuilder sb;<\/pre>\n<p>A StringBuilder-nek a Stringhez hasonl\u00f3an sokf\u00e9lek\u00e9pp adhat\u00f3 \u00e9rt\u00e9k:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\/\/ liter\u00e1lk\u00e9nt adjuk meg a tartalm\u00e1t\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\n\r\n\/\/ egy Stringet kap param\u00e9terk\u00e9nt\r\nString s = &quot;abrakadabra&quot;;\r\nStringBuilder sb = new StringBuilder(s);\r\n\r\nStringBuilder sb = new StringBuilder(); \/\/ \u00fcres is lehet\r\n<\/pre>\n<h2>StringBuilder met\u00f3dusok<\/h2>\n<p>Mint m\u00e1r eml\u00edtettem, a StringBuilder arra szolg\u00e1l, hogy karakterl\u00e1ncokat kezelj\u00fcnk, megv\u00e1ltoztassunk. A StringBuilder valamennyire hasonl\u00f3s\u00e1got mutat a Stringekkel, de ez csak p\u00e1r met\u00f3dusban nyilv\u00e1nul meg. Ezek olyan met\u00f3dusok, melyek nem m\u00f3dos\u00edtj\u00e1k a StringBuilder-t.<\/p>\n<h4>StringBuilder hossza &#8211; length()<\/h4>\n<p>B\u00e1rmely StringBuilder m\u00e9ret\u00e9t (hossz\u00e1t) megkaphatjuk, ha megh\u00edvjuk a length() met\u00f3dus\u00e1t:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\nSystem.out.println( sb.length() );\r\n<\/pre>\n<h4>StringBuilder adott karaktere &#8211; charAt()<\/h4>\n<p>Egy adott StringBuilder b\u00e1rmelyik karakter\u00e9t megkaphatjuk a charAt(i) met\u00f3dussal, ahova az i hely\u00e9re \u00edrjuk be, hogy h\u00e1nyadik karaktert szeretn\u00e9nk megkapni. A karakterek indexel\u00e9se a t\u00f6mb\u00f6kh\u00f6z hasonl\u00f3an 0-val kezd\u0151dik. Fontos, hogy ez egy karakter t\u00edpust ad vissza! B\u00e1rmely StringBuilder els\u0151 karaktere az sb.charAt(0), az utols\u00f3 pedig az sb.charAt( sb.length()-1 )<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\nsb.charAt(3); \/\/ a 4. karakter (3-as index!)\r\nsb.charAt(0); \/\/ 1. (\u00fcres StringBuilder-n\u00e9l indexel\u00e9si hiba!)\r\nsb.charAt( sb.length()-1 ); \/\/ utols\u00f3 karakter\r\n<\/pre>\n<h4>Keres\u00e9s StringBuilder-ben &#8211; indexOf(), lastIndexOf()<\/h4>\n<p>Egyszer\u0171en kereshet\u00fcnk a StringBuilder-ekben. K\u00edv\u00e1ncsiak vagyunk, hogy egy karakter vagy sz\u00f6vegr\u00e9szlet megtal\u00e1lhat\u00f3-e benne, s\u0151t arra is, hogy hol tal\u00e1lhat\u00f3. Erre szolg\u00e1l az s.indexOf() met\u00f3dus.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\nSystem.out.println( sb.indexOf(&quot;rak&quot;) ); \/\/ 2\r\n\/\/  A 2. index\u0171 (3. karaktern\u00e9l) tal\u00e1lhat\u00f3 a rak sz\u00f3cska.\r\n\r\nSystem.out.println( sb.indexOf(&quot;br&quot;) ); \/\/ 1\r\n\/* Az 1. index\u0171 (2. karaktern\u00e9l) tal\u00e1lhat\u00f3 a rak sz\u00f3cska\r\n * Fontos, hogy az indexOf() mindig az els\u0151 tal\u00e1lat hely\u00e9t adja meg!\r\n *\/\r\n\r\nSystem.out.println( sb.IndexOf(&quot;br&quot;) &gt; -1 ); \/\/ true\r\n\/* Itt nem a keresett sz\u00f6veg helye \u00e9rdekel, hanem az, hogy benne\r\n * van-e. Ha a helye -1-t\u0151l nagyobb, akkor benne van, de nem \u00e9rdekel,\r\n * hogy pontosan hol.\r\n *\/\r\n\r\nSystem.out.println( sb.indexOf(&quot;Br&quot;) ); \/\/ -1\r\n\/* Egy nem l\u00e9tez\u0151 indexet adott eredm\u00e9ny\u00fcl, vagyis a keresett\r\n * r\u00e9szlet nem tal\u00e1lhat\u00f3 meg a Stringben.\r\n *\/\r\n\r\nSystem.out.println( sb.lastIndexOf(&quot;br&quot;) ); \/\/ 8\r\n\/* A 8. index\u0171 (9. karaktern\u00e9l) tal\u00e1lhat\u00f3 a br sz\u00f3cska, de most a\r\n * keres\u00e9st h\u00e1tulr\u00f3l kezdte, \u00e9s onnan adja vissza az els\u0151 tal\u00e1latot!\r\n *\/\r\n<\/pre>\n<p>Az indexOf() \u00e9s lastIndexOf() met\u00f3dusok alaphelyzetben mindig a StringBuilder elej\u00e9r\u0151l\/v\u00e9g\u00e9r\u0151l kezdik a keres\u00e9st, de meg lehet adni nekik, hogy adott karaktert\u0151l kezdj\u00e9k: indexOf(mit,\u00a0honnan) Ehhez kapcsol\u00f3d\u00f3 feladat lehet, hogy adjuk meg, hol tal\u00e1lhat\u00f3 a m\u00e1sodik &#8216;r&#8217; bet\u0171 a sz\u00f3ban:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\n\r\nint elso = sb.indexOf(&quot;r&quot;);\r\n\r\nSystem.out.println( sb.indexOf(&quot;r&quot;, elso+1 ) );\r\n\/* El\u0151sz\u00f6r megkeress\u00fck az els\u0151 'r' bet\u0171t, majd amikor a m\u00e1sodikat\r\n * akarjuk megkeresni, akkor megadjuk, hogy az els\u0151 ut\u00e1ni poz\u00edci\u00f3t\u00f3l\r\n * induljunk. Ezt a k\u00e9t l\u00e9p\u00e9st ak\u00e1r \u00f6ssze is vonhatjuk:\r\n *\/\r\nSystem.out.println( sb.indexOf(&quot;r&quot;, sb.indexOf(&quot;r&quot;)+1 ) );\r\n\r\nSystem.out.println( sb.lastIndexOf(&quot;r&quot;, sb.lastIndexOf(&quot;r&quot;)-1 ) );\r\n\/* Ha ugyanezt h\u00e1tulr\u00f3l v\u00e9gezz\u00fck, akkor figyelni kell arra, hogy\r\n * az els\u0151 tal\u00e1lat el\u0151tt kell folytatni, vagyis itt -1\r\n * kell az els\u0151 tal\u00e1lat hely\u00e9hez k\u00e9pest, mivel visszafel\u00e9 keres\u00fcnk\r\n *\/\r\n<\/pre>\n<h4>StringBuilder r\u00e9sz\u00e9nek kinyer\u00e9se &#8211; substring()<\/h4>\n<p>El\u0151fordulhat, hogy egy StringBuilder-b\u0151l ki kell szedn\u00fcnk egy kisebb r\u00e9szletet. Erre szolg\u00e1l a substring() met\u00f3dus. Amikor egy r\u00e9szt akarunk kinyerni egy StringBuilder-b\u0151l, akkor meg kell mondanunk, hogy milyen karakter hat\u00e1rokhoz (indexek) viszony\u00edtva akarom ezt megkapni. Melyikt\u0151l kezdj\u00fck, \u00e9s melyik <strong>el\u0151tt<\/strong> fejezz\u00fck be. Ha csak a kezd\u0151 poz\u00edci\u00f3t adjuk meg, akkor onnant\u00f3l a StringBuilder v\u00e9g\u00e9ig az eg\u00e9szet megkapjuk. A substring() mindig String t\u00edpus\u00fa eredm\u00e9nyt ad vissza.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\nSystem.out.println( sb.substring(0,5) ); \/\/ abrak\r\nSystem.out.println( sb.substring(2,5) ); \/\/ rak\r\nSystem.out.println( sb.substring(5,8) ); \/\/ ada\r\nSystem.out.println( sb.substring(6) );\u00a0\u00a0 \/\/ dabra\r\nSystem.out.println( sb.substring(sb.length()) ); \/\/ mindig \u00fcres\r\n<\/pre>\n<p>Ezek a met\u00f3dusok nagyon ismer\u0151sek lehetnek, felt\u00e9ve, ha olvastad a <a title=\"Java programoz\u00e1s 15. \u2013 String\" href=\"http:\/\/www.webotlet.hu\/?p=619\">String<\/a> t\u00e9mak\u00f6rt. Megmondom \u0151szint\u00e9n m\u00e9g a magyar\u00e1zatokat is szinte egy az egyben a onnan vettem \u00e1t, mert eddig a pontig a k\u00e9t oszt\u00e1ly nagyon hasonl\u00f3.<\/p>\n<p>J\u00f6jjenek akkor azok a met\u00f3dusok, melyek a StringBuilder igazi erej\u00e9t adj\u00e1k. Azok, melyek a StringBuilder tartalm\u00e1t megv\u00e1ltoztatj\u00e1k. Nagyon fontos, hogy ezek val\u00f3ban az eredeti tartalmat m\u00f3dos\u00edtj\u00e1k, onnant\u00f3l, ami el\u0151z\u0151leg volt benne, m\u00e1r nem kaphatjuk vissza.<\/p>\n<h4>Hozz\u00e1f\u0171z\u00e9s a StringBuilder v\u00e9g\u00e9hez &#8211; append()<\/h4>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(); \/\/ \u00fcres StringBuilder\r\nsb.append(1);\r\nsb.append(2.0);\r\nsb.append(2.0f);\r\nsb.append(1L);\r\nsb.append(true);\r\nsb.append('c');\r\nsb.append(&quot;Bela&quot;);\r\nsb.append(sb);\r\nsb.append(&quot;abcd&quot;.toCharArray());\r\nSystem.out.println(sb);\r\n<\/pre>\n<p>A StringBuilder-t az .append() met\u00f3dussal lehet b\u0151v\u00edteni, ezzel tudunk hozz\u00e1f\u0171zni a v\u00e9g\u00e9hez b\u00e1rmit. A b\u00e1rmit szinte t\u00e9nyleg b\u00e1rmit, mert hozz\u00e1f\u0171znival\u00f3juk az \u00f6sszes primit\u00edv t\u00edpust. Igen, boolean-t is, karaktert is! Ezen k\u00edv\u00fcl Stringet, StringBuilder-t, karaktert\u00f6mb\u00f6t\u00a0 is hozz\u00e1f\u0171zhet\u00fcnk. Amikor egy Stringet menet k\u00f6zben kell fel\u00e9p\u00edteni, akkor StringBuilder-t haszn\u00e1lunk, mert ez a legtakar\u00e9kosabb, \u00e9s leggyorsabb megold\u00e1s. Az egy dolog, hogy ennek a p\u00e9ld\u00e1nak ebben a form\u00e1ban nem sok \u00e9rtelme van, puszt\u00e1n azt akartam bemutatni, hogy t\u00e9nyleg minden hozz\u00e1f\u0171zhet\u0151. A l\u00e9nyeg teh\u00e1t:<\/p>\n<p>A StringBuilder-t szinte b\u00e1rmivel b\u0151v\u00edtheted az .append() met\u00f3dussal.<\/p>\n<p>L\u00e1thattad, hogy az eredm\u00e9nyt k\u00f6zvetlen\u00fcl ki lehet \u00edratni. De amikor az \u00f6sszef\u0171z\u00f6tt eredm\u00e9nyt Stringk\u00e9nt szeretn\u00e9d tov\u00e1bb haszn\u00e1lni, akkor a m\u00e1r ismer\u0151s toString() met\u00f3dusra van sz\u00fcks\u00e9ged:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(); \/\/ \u00fcres StringBuilder\r\nsb.append(1);\r\nsb.append(true);\r\nsb.append(&quot;Bela&quot;);\r\n\r\nString s = sb.toString(); \/\/ &quot;1trueBela&quot;\r\n<\/pre>\n<h4>Besz\u00far\u00e1s StringBuilder-be &#8211; insert()<\/h4>\n<p>A StringBuilder b\u0151v\u00edt\u00e9se nem csak annyit jelent, hogy hozz\u00e1f\u0171z\u00fcnk valamit a v\u00e9g\u00e9hez, hanem lehet\u0151s\u00e9g\u00fcnk van arra, hogy tetsz\u0151leges helyre illessz\u00fcnk be dolgokat. A besz\u00far\u00e1s term\u00e9szetesen azt jelenti, hogy ha valahova besz\u00farunk, akkor a besz\u00far\u00e1s pontja ut\u00e1ni dolgok h\u00e1tr\u00e9bb tol\u00f3dnak, de a legfontosabb az, hogy ezzel nem nek\u00fcnk kell foglalkozni.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\n\r\nSystem.out.println( sb );\r\nsb.insert(0,&quot;ABR&quot;); \/\/ besz\u00far\u00e1s az elej\u00e9re\r\nSystem.out.println( sb );\r\nsb.insert(1,&quot;B&quot;); \/\/ besz\u00far\u00e1s adott helyre\r\nSystem.out.println( sb );\r\nsb.insert( 5, &quot;ZABRA&quot;);\r\nSystem.out.println( sb );\r\nsb.insert( sb.length(), &quot;A&quot;); \/\/ besz\u00far\u00e1s a v\u00e9g\u00e9re\r\nSystem.out.println( sb );\r\n<\/pre>\n<p>Besz\u00farni egy\u00e9bk\u00e9nt az append() met\u00f3dushoz hasonl\u00f3an szinte b\u00e1rmit lehet. Amiket az append()-del hozz\u00e1f\u0171zhet\u00fcnk a StringBuilder-hez, azt az insert()-tel be is sz\u00farhatjuk b\u00e1rhova. A k\u00fcl\u00f6nbs\u00e9g annyi, hogy az insert() eset\u00e9n el\u0151sz\u00f6r a besz\u00far\u00e1s hely\u00e9t kell megadni. Az is nyilv\u00e1nval\u00f3, hogy az append() voltak\u00e9pp az insert() egy speci\u00e1lis esete:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\nsb.insert( sb.length(), &quot;A&quot;); \/\/ besz\u00far\u00e1s a v\u00e9g\u00e9re\r\n\r\n\/\/ ugyanez\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\nsb.append(&quot;A&quot;);\r\n<\/pre>\n<h4>StringBuilder egy r\u00e9sz\u00e9nek t\u00f6rl\u00e9se &#8211; delete()<\/h4>\n<p>El\u0151fordulhat, hogy egy StringBuilder-b\u0151l valamilyen r\u00e9szt egyszer\u0171en ki kell t\u00f6r\u00f6lni.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;Kiss Bela Jozsef&quot;);\r\nsb.delete( 5, 10 );\r\nSystem.out.println( sb );\r\n\r\nsb = new StringBuilder(&quot;Kiss Bela Jozsef&quot;);\r\nsb.delete( 9, sb.length() );\r\nSystem.out.println( sb );\r\n<\/pre>\n<p>A t\u00f6rl\u00e9skor meg kell adni, hogy melyik karaktert\u0151l kezd\u0151d\u0151en t\u00f6rl\u00fcnk, valamint meg kell adni, hogy melyik karakter <strong>el\u0151tt<\/strong> fejezz\u00fck be. Ha egy StringBuilder v\u00e9g\u00e9r\u0151l akarunk t\u00f6r\u00f6lni, akkor a m\u00e1sodik p\u00e9lda alapj\u00e1n oldhatjuk meg. Megadjuk, hogy honnan kezdj\u00fck, \u00e9s megadjuk, hogy a StringBuilder hossza el\u0151tt (vagyis az utols\u00f3 karakterrel bez\u00e1r\u00f3lag) fejezz\u00fck be a t\u00f6rl\u00e9st.<\/p>\n<h4>StringBuilder adott karakter\u00e9nek t\u00f6rl\u00e9se &#8211; deleteCharAt()<\/h4>\n<p>Az el\u0151z\u0151 met\u00f3dushoz hasonl\u00f3an ez is t\u00f6r\u00f6l a StringBuilder tartalm\u00e1b\u00f3l, de ez csak egy adott helyen l\u00e9v\u0151 karaktert. Term\u00e9szetesen ez \u00fagy t\u00f6r\u00f6l, hogy a m\u00f6g\u00f6tte l\u00e9v\u0151 karakterek eggyel el\u0151r\u00e9bb l\u00e9pnek a sorban.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\nsb.deleteCharAt( 0 ); \/\/ els\u0151 karakter t\u00f6rl\u00e9se\r\nsb.deleteCharAt( 4 ); \/\/ 4-es index\u0171 karakter t\u00f6rl\u00e9se\r\nsb.deleteCharAt( 4 ); \/\/ az \u00faj 4-es index\u0171 karakter t\u00f6rl\u00e9se\r\nsb.deleteCharAt( sb.length()-1 ); \/\/ utols\u00f3 karakter t\u00f6rl\u00e9se\r\n<\/pre>\n<p>Ha t\u00f6bb egym\u00e1s melletti karaktert szeretn\u00e9nk t\u00f6r\u00f6lni, akkor c\u00e9lszer\u0171bb a delete() met\u00f3dust haszn\u00e1lni, ahol megadhatjuk a t\u00f6rlend\u0151 karakterek intervallum\u00e1t. De ha a k\u00e9t els\u0151 karaktert szeretn\u00e9nk t\u00f6r\u00f6lni, ak\u00e1r a k\u00f6vetkez\u0151 m\u00f3dszert is haszn\u00e1lhatjuk:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\nsb.deleteCharAt( 0 ); \/\/ els\u0151 karakter t\u00f6rl\u00e9se\r\nsb.deleteCharAt( 0 ); \/\/ az eredetileg m\u00e1sodik karakter t\u00f6rl\u00e9se\r\n\r\n\/\/ helyette ez is szerepelhet\r\nsb.delete( 0, 2 ); \/\/ az els\u0151 k\u00e9t karakter t\u00f6rl\u00e9se\r\n<\/pre>\n<h4>StringBuilder adott karakter\u00e9nek megv\u00e1ltoztat\u00e1sa &#8211; setCharAt()<\/h4>\n<p>Amikor egy StringBuilder-ben valamit meg akarunk v\u00e1ltoztatni, akkor ezt ak\u00e1r karakterenk\u00e9nt is megtehetj\u00fck. Ez a met\u00f3dus valahol a charAt() p\u00e1rja, de am\u00edg a charAt() csak visszaadja a StringBuilder adott karakter\u00e9t, addig a setCharAt() met\u00f3dussal egy adott index\u0171 karaktert tudunk megv\u00e1ltoztatni valami m\u00e1sra. Az indexnek nyilv\u00e1n val\u00f3snak kell lenni, \u00e9s itt is haszn\u00e1lhat\u00f3k azok a sablonok, amelyeket a charAt() eset\u00e9n megismerhett\u00e9l. A met\u00f3dusnak meg kell adni a cser\u00e9lni k\u00edv\u00e1nt karakter index\u00e9t, \u00e9s azt, hogy mire akarod azt kicser\u00e9lni. Fontos, hogy csak karakter t\u00edpusra cser\u00e9lhetsz!<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;abrakadabra&quot;);\r\nsb.setCharAt( 0, 'A' ); \/\/ els\u0151 karakter megv\u00e1ltoztat\u00e1sa\r\nsb.setCharAt( 4, 'C' ); \/\/ 4-es index\u0171 karakter megv\u00e1ltoztat\u00e1sa\r\nsb.setCharAt( 4 'G' ); \/\/ az \u00faj 4-es index\u0171 karakter megv\u00e1ltoztat\u00e1sa\r\nsb.setCharAt( sb.length()-1, 'A' ); \/\/ utols\u00f3 karakter megv\u00e1ltoztat\u00e1sa\r\n<\/pre>\n<h4>StringBuilder adott r\u00e9sz\u00e9nek kicser\u00e9l\u00e9se &#8211; replace()<\/h4>\n<p>Mindenek el\u0151tt arra h\u00edvn\u00e1m fel a figyelmet, hogy <strong>ez a met\u00f3dus csak nev\u00e9ben hasonl\u00edt a String oszt\u00e1ly replace() met\u00f3dus\u00e1ra<\/strong>, teljesen m\u00e1shogy m\u0171k\u00f6dik! Itt egy karakter intervallumot kell megadni, ami azt jelenti, hogy mett\u0151l-meddig akarod a StringBuilder adott r\u00e9sz\u00e9t kicser\u00e9lni valamilyen Stringre. Az intervallum megad\u00e1sa ugyan\u00fagy t\u00f6rt\u00e9nik, mint a substring() vagy delete() met\u00f3dusokn\u00e1l, vagyis megadott, hogy melyik karaktert\u0151l kezd\u0151d\u0151en \u00e9s melyik karakter <strong>el\u0151ttig<\/strong> tartson az a r\u00e9sz, amit kicser\u00e9lsz a 3. param\u00e9terk\u00e9nt megadott Stringre. L\u00e1ssunk akkor p\u00e9ld\u00e1kat:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nStringBuilder sb = new StringBuilder(&quot;Kiss Janos Jozsef&quot;);\r\nSystem.out.println( sb );\r\n\r\nsb.replace(0, 4, &quot;Nagy&quot;);\r\nSystem.out.println( sb ); \/\/ Nagy Janos Jozsef\r\n\r\nsb.replace(0, 4, &quot;Kovacs&quot;);\r\nSystem.out.println( sb ); \/\/ Kovacs Janos Jozsef\r\n\r\nsb.replace(7, 12, &quot;Pal&quot;); \/\/ Kovacs Pal Jozsef\r\nSystem.out.println( sb );\r\n<\/pre>\n<p>A p\u00e9ldaprogramban oda\u00edrtam az eredm\u00e9nyeket, de ett\u0151l f\u00fcggetlen\u00fcl n\u00e9h\u00e1ny dolgot kiemeln\u00e9k:<\/p>\n<ol>\n<li>Nem kell azzal foglalkoznod, hogy amit kicser\u00e9lsz ugyanolyan hossz\u00fa legyen, mint amire kicser\u00e9led.<\/li>\n<li>Ha egy r\u00f6videbb r\u00e9szt hosszabbra cser\u00e9lsz (l\u00e1sd 2. csere), akkor a hosszabb \u00faj r\u00e9sz od\u00e9bb tolja az ut\u00e1na l\u00e9v\u0151ket: Nagy -&gt; Kovacs<\/li>\n<li>Ha hosszabb r\u00e9szt cser\u00e9lsz r\u00f6videbbre (l\u00e1sd 3. csere), akkor a r\u00f6videbb \u00faj r\u00e9sz el\u0151r\u00e9bb h\u00fazza a m\u00f6g\u00f6tte l\u00e9v\u0151ket: Janos -&gt; Pal<\/li>\n<\/ol>\n<h4>StringBuilder megford\u00edt\u00e1sa &#8211; reverse()<\/h4>\n<p>Nem egy feladatban el\u0151fordul az, hogy egy String tartalm\u00e1t meg kell ford\u00edtani.<\/p>\n<p>Stringekkel ez a feladat a k\u00f6vetkez\u0151k\u00e9ppen n\u00e9z ki, felt\u00e9ve, hogy ismerj\u00fck a Stringeket:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nString s1 = &quot;abrakadabra&quot;;\r\nString s2 = &quot;&quot;;\r\n\r\nfor( int i = s1.length()-1; i &gt; -1; i-- )\r\n{\r\n\u00a0 s2 = s2.concat(s1.charAt(i)+&quot;&quot;);\r\n}\r\nSystem.out.println(s2);\r\n<\/pre>\n<p>Vagy esetleg \u00edgy:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nString s1 = &quot;abrakadabra&quot;;\r\nString s2 = &quot;&quot;;\r\n\r\nfor( int i = 0; i&lt; s1.length(); i++ )\r\n{\r\n\u00a0 s2 = s2.concat(s1.charAt(s1.length()-i-1)+&quot;&quot;);\r\n}\r\nSystem.out.println(s2);\r\n<\/pre>\n<p>A l\u00e9nyeg az, hogy ez egy el\u00e9g \u00e9rdekes feladat. Persze a concat() n\u00e9lk\u00fcl is megcsin\u00e1lhatod a += oper\u00e1torral, de megbesz\u00e9lt\u00fck, hogy akkor \u00faj String objektumok j\u00f6nnek l\u00e9tre, melyeket ut\u00e1na mag\u00e1ra fog hagyni a rendszer, \u00e9s ha hossz\u00fa a String akkor m\u00e9g lass\u00fa is lesz:<\/p>\n<p>De hogy n\u00e9z ez ki StringBuilder-rel.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nString s = &quot;abrakadabra&quot;;\r\nStringBuilder sb = new StringBuilder(s);\r\nsb.reverse();\r\nSystem.out.println( sb );\r\n<\/pre>\n<p>A .reverse() met\u00f3dus b\u00e1rmilyen StringBuilder tartalm\u00e1t megford\u00edtja \u00e9s ut\u00e1na azt \u00fagy haszn\u00e1ljuk, ahogy akarjuk. Kicsit egyszer\u0171bb, nem?<\/p>\n<h4>StringBuilder m\u00e9ret\u00e9nek be\u00e1ll\u00edt\u00e1sa &#8211; setLength()<\/h4>\n<p>A StringBuilder m\u00e9rete ak\u00e1r k\u00f6zvetlen\u00fcl is be\u00e1ll\u00edthat\u00f3 a setLength() met\u00f3dussal. A met\u00f3dus egyetlen param\u00e9tere egy nem negat\u00edv sz\u00e1m, mely azt jelenti, hogy mekkora m\u00e9ret\u0171re szeretn\u00e9nk be\u00e1ll\u00edtani a StringBuilder m\u00e9ret\u00e9t.<\/p>\n<ul>\n<li>Ha a m\u00e9rete kisebb, mint a tartalom, ami jelenleg benne tal\u00e1lhat\u00f3, akkor a StringBuilder-ben l\u00e1v\u0151 tartalom csonkol\u00f3dik, vagyis a m\u00e9reten fel\u00fcli r\u00e9szek t\u00f6rl\u0151dnek.<\/li>\n<li>Ha a megadott m\u00e9ret nagyobb, mint az eddigi, akkor az \u00fagynevezett null karakterrel t\u00f6lti ki a tartalommal nem rendelkez\u0151 \u00faj r\u00e9szt a megadott m\u00e9retig.<\/li>\n<\/ul>\n<p>A m\u00e9ret be\u00e1ll\u00edt\u00e1sa nem jelenti azt, hogy a StringBuilder nem b\u0151v\u00edthet\u0151, ezut\u00e1n is azt csin\u00e1lunk vele, amit akarunk. Ha azonban a m\u00e9ret b\u0151v\u00edt\u00e9s sor\u00e1n null karakterek ker\u00fcltek a v\u00e9g\u00e9re, akkor ha mondjuk append()-del b\u0151v\u00edtj\u00fck, akkor minden a null karakterek ut\u00e1n ker\u00fcl a StringBuilder v\u00e9g\u00e9re.<\/p>\n<p>Egy sz\u00f3, mint sz\u00e1z, l\u00e1thatod, hogy a StringBuilder kifejezetten arra val\u00f3, hogy a Stringeket manipul\u00e1ljuk, megv\u00e1ltoztassuk, vagy ak\u00e1r csak t\u00f6bb l\u00e9p\u00e9sben fel\u00e9p\u00edts\u00fck. Bizonyos manipul\u00e1ci\u00f3kat sokkal-sokkal hat\u00e9konyabban meg tudunk oldani vele, mint Stringekkel. El\u00e9g ha csak a besz\u00far\u00e1sra, \u00e9s t\u00f6rl\u00e9sre gondolunk, melyeket Stringekkel megval\u00f3s\u00edtani nemcsak bonyolultabb, hanem j\u00f3val lassabb is.<\/p>\n<p>Term\u00e9szetesen a StringBuilder-n\u00e9l is azt az elvet vallom, mint amit a t\u00f6mb\u00f6ket helyettes\u00edt\u0151 list\u00e1kkal kapcsolatban szoktam mondani:<\/p>\n<p>Csak akkor haszn\u00e1ld, ha m\u00e1r a Stringeket nagyon j\u00f3l ismered, \u00e9s haszn\u00e1lod, mert csak akkor fogod meg\u00e9rteni a StringBuilder igazi erej\u00e9t, \u00e9s akkor fogod tudni, mikor kell a Stringek helyett haszn\u00e1lni.<\/p>\n<h4>K\u00f6vetkez\u0151 lecke: <a title=\"Java programoz\u00e1s 20. \u2013 ArrayList\" href=\"http:\/\/www.webotlet.hu\/?p=775\">ArrayList<\/a><\/h4>\n","protected":false},"excerpt":{"rendered":"<p>StringBuilder, avagy String kezel\u00e9s profiknak A String megv\u00e1ltoztathatatlan. Ez t\u00e9ny. Ha m\u00e9gis m\u00f3dos\u00edtjuk, akkor egy \u00faj Stringet hozunk l\u00e9tre, az el\u0151z\u0151t meg mag\u00e1ra hagyjuk. Ez 1-2 l\u00e9p\u00e9s eset\u00e9n nem t\u00fal nagy gond, de amikor egy Stringet sokszor kell megv\u00e1ltoztatni, vagy <a class=\"more-link\" href=\"https:\/\/www.webotlet.hu\/?p=937\">Tov\u00e1bb <span class=\"screen-reader-text\">  Java programoz\u00e1s 19. &#8211; StringBuilder<\/span><span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[100],"tags":[144,143,46],"class_list":["post-937","post","type-post","status-publish","format-standard","hentry","category-java-halado-leckek","tag-java_programozas","tag-programozas","tag-stringbuilder"],"_links":{"self":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/937","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=937"}],"version-history":[{"count":31,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/937\/revisions"}],"predecessor-version":[{"id":1409,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/937\/revisions\/1409"}],"wp:attachment":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=937"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=937"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=937"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}