package Ġcom . t ib agn i . log viewer . util Ċ Ċ /** Ċ Ġ* ĠTrack s Ġthe Ġlocation Ġof Ġa Ġsub sequence Ġin Ġa Ġparent ĠString . ĠUsed Ġto Ġavoid Ġexcess ive Ġcopies Ċ Ġ* Ġof ĠStrings Ġwhen Ġprocessing Ġlarge Ġdata . ĠUse Ġof ĠString View Ġinstead Ġof Ġcreating Ġsub strings Ġof Ġthe Ġoriginal Ġstring Ċ Ġ* Ġis Ġmuch Ġmore Ġefficient Ġas Ġit Ġwill Ġwork Ġon Ġthe Ġoriginal ĠString Ġonly , Ġno Ġadditional Ġmemory Ġwill Ġbe Ġcreated Ċ Ġ* Ċ Ġ* ĠThis Ġcode Ġis Ġbased Ġon ĠString View . java Ġfrom ĠSquare space ĠTemplate ĠCompiler Ċ Ġ* Ġ( https :// github . com / Square space / template - compiler ) Ċ Ġ*/ Ċ class ĠString View ( private Ġval Ġoriginal : ĠString , Ġprivate Ġval Ġstart : ĠInt , Ġprivate Ġval Ġend : ĠInt ) Ġ: ĠCharSequence Ġ{ ĊĠ Ġprivate Ġvar Ġ_ hash Val Ġ= Ġ 0 ĊĊĠ Ġ// ĠLet 's Ġnot Ġcreate Ġa Ġnew ĠString Ġevery time Ġthis Ġis Ġinvoked ĊĠ Ġ// Ġand Ġmake Ġsure Ġto Ġonly Ġreally Ġcreate Ġa Ġstring Ġrepresentation ĊĠ Ġ// Ġwhen Ġabsolutely Ġnecessary ĊĠ Ġprivate Ġval Ġstr Repr : ĠString Ġby Ġlazy Ġ{ Ġoriginal . substring ( start , Ġend ) Ġ} ĊĊĠ Ġoverride Ġval Ġlength : ĠInt ĊĠĠĠ Ġget () Ġ= Ġend Ġ- Ġstart ĊĊĠ Ġfun Ġsub String View ( startIndex : ĠInt , Ġend Index : ĠInt ) Ġ= ĠString View ( original , Ġstart Ġ+ ĠstartIndex , Ġstart Ġ+ Ġend Index ) ĊĊĠ Ġfun Ġsub String View ( startIndex : ĠInt ) Ġ= ĠString View ( original , Ġstart Ġ+ ĠstartIndex , Ġend ) ĊĊĠ Ġoverride Ġfun Ġget ( index : ĠInt ) Ġ= Ġoriginal [ start Ġ+ Ġindex ] ĊĊĠ Ġoverride Ġfun Ġsub Sequence ( startIndex : ĠInt , Ġend Index : ĠInt ) Ġ= Ġsub String View ( startIndex , Ġend Index ) ĊĊĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠ Ġother Ġas ĠString View ĊĊĠĠĠ Ġif Ġ( length Ġ!= Ġother . length ) Ġreturn Ġfalse ĊĊĠĠĠ Ġval Ġs 1 : ĠString Ġ= Ġoriginal ĊĠĠĠ Ġval Ġs 2 : ĠString Ġ= Ġother . original ĊĠĠĠ Ġvar Ġstart 1 Ġ= Ġstart ĊĠĠĠ Ġvar Ġstart 2 : ĠInt Ġ= Ġother . start ĊĠĠĠ Ġwhile Ġ( start 1 Ġ< Ġend Ġ&& Ġstart 2 Ġ< Ġother . end ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( s 1 [ start 1 ] Ġ!= Ġs 2 [ start 2 ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġstart 1 ++ ĊĠĠĠĠĠ Ġstart 2 ++ ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠ Ġif Ġ(_ hash Val Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġvar Ġh Ġ= Ġ 0 x 0 1 0 0 0 1 9 3 ĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġstart Ġuntil Ġend ) Ġ{ ĊĠĠĠĠĠĠĠ Ġh Ġ= Ġ 3 1 Ġ* Ġh Ġ+ Ġoriginal [ i ]. toInt () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( h Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġh ++ ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ_ hash Val Ġ= Ġh ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ_ hash Val ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġstr Repr ĊĠ Ġ} Ċ }