{"id":265,"date":"2004-11-29T04:00:00","date_gmt":"2004-11-29T11:00:00","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=265"},"modified":"2004-11-29T04:00:00","modified_gmt":"2004-11-29T11:00:00","slug":"echando-codigo-usando-referencias-debiles-en-java","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2004\/11\/29\/echando-codigo-usando-referencias-debiles-en-java\/","title":{"rendered":"Echando c\u00f3digo: Usando &#8216;referencias d\u00e9biles&#8217; en Java"},"content":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/java.sun.com\/im\/logo_java.gif\" \/><br \/>\n<br \/>Java tiene desde hace tiempo (Java 2 para seer exacto) el concepto de &#8216;referencias d\u00e9biles&#8217;. Su uso nos puede permitir mejorar el uso de la memoria en nuestra aplicaci\u00f3n y en ciertos casos mejorar su desepe\u00f1o.<\/p>\n<p>Suponga que tenemos un programa que lee desde un archivo de texto una serie de l\u00edneas, cada una de ellas con un flujo de caja y una tasa de inter\u00e9s justo al final. El programa toma toda esta informaci\u00f3n y procede a imprimir el valor neto presente (NPV) por pantalla. Usando la clase &#8216;BigDecimal&#8217; nos aseguramos de que el c\u00e1lculo es exacto hasta el \u00faltimo decimal, pero tambi\u00e9n sabemos esta clase es m\u00e1s lenta que usar un dato de tipo double directamente.<\/p>\n<p>El archivo de ejemplo luce como esto:<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutter\">   2:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutter\">   3:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutter\">   4:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutterH\">   5:<\/span>10000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutter\">   6:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutter\">   7:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutter\">   8:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutter\">   9:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutterH\">  10:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutter\">  11:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutter\">  12:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutter\">  13:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutter\">  14:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutterH\">  15:<\/span><....omitiendo lineas repet\u00eddas....>\n<br \/><span class=\"gutter\">  98:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.7\n<br \/><span class=\"gutter\">  99:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><span class=\"gutterH\"> 100:<\/span>-1000.0, 500.0, 400.0, 300.0, 200.0, 100.0,0.5\n<br \/><\/pre>\n<p>El c\u00f3digo de el programa que hace el c\u00e1lculo:<\/p>\n<p>Y por supuesto en mi estilo perezoso, un peque\u00f1o script para llamar a  mi programa de Java:<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax2\">#!<\/span><span class=\"syntax2\">\/bin\/bash<\/span>\n<br \/><span class=\"gutter\">   2:<\/span>declare -r <span class=\"syntax9\">FLAGS<\/span>=<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">\"<\/span>\n<br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax9\">CLASSPATH<\/span>=<span class=\"syntax13\">\"<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">CLASSPATH<\/span><span class=\"syntax13\">:<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">home<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">josevnz<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">java<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">effective<\/span><span class=\"syntax13\">:<\/span><span class=\"syntax13\">.<\/span><span class=\"syntax13\">\"<\/span>\n<br \/><span class=\"gutter\">   4:<\/span>exec java -classpath <span class=\"syntax9\">$<\/span><span class=\"syntax9\">CLASSPATH<\/span> <span class=\"syntax9\">$<\/span><span class=\"syntax9\">FLAGS<\/span> com.blogspot.elangelnegro.math.NPV <span class=\"syntax9\">$<\/span><span class=\"syntax9\">1<\/span> <span class=\"syntax9\">$<\/span><span class=\"syntax9\">2<\/span>\n<br \/><\/pre>\n<p>La salida del programa en su primera version. Note los valores de consumo de memoria y tiempo de ejecuci\u00f3n:<\/p>\n<blockquote style=\"font-family: courier new;\"><p>[josevnz@localhost effective]$ .\/NPV.sh NPV.data nc<br \/>\n<br \/><span style=\"font-weight: bold;\">Used memory: 153928<\/span><br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: 10652.7<br \/>\n<br \/>&#8230;.<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -475.5<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/><span style=\"font-weight: bold;\">Used memory: 155688<\/span><br \/>\n<br \/><span style=\"font-weight: bold;\">Execution time: 1030 miliseconds<\/span><br \/>\n<br \/>[josevnz@localhost effective]$<\/p><\/blockquote>\n<p>\u00bfQu\u00e9 se puede hacer para mejorar el desempe\u00f1o?. Bueno, una teor\u00eda dice que si las entradas de una r\u00fatina son las mismas y el resultado que se produce es el mismo, entonces pudieramos colocarlo en un <span style=\"font-style: italic;\">cach\u00e9<\/span>; El problema aqu\u00ed es como decidir que tama\u00f1o es el adecuado para el cach\u00e9. Java cuenta con un tipo de referencias &#8216;debiles&#8217; las cuales son reclamadas por el recolector de basura de la m\u00e1quina virtual si no hay nadie usandola. En este caso podemos usar un &#8216;<a href=\"http:\/\/java.sun.com\/j2se\/1.4.2\/docs\/api\/java\/lang\/ref\/WeakReference.html\">WeakHashMap<\/a>&#8216; y le dejamos a Java la tarea de decidir que referencias eliminar (en teor\u00eda la eliminaci\u00f3n de las referencias ocurre cuando llamamos cualquier m\u00e9todo en esta clase).<\/p>\n<p>Lo que hacemos ahora es proporcionarle una referencia a un <span style=\"font-family:courier new;\">java.lang.ref.WeakHashMap<\/span> a un m\u00e9todo &#8216;wrapper&#8217; el cual verificar\u00e1 si el resultado ya fu\u00e9 calculado. De ser as\u00ed, retornamos el valor inmediatamente, de lo contrario, lo calculamos, lo guardamos en el cach\u00e9 y entonces lo retornamos a quien nos llama:<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax9\">package<\/span> com.blogspot.elangelnegro.math;\n<br \/><span class=\"gutter\">   2:<\/span>\n<br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax9\">import<\/span> java.math.BigDecimal;\n<br \/><span class=\"gutter\">   4:<\/span>\n<br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax9\">import<\/span> java.io.IOException;\n<br \/><span class=\"gutter\">   6:<\/span><span class=\"syntax9\">import<\/span> java.io.FileReader;\n<br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax9\">import<\/span> java.io.BufferedReader;\n<br \/><span class=\"gutter\">   8:<\/span>\n<br \/><span class=\"gutter\">   9:<\/span><span class=\"syntax9\">import<\/span> java.lang.ref.WeakReference;\n<br \/><span class=\"gutterH\">  10:<\/span><span class=\"syntax9\">import<\/span> java.util.Map;\n<br \/><span class=\"gutter\">  11:<\/span><span class=\"syntax9\">import<\/span> java.util.HashMap;\n<br \/><span class=\"gutter\">  12:<\/span>\n<br \/><span class=\"gutter\">  13:<\/span><span class=\"syntax3\">\/**<\/span>\n<br \/><span class=\"gutter\">  14:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">This<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">class<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">shows<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">how<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">use<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">BigDecimal<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">class<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">for<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">numeric<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">calculation<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">that<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">require<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">be<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">exact<\/span><span class=\"syntax3\">.<\/span>\n<br \/><span class=\"gutterH\">  15:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">This<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">particular<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">class<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">implements<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">formula<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">of<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">present<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">value<\/span>\n<br \/><span class=\"gutter\">  16:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">ul<\/span><span class=\"syntax17\">&gt;<\/span>\n<br \/><span class=\"gutter\">  17:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">li<\/span><span class=\"syntax17\">&gt;<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">http<\/span><span class=\"syntax3\">:<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">www<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">investopedia<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">com<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">articles<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">03<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">101503<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">asp<\/span>\n<br \/><span class=\"gutter\">  18:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">li<\/span><span class=\"syntax17\">&gt;<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">http<\/span><span class=\"syntax3\">:<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">www<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">developer<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">com<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">java<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">other<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">article<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">php<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">631281<\/span>\n<br \/><span class=\"gutter\">  19:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">li<\/span><span class=\"syntax17\">&gt;<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">http<\/span><span class=\"syntax3\">:<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">www<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">developer<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">com<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">java<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">article<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">php<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">788311<\/span>\n<br \/><span class=\"gutterH\">  20:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">ul<\/span><span class=\"syntax17\">&gt;<\/span>\n<br \/><span class=\"gutter\">  21:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@author<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Jose<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Vicente<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Nunez<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Zuleta<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">(<\/span><span class=\"syntax3\">josevnz@yahoo<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">com<\/span><span class=\"syntax3\">)<\/span>\n<br \/><span class=\"gutter\">  22:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@version<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">0<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">1<\/span>\n<br \/><span class=\"gutter\">  23:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span>\n<br \/><span class=\"gutter\">  24:<\/span><span class=\"syntax8\">public<\/span> <span class=\"syntax8\">final<\/span> <span class=\"syntax10\">class<\/span> NPV <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutterH\">  25:<\/span>  \n<br \/><span class=\"gutter\">  26:<\/span>        <span class=\"syntax3\">\/**<\/span>\n<br \/><span class=\"gutter\">  27:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Constant<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">used<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">on<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">calculation<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">of<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">NPV<\/span>\n<br \/><span class=\"gutter\">  28:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span>\n<br \/><span class=\"gutter\">  29:<\/span>        <span class=\"syntax8\">private<\/span> <span class=\"syntax8\">static<\/span> <span class=\"syntax8\">final<\/span> BigDecimal ONE <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">BigDecimal<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">1.0<\/span><span class=\"syntax13\">\"<\/span>);\n<br \/><span class=\"gutterH\">  30:<\/span>  \n<br \/><span class=\"gutter\">  31:<\/span>        <span class=\"syntax3\">\/**<\/span>\n<br \/><span class=\"gutter\">  32:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">A<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">primitive<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">way<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">calculate<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">power<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">of<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">a<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">number<\/span><span class=\"syntax3\">.<\/span>\n<br \/><span class=\"gutter\">  33:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@param<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">number<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">number<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">multiply<\/span>\n<br \/><span class=\"gutter\">  34:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@param<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">power<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">How<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">many<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">times<\/span>\n<br \/><span class=\"gutterH\">  35:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@return<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">The<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">number<\/span>\n<br \/><span class=\"gutter\">  36:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span>\n<br \/><span class=\"gutter\">  37:<\/span>        <span class=\"syntax8\">private<\/span> <span class=\"syntax8\">static<\/span> BigDecimal <span class=\"syntax6\">power<\/span>(BigDecimal number, <span class=\"syntax10\">int<\/span> power) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\">  38:<\/span>                        BigDecimal powerc <span class=\"syntax18\">=<\/span> number;\n<br \/><span class=\"gutter\">  39:<\/span>                        <span class=\"syntax8\">for<\/span> (<span class=\"syntax10\">int<\/span> j<span class=\"syntax18\">=<\/span><span class=\"syntax5\">1<\/span>; j <span class=\"syntax18\">&lt;<\/span> power; j<span class=\"syntax18\">+<\/span><span class=\"syntax18\">+<\/span>) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutterH\">  40:<\/span>                                powerc <span class=\"syntax18\">=<\/span> powerc.<span class=\"syntax6\">multiply<\/span>(number);\n<br \/><span class=\"gutter\">  41:<\/span>                        <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\">  42:<\/span>                        <span class=\"syntax8\">return<\/span> powerc;\n<br \/><span class=\"gutter\">  43:<\/span>        <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\">  44:<\/span>  \n<br \/><span class=\"gutterH\">  45:<\/span>        <span class=\"syntax8\">private<\/span> <span class=\"syntax8\">static<\/span> <span class=\"syntax8\">final<\/span> IllegalArgumentException ILLEGAL_ARGUMENT_EXCEPTION <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">\n<br \/>\t\tnew<\/span> <span class=\"syntax6\">IllegalArgumentException<\/span>();\n<br \/><span class=\"gutter\">  46:<\/span>  \n<br \/><span class=\"gutter\">  47:<\/span>        <span class=\"syntax3\">\/**<\/span>\n<br \/><span class=\"gutter\">  48:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Calculate<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Net<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Present<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Value<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">for<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">a<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">given<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">set<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">of<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">CashFlows<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">and<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">\n<br \/>\t\ta<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">discount<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">rate<\/span>\n<br \/><span class=\"gutter\">  49:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@param<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">cashflows<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">The<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Cashflows<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">as<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">BigDecimal<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">objects<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">\n<br \/>\t\t<\/span><span class=\"syntax3\">cashflow<\/span><span class=\"syntax3\">[<\/span><span class=\"syntax3\">cashflows<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">length<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">-<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">1<\/span><span class=\"syntax3\">]<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">is<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">discount<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">rate<\/span>\n<br \/><span class=\"gutterH\">  50:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@return<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">The<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">discount<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">rate<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">as<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">a<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">BigDecimal<\/span>\n<br \/><span class=\"gutter\">  51:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span>\n<br \/><span class=\"gutter\">  52:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">static<\/span> BigDecimal <span class=\"syntax6\">getNPV<\/span>(String [] cashflows) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\">  53:<\/span>                BigDecimal pv <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">BigDecimal<\/span>(cashflows[<span class=\"syntax5\">0<\/span>]);\n<br \/><span class=\"gutter\">  54:<\/span>                <span class=\"syntax10\">int<\/span> length <span class=\"syntax18\">=<\/span> cashflows.length <span class=\"syntax18\">-<\/span> <span class=\"syntax5\">1<\/span>;\n<br \/><span class=\"gutterH\">  55:<\/span>                BigDecimal discountRate <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">BigDecimal<\/span>(cashflows[length]);\n<br \/><span class=\"gutter\">  56:<\/span>                <span class=\"syntax8\">for<\/span> (<span class=\"syntax10\">int<\/span> i<span class=\"syntax18\">=<\/span><span class=\"syntax5\">1<\/span>; i <span class=\"syntax18\">&lt;<\/span> length; i<span class=\"syntax18\">+<\/span><span class=\"syntax18\">+<\/span>) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\">  57:<\/span>                        pv <span class=\"syntax18\">=<\/span> pv.<span class=\"syntax6\">add<\/span>(<span class=\"syntax8\">new<\/span> <span class=\"syntax6\">BigDecimal<\/span>(cashflows[i]).<span class=\"syntax6\">divide<\/span>(\n<br \/><span class=\"gutter\">  58:<\/span>                                <span class=\"syntax6\">power<\/span>(discountRate.<span class=\"syntax6\">add<\/span>(ONE), i), BigDecimal.ROUND_HALF_EVEN)\n<br \/><span class=\"gutter\">  59:<\/span>                        );\n<br \/><span class=\"gutterH\">  60:<\/span>                <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\">  61:<\/span>                <span class=\"syntax8\">return<\/span> pv;\n<br \/><span class=\"gutter\">  62:<\/span>        <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\">  63:<\/span>  \n<br \/><span class=\"gutter\">  64:<\/span>        <span class=\"syntax3\">\/**<\/span>\n<br \/><span class=\"gutterH\">  65:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Calculate<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Net<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Present<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Value<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">for<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">a<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">given<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">set<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">of<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">CashFlows<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">and<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">a<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">discount<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">rate<\/span><span class=\"syntax3\">.<\/span>\n<br \/><span class=\"gutter\">  66:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">http<\/span><span class=\"syntax3\">:<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">www<\/span><span class=\"syntax3\">-<\/span><span class=\"syntax3\">106<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">ibm<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">com<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">developerworks<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">java<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">library<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">j<\/span><span class=\"syntax3\">-<\/span><span class=\"syntax3\">arrays<\/span><span class=\"syntax3\">\/<\/span>\n<br \/><span class=\"gutter\">  67:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@param<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">cashflows<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">The<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Cashflows<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">as<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">BigDecimal<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">objects<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">cashflow<\/span><span class=\"syntax3\">[<\/span><span class=\"syntax3\">cashflows<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">length<\/span><span class=\"syntax3\">\n<br \/>\t\t<\/span><span class=\"syntax3\">-<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">1<\/span><span class=\"syntax3\">]<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">is<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">discount<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">rate<\/span>\n<br \/><span class=\"gutter\">  68:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@param<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">cache<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">External<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">cache<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">provided<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">store<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">results<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">from<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">previous<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">\n<br \/>\t\tcalculations<\/span>\n<br \/><span class=\"gutter\">  69:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@param<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">key<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">An<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">artifically<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">created<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">key<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">NPV<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">value<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Is<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">faster<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">\n<br \/>\t\tcompare<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">a<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">String<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">than<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">a<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">whole<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">array<\/span><span class=\"syntax3\">,<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">so<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">more<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">help<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">better<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">.<\/span>\n<br \/><span class=\"gutterH\">  70:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@return<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">The<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">discount<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">rate<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">as<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">a<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">BigDecimal<\/span>\n<br \/><span class=\"gutter\">  71:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span>\n<br \/><span class=\"gutter\">  72:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">static<\/span> BigDecimal <span class=\"syntax6\">getNPV<\/span>(String [] cashflows, Map cache, String key) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\">  73:<\/span>                WeakReference ref <span class=\"syntax18\">=<\/span> (WeakReference) cache.<span class=\"syntax6\">get<\/span>(key);\n<br \/><span class=\"gutter\">  74:<\/span>                BigDecimal pv <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>;\n<br \/><span class=\"gutterH\">  75:<\/span>                <span class=\"syntax8\">if<\/span> ( ref <span class=\"syntax18\">=<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\">  76:<\/span>                        pv <span class=\"syntax18\">=<\/span> <span class=\"syntax6\">getNPV<\/span>(cashflows);\n<br \/><span class=\"gutter\">  77:<\/span>                        cache.<span class=\"syntax6\">put<\/span>(key, <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">WeakReference<\/span>(pv));\n<br \/><span class=\"gutter\">  78:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">else<\/span> <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\">  79:<\/span>                        pv <span class=\"syntax18\">=<\/span> (BigDecimal) ref.<span class=\"syntax6\">get<\/span>();\n<br \/><span class=\"gutterH\">  80:<\/span>                <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\">  81:<\/span>                <span class=\"syntax8\">return<\/span> pv;\n<br \/><span class=\"gutter\">  82:<\/span>        <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\">  83:<\/span>\n<br \/><span class=\"gutter\">  84:<\/span>        <span class=\"syntax3\">\/**<\/span>\n<br \/><span class=\"gutterH\">  85:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Command<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">line<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">entry<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">point<\/span>\n<br \/><span class=\"gutter\">  86:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@param<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">args<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">The<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">location<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">of<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">data<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">file<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Each<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">cashflow<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">is<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">separated<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">\n<br \/>\t\t\tby<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">a<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">'<\/span><span class=\"syntax3\">,<\/span><span class=\"syntax3\">'<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">and<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">last<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">number<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">is<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">interest<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">rate<\/span><span class=\"syntax3\">.<\/span>\n<br \/><span class=\"gutter\">  87:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@throws<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">IOException<\/span><span class=\"syntax3\"> <\/span>\n<br \/><span class=\"gutter\">  88:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span>\n<br \/><span class=\"gutter\">  89:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">static<\/span> <span class=\"syntax10\">void<\/span> <span class=\"syntax6\">main<\/span>(String [] args) <span class=\"syntax8\">throws<\/span> IOException <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutterH\">  90:<\/span>                BufferedReader reader <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>;\n<br \/><span class=\"gutter\">  91:<\/span>                <span class=\"syntax10\">boolean<\/span> useCache <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">false<\/span>; <span class=\"syntax2\">\n<br \/>\t\t\t\/\/<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">We<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">use<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">a<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">boolean<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">because<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">we<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">will<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">do<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">repeated<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">comparisons<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">here<\/span>\n<br \/><span class=\"gutter\">  92:<\/span>                Runtime runtime <span class=\"syntax18\">=<\/span> Runtime.<span class=\"syntax6\">getRuntime<\/span>();\n<br \/><span class=\"gutter\">  93:<\/span>                <span class=\"syntax10\">long<\/span> start <span class=\"syntax18\">=<\/span> System.<span class=\"syntax6\">currentTimeMillis<\/span>();\n<br \/><span class=\"gutter\">  94:<\/span>                HashMap cache <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>;\n<br \/><span class=\"gutterH\">  95:<\/span>                <span class=\"syntax10\">long<\/span> end <span class=\"syntax18\">=<\/span> <span class=\"syntax5\">0<\/span>;\n<br \/><span class=\"gutter\">  96:<\/span>                <span class=\"syntax10\">long<\/span> linecount <span class=\"syntax18\">=<\/span> <span class=\"syntax5\">1<\/span>;\n<br \/><span class=\"gutter\">  97:<\/span>                <span class=\"syntax8\">if<\/span> (<span class=\"syntax18\">!<\/span> ((args <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>) <span class=\"syntax18\">&<\/span><span class=\"syntax18\">&amp;<\/span> (args.length <span class=\"syntax18\">=<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax5\">2<\/span>))) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\">  98:<\/span>                        <span class=\"syntax8\">throw<\/span> ILLEGAL_ARGUMENT_EXCEPTION;\n<br \/><span class=\"gutter\">  99:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">else<\/span> <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutterH\"> 100:<\/span>                        <span class=\"syntax8\">if<\/span> (args[<span class=\"syntax5\">1<\/span>].<span class=\"syntax6\">equals<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">c<\/span><span class=\"syntax13\">\"<\/span>)) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 101:<\/span>                                useCache <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">true<\/span>;\n<br \/><span class=\"gutter\"> 102:<\/span>                                cache <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">HashMap<\/span>();\n<br \/><span class=\"gutter\"> 103:<\/span>                        <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">else<\/span> <span class=\"syntax8\">if<\/span> (args[<span class=\"syntax5\">1<\/span>].<span class=\"syntax6\">equals<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">nc<\/span><span class=\"syntax13\">\"<\/span>)) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 104:<\/span>                                useCache <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">false<\/span>;\n<br \/><span class=\"gutterH\"> 105:<\/span>                        <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">else<\/span> <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 106:<\/span>                                <span class=\"syntax8\">throw<\/span> ILLEGAL_ARGUMENT_EXCEPTION;\n<br \/><span class=\"gutter\"> 107:<\/span>                        <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\"> 108:<\/span>                        <span class=\"syntax2\">\/\/<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Show<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">memory<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">usage<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">before<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">reading<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">whole<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">file<\/span>\n<br \/><span class=\"gutter\"> 109:<\/span>                        System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Used<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">memory:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">\"<\/span> <span class=\"syntax18\">+<\/span> (runtime.<span class=\"syntax6\">totalMemory<\/span>() <span class=\"syntax18\">-<\/span>\n<br \/>\t\t\t\truntime.<span class=\"syntax6\">freeMemory<\/span>()));\n<br \/><span class=\"gutterH\"> 110:<\/span>                <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\"> 111:<\/span>                <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 112:<\/span>                        reader <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">BufferedReader<\/span>(<span class=\"syntax8\">new<\/span> <span class=\"syntax6\">FileReader<\/span>(args[<span class=\"syntax5\">0<\/span>]));\n<br \/><span class=\"gutter\"> 113:<\/span>                        <span class=\"syntax8\">for<\/span> (String line <span class=\"syntax18\">=<\/span> reader.<span class=\"syntax6\">readLine<\/span>(); line <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>; line <span class=\"syntax18\">=<\/span>\n<br \/>\t\t\t\treader.<span class=\"syntax6\">readLine<\/span>(), linecount<span class=\"syntax18\">+<\/span><span class=\"syntax18\">+<\/span>) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 114:<\/span>                                <span class=\"syntax8\">if<\/span> (<span class=\"syntax18\">!<\/span> useCache) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutterH\"> 115:<\/span>                                        System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">NPV:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">\"<\/span> <span class=\"syntax18\">+<\/span> <span class=\"syntax6\">getNPV<\/span>(line.<span class=\"syntax6\">split<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">,<\/span><span class=\"syntax13\">\"<\/span>)));\n<br \/><span class=\"gutter\"> 116:<\/span>                                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">else<\/span> <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 117:<\/span>                                        System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">NPV:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">\"<\/span> <span class=\"syntax18\">+<\/span> <span class=\"syntax6\">\n<br \/>\t\t\t\t\t\tgetNPV<\/span>(line.<span class=\"syntax6\">split<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">,<\/span><span class=\"syntax13\">\"<\/span>), cache, line));\n<br \/><span class=\"gutter\"> 118:<\/span>                                <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\"> 119:<\/span>                        <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutterH\"> 120:<\/span>                        <span class=\"syntax2\">\/\/<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Show<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">memory<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">usage<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">after<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">calculating<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">memory<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">usage<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">from<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">file<\/span>\n<br \/><span class=\"gutter\"> 121:<\/span>                        <span class=\"syntax8\">if<\/span> (cache <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 122:<\/span>                                cache.<span class=\"syntax6\">clear<\/span>();\n<br \/><span class=\"gutter\"> 123:<\/span>                        <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\"> 124:<\/span>                        System.<span class=\"syntax6\">gc<\/span>();\n<br \/><span class=\"gutterH\"> 125:<\/span>                        System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Used<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">memory:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">\"<\/span> <span class=\"syntax18\">+<\/span> (runtime.<span class=\"syntax6\">totalMemory<\/span>() <span class=\"syntax18\">-<\/span>\n<br \/>\t\t\t\truntime.<span class=\"syntax6\">freeMemory<\/span>()));\n<br \/><span class=\"gutter\"> 126:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (IOException ioexp) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 127:<\/span>                        <span class=\"syntax8\">throw<\/span> ioexp;\n<br \/><span class=\"gutter\"> 128:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (NumberFormatException nfe) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 129:<\/span>                        System.err.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Error<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">at<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">line:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">\"<\/span> <span class=\"syntax18\">+<\/span> linecount);\n<br \/><span class=\"gutterH\"> 130:<\/span>                        <span class=\"syntax8\">throw<\/span> nfe;\n<br \/><span class=\"gutter\"> 131:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">finally<\/span> <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 132:<\/span>                        <span class=\"syntax8\">if<\/span> (reader <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 133:<\/span>                                <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 134:<\/span>                                        reader.<span class=\"syntax6\">close<\/span>();\n<br \/><span class=\"gutterH\"> 135:<\/span>                                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (IOException ignore) <span class=\"syntax18\">{<\/span>\n<br \/><span class=\"gutter\"> 136:<\/span>                                        <span class=\"syntax2\">\/\/<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Empty<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">on<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">purpose<\/span>\n<br \/><span class=\"gutter\"> 137:<\/span>                                <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\"> 138:<\/span>                        <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\"> 139:<\/span>                        end <span class=\"syntax18\">=<\/span> System.<span class=\"syntax6\">currentTimeMillis<\/span>();\n<br \/><span class=\"gutterH\"> 140:<\/span>                        System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Execution<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">time:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">\"<\/span> <span class=\"syntax18\">+<\/span> (end<span class=\"syntax18\">-<\/span>start) <span class=\"syntax18\">+<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">miliseconds<\/span><span class=\"syntax13\">\"<\/span>);\n<br \/><span class=\"gutter\"> 141:<\/span>                <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\"> 142:<\/span>        <span class=\"syntax18\">}<\/span>\n<br \/><span class=\"gutter\"> 143:<\/span><span class=\"syntax18\">}<\/span>\n<br \/><\/pre>\n<style type=\"text\/css\"><\/style>\n<p><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/>\n<br \/><font>La magia ocurre entre las lineas 64-82. Ahora veamos el uso de memoria y los tiempos de ejecuci\u00f3n:<\/p>\n<p><\/span><\/p>\n<blockquote style=\"font-family: courier new;\"><p><font><font><font><font><font><font><font>[josevnz@localhost effective]$ .\/NPV.sh NPV.data c<br \/>\n<br \/><span style=\"font-weight: bold;\">Used memory: 153944<\/span><br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: 10652.7<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>&#8230;.<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -475.5<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/>NPV: -347.3<br \/>\n<br \/><span style=\"font-weight: bold;\">Used memory: 430184<\/span><br \/>\n<br \/><span style=\"font-weight: bold;\">Execution time: 500 miliseconds<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p><\/blockquote>\n<p><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font><font>Y note como varia el uso de la memoria se incrementa mucho m\u00e1s y el tiempo de ejecuci\u00f3n disminuye (la mitad). Si bien la t\u00e9cnica es \u00fatil, note como nunca hay un<span style=\"font-style: italic;\"> almuerzo gr\u00e1tis (free lunch). <\/span><\/p>\n<p>Espero que la t\u00e9cnica le resulte \u00fatil, aqui les dejo un <a href=\"http:\/\/www.devx.com\/getHelpOn\/10MinuteSolution\/20432\">peque\u00f1o tutorial<\/a> y espero sus comentarios por ac\u00e1 \ud83d\ude42<\/p>\n<p><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Java tiene desde hace tiempo (Java 2 para seer exacto) el concepto de &#8216;referencias d\u00e9biles&#8217;. Su uso nos puede permitir mejorar el uso de la memoria en nuestra aplicaci\u00f3n y en ciertos casos mejorar su desepe\u00f1o. Suponga que tenemos un programa que lee desde un archivo de texto una serie de l\u00edneas, cada una de <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2004\/11\/29\/echando-codigo-usando-referencias-debiles-en-java\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/265"}],"collection":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/comments?post=265"}],"version-history":[{"count":0,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/265\/revisions"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=265"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=265"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}