<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ java - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ java - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 19:37:31 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/java/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Las principales estructuras de datos que deberías saber para tu próxima entrevista de programación ]]>
                </title>
                <description>
                    <![CDATA[ Niklaus Wirth, informático suizo, escribió un libro en 1976 titulado Algoritmos + Estructura de Datos = Programas.  40+ años más tarde, esa ecuación se mantiene. Por eso, los candidatos a ingeniería de software tienen que demostrar su entendimiento de las estructuras de datos junto con sus aplicaciones.  Casi ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/las-principales-estructuras-de-datos-que-deberias-saber-para-tu-proxima-entrevista-de-programacion/</link>
                <guid isPermaLink="false">64527c28e59d8f07c2db3c2c</guid>
                
                    <category>
                        <![CDATA[ java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gibran Pelayo M. ]]>
                </dc:creator>
                <pubDate>Wed, 17 May 2023 17:44:53 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/05/1_s6hhrgR5_tXpO_j7uKaHMw-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/the-top-data-structures-you-should-know-for-your-next-coding-interview-36af0831f5e3/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The top data structures you should know for your next coding interview</a>
      </p><p>Niklaus Wirth, informático suizo, escribió un libro en 1976 titulado <em>Algoritmos + Estructura de Datos = Programas</em>. </p><p>40+ años más tarde, esa ecuación se mantiene. Por eso, los candidatos a ingeniería de software tienen que demostrar su entendimiento de las estructuras de datos junto con sus aplicaciones. </p><p>Casi todos los problemas requieren que el candidato demuestre un profundo conocimiento de estructura de datos. No importa si recién te has graduado (de la universidad o bootcamp de programación), o si tienes décadas de experiencia.</p><p>A veces las preguntas de la entrevista mencionan explícitamente una estructura de datos, por ejemplo, "dado un árbol binario. "Otras veces es implícito, como "queremos rastrear el número de libros asociados a cada autor."</p><p>Aprender estructura de datos es esencial, incluso si solo estás tratando de mejorar en tu trabajo actual. Empecemos con entender lo básico.</p><h3 id="-qu-es-una-estructura-de-datos"><strong>¿Qué es una Estructura de Datos?</strong></h3><p>De manera simple, una estructura de datos es un contenedor que almacena datos en una disposición específica. Esta "disposición" permite que una estructura de datos sea eficiente en algunas operaciones e ineficiente en otras. Tu meta es comprender las estructuras de datos para que puedas elegir la que sea más óptima para el problema en cuestión.</p><h4 id="-por-qu-necesitamos-estructuras-de-datos"><strong><strong>¿Por qué necesitamos Estructuras de Datos?</strong></strong></h4><p>Así como las estructuras de datos son usadas para almacenar datos de una forma organizada, y dado que los datos son la entidad más crucial en informática, el verdadero valor de las estructuras de datos es claro. </p><p>No importa qué problema estés resolviendo, de un modo u otro tienes que tratar con datos — ya sea el salario de un empleado, precios de acciones, una lista de compras, o incluso un directorio telefónico simple.</p><p>Basado en diferentes escenarios, los datos necesitan ser almacenados en un formato específico. Tenemos un puñado de estructuras de datos que cubren nuestra necesidad de almacenar datos en distintos formatos. </p><h3 id="estructuras-de-datos-m-s-usadas"><strong>Estructuras de Datos más Usadas</strong></h3><p>Enlistemos primero las estructuras de datos más usadas, y después las revisaremos una por una: </p><ol><li>Arreglos</li><li>Pilas</li><li>Colas</li><li>Listas Enlazadas</li><li>Árboles</li><li>Grafos</li><li>Tries (en realidad son árboles, pero es bueno mencionarlos por separado).</li><li>Tablas Hash</li></ol><h3 id="arreglos"><strong>Arreglos</strong></h3><p>Un arreglo es la más simple y más usada estructura de datos. Otras estructuras de datos, como las pilas y las colas, provienen de los arreglos. </p><p>A continuación puedes ver una imagen de un arreglo simple de tamaño 4, que contiene elementos (1, 2, 3 y 4). </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/B4CncYOv-dN76B45UXdVrfat45MvgQ9b8atv.png" class="kg-image" alt="B4CncYOv-dN76B45UXdVrfat45MvgQ9b8atv" width="600" height="400" loading="lazy"></figure><p>A cada elemento de datos se le asigna un valor numérico positivo llamado <strong>índice</strong>, que corresponde a la posición de ese elemento en el arreglo. La mayoría de los lenguajes definen al 0 (cero) como el índice inicial. </p><p>Los dos tipos de arreglos son:</p><ul><li>Arreglos unidimensionales (como el de la imagen de arriba)</li><li>Arreglos multidimensionales (arreglos dentro de arreglos)</li></ul><h4 id="operaciones-b-sicas-con-arreglos"><strong>Operaciones Básicas con Arreglos</strong></h4><ul><li>Insert — Inserta un elemento en un índice dado</li><li>Get — Devuelve el elemento sobre un índice dado</li><li>Delete — Borra un elemento sobre un índice dado</li><li>Size — Obtiene la cantidad total de elementos en un arreglo</li></ul><h4 id="preguntas-frecuentes-sobre-arreglos-en-las-entrevistas"><strong>Preguntas Frecuentes sobre Arreglos en las Entrevistas</strong></h4><ul><li>Encontrar el segundo elemento mínimo de un arreglo</li><li>Los primeros enteros no repetidos en un arreglo</li><li>Combinar dos arreglos ordenados</li><li>Reordenar los valores positivos y negativos en un arreglo</li></ul><h3 id="pilas"><strong>Pilas</strong></h3><p>Todos conocemos la famosa opción <strong>Deshacer</strong>(<strong>Undo</strong>), que está presente en casi todas las aplicaciones. ¿Te has preguntado alguna vez cómo funciona? La idea: almacenas los estados previos de tu trabajo (que están limitados a un número específico) en la memoria en cierto orden tal que el último aparece primero. Esto no se puede hacer solo usando arreglos. Aquí es donde la Pila resulta útil.</p><p>Un ejemplo de la vida real del uso de la Pila podría ser una pila de libros colocados en orden vertical. Para obtener el libro que está en algún lugar en medio, necesitarás remover todos los libros que están encima de él. Así es como funciona el método LIFO (<strong>L</strong>ast <strong>I</strong>n <strong>F</strong>irst <strong>O</strong>ut; en español UEPS, o <strong>Ú</strong>ltimo en <strong>E</strong>ntrar, <strong>P</strong>rimero en <strong>S</strong>alir).</p><p>Abajo puedes encontrar una imagen de una pila que contiene 3 elementos de datos (1, 2 y 3), donde 3 está en la cima y será removido primero:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/BP-lD2OxkMbIQI2iZD-jxgIPlANlsMTqwnLP.png" class="kg-image" alt="BP-lD2OxkMbIQI2iZD-jxgIPlANlsMTqwnLP" width="462" height="318" loading="lazy"></figure><p>Operaciones básicas de la pila:</p><ul><li>Push — Inserta un elemento en la cima</li><li>Pop — Devuelve el elemento de la cima después de eliminarlo de la pila</li><li>isEmpty — Devuelve verdadero si la pila está vacía</li><li>Top — Devuelve el elemento que está en la cima sin eliminarlo de la pila </li></ul><h4 id="preguntas-frecuentes-sobre-pilas-en-las-entrevistas"><strong>Preguntas Frecuentes sobre Pilas en las Entrevistas</strong></h4><ul><li>Evaluar una expresión postfijas usando una pila</li><li>Ordenar valores en una pila</li><li>Comprobar paréntesis equilibrados en una expresión</li></ul><h3 id="colas"><strong>Colas</strong></h3><p>Similar a la Pila, la Cola es otra estructura de datos lineal que almacena elementos de manera secuencial. La única diferencia significativa entre la Pila y la Cola es que en lugar de usar el método LIFO, la Cola implementa el método FIFO (<strong>F</strong>irst <strong>I</strong>n <strong>F</strong>irst <strong>O</strong>ut; en español PEPS, o <strong>P</strong>rimero en <strong>E</strong>ntrar <strong>P</strong>rimero en <strong>S</strong>alir).</p><p>Un ejemplo perfecto de la Cola en la vida real: una fila de personas esperando en taquilla. Si llega una nueva persona, se formará al final de la fila, no al inicio — y la persona situada al inicio de la fila será la primera en conseguir boleto y, por lo tanto, la primera en dejar la fila.</p><p>A continuación una imagen de la Cola conteniendo cuatro elementos de datos (1, 2, 3 y 4), donde 1 está al inicio y será removido primero:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/C2riLJTPBVpSI-3o5Cx9IrQ16LZi1kLrqYXo.png" class="kg-image" alt="C2riLJTPBVpSI-3o5Cx9IrQ16LZi1kLrqYXo" width="542" height="734" loading="lazy"></figure><h4 id="operaciones-b-sicas-de-la-cola"><strong>Operaciones básicas de la Cola</strong></h4><ul><li>Enqueue() — Inserta un elemento al final de la cola</li><li>Dequeue() — Elimina un elemento del inicio de la cola</li><li>isEmpty() — Devuelve verdadero si la cola está vacía</li><li>Top() — Devuelve el primer elemento de la cola</li></ul><h4 id="preguntas-frecuentes-sobre-colas-en-las-entrevistas"><strong>Preguntas Frecuentes sobre Colas en las Entrevistas</strong></h4><ul><li>Implementar una pila usando una cola</li><li>Invertir los primeros k elementos de una cola</li><li>Generar números binarios desde 1 hasta n usando una cola</li></ul><h3 id="lista-enlazada"><strong>Lista enlazada</strong></h3><p>Una lista enlazada es otra estructura de datos lineal importante que a primera vista puede lucir similar a los arreglos, pero difiere en la asignación de memoria, la estructura interna y la forma en que se llevan a cabo las operaciones básicas de inserción y eliminación.</p><p>Una lista enlazada es como una cadena de nodos, donde cada nodo contiene información como datos y un puntero al siguiente nodo de la cadena. Hay un puntero a la cabecera, que apunta al primer elemento de la lista enlazada, y si la lista está vacía, entonces simplemente apunta a null o nada.</p><p>Las listas enlazadas son usadas para implementar sistemas de archivos, tablas hash y listas de adyacencia.</p><p>Aquí está una representación visual de la estructura interna de una lista enlazada:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/ezrkbpSyblh3famnGsgIHiRvHV9CKODu0tPw.png" class="kg-image" alt="ezrkbpSyblh3famnGsgIHiRvHV9CKODu0tPw" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/05/ezrkbpSyblh3famnGsgIHiRvHV9CKODu0tPw.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/05/ezrkbpSyblh3famnGsgIHiRvHV9CKODu0tPw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="147" loading="lazy"></figure><p>A continuación se muestran los tipos de listas enlazadas:</p><ul><li>Lista Simple Enlazada (Unidireccional)</li><li>Lista Doblemente Enlazada (Bidireccional)</li></ul><h4 id="operaciones-b-sicas-de-las-listas-enlazadas"><strong><em>Operaciones básicas de las Listas Enlazadas</em></strong></h4><ul><li><em><em>InsertAtEnd </em></em>— Inserta un elemento dado al final de la lista enlazada</li><li><em><em>InsertAtHead</em></em> — Inserta un elemento dado al inicio/cabeza de la lista enlazada</li><li><em><em>Delete </em></em>— Elimina un elemento dado de la lista enlazada</li><li><em><em>DeleteAtHead </em></em>— Elimina el primer elemento de la lista enlazada</li><li><em><em>Search</em></em> — Devuelve el elemento dado de una lista enlazada</li><li><em><em>isEmpty </em></em>— Retorna verdadero si la lista enlazada está vacía</li></ul><h4 id="preguntas-frecuentes-sobre-listas-enlazadas-en-las-entrevistas"><strong>Preguntas Frecuentes sobre Listas Enlazadas en las Entrevistas</strong></h4><ul><li>Invertir una lista enlazada</li><li>Detectar bucle en una lista enlazada</li><li>Devolver el nodo N del final de una lista enlazada</li><li>Eliminar duplicados de una lista enlazada</li></ul><h3 id="grafos"><strong><strong><strong>Gra</strong></strong>fo<strong><strong>s</strong></strong></strong></h3><p>Un grafo es un conjunto de nodos que están conectados entre sí en forma de red. Los nodos son también llamados vértices. Un <strong>par(x,y)</strong> se denomina <strong>arista</strong>, que indica que el vértice <strong>x</strong> está conectado al vértice <strong>y</strong>. Una arista puede contener peso/costo, mostrando cuánto cuesta viajar del vértice x al y.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/0MsvzasAr6vS6bnvozjRAa5iBnEDKn9Cty0D.png" class="kg-image" alt="0MsvzasAr6vS6bnvozjRAa5iBnEDKn9Cty0D" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/05/0MsvzasAr6vS6bnvozjRAa5iBnEDKn9Cty0D.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/05/0MsvzasAr6vS6bnvozjRAa5iBnEDKn9Cty0D.png 800w" sizes="(min-width: 720px) 720px" width="800" height="425" loading="lazy"></figure><p>Tipos de Grafos:</p><ul><li>Grafo no dirigido</li><li>Grafo dirigido</li></ul><p>En lenguaje de programación, los grafos pueden ser representados de dos formas:</p><ul><li>Matriz de adyacencia</li><li>Lista de adyacencia</li></ul><p>Algoritmos comunes de recorrido de grafos:</p><ul><li>Recorrido o Búsqueda en Amplitud o Anchura</li><li>Recorrido o Búsqueda en Profundidad</li></ul><h4 id="preguntas-frecuentes-sobre-grafos-en-las-entrevistas"><strong>Preguntas Frecuentes sobre Grafos en las Entrevistas</strong></h4><ul><li>Implementar Recorrido en Amplitud o Anchura y en Profundidad</li><li>Comprobar si un grafo es un árbol o no</li><li>Contar el número de aristas en un grafo</li><li>Encontrar el camino más corto entre dos vértices</li></ul><h3 id="-rboles"><strong>Árboles</strong></h3><p>Un árbol es una estructura de datos jerárquica que consiste en vértices (nodos) y aristas que los conectan. Los árboles son similares a los grafos, pero la diferencia clave entre ellos es que un ciclo no puede existir en un árbol.</p><p>Los árboles son usados extensamente en la Inteligencia Artificial y algoritmos complejos para proveer un mecanismo eficiente de almacenamiento para la resolución de problemas.</p><p>Abajo se puede ver la imagen de un árbol simple, y la terminología básica usada en la estructura de datos de un árbol:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/VPUnmQO8rMoLGMqMe24EnoJ3uS72JZdMt48w-1.png" class="kg-image" alt="VPUnmQO8rMoLGMqMe24EnoJ3uS72JZdMt48w" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/05/VPUnmQO8rMoLGMqMe24EnoJ3uS72JZdMt48w-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/05/VPUnmQO8rMoLGMqMe24EnoJ3uS72JZdMt48w-1.png 800w" sizes="(min-width: 720px) 720px" width="800" height="352" loading="lazy"></figure><p>Lo siguiente son los tipos de árboles:</p><ul><li>Árbol N-ario</li><li>Árbol Equilibrado</li><li>Árbol Binario</li><li>Árbol de Búsqueda Binaria</li><li>Árbol AVL</li><li>Árbol Rojo Negro</li><li>Árbol 2-3</li></ul><p>De todos los mencionados, el Árbol Binario y el Arbol de Búsqueda Binaria son los más comúnmente usados.</p><h4 id="preguntas-frecuentes-sobre-rboles-en-las-entrevistas"><strong>Preguntas Frecuentes sobre Árboles en las Entrevistas</strong></h4><ul><li>Hallar la altura de un árbol binario</li><li>Hallar el k-ésimo valor máximo en un árbol de búsqueda binaria</li><li>Hallar los nodos a "k" distancia desde la raíz</li><li>Hallar los ancestros de un nodo dado en un árbol binario</li></ul><h3 id="trie"><strong>Trie</strong></h3><p>Trie, también conocido como "Árboles de Prefijos", es una estructura de datos en forma de árbol que prueba ser muy eficiente para resolver problemas relacionados con cadenas de caracteres. Proporciona una recuperación rápida y es mayormente usada para buscar palabras en un diccionario, proveer sugerencias automáticas en un motor de búsqueda, e incluso para enrutamiento IP.</p><p>Abajo hay una ilustración de cómo las tres palabras “top”, “thus”, y “their” se almacenan en un Trie:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/lSNi21Wr4P6eMKDwLMQ5rijHhA-lBlovlc40-1.png" class="kg-image" alt="lSNi21Wr4P6eMKDwLMQ5rijHhA-lBlovlc40-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/05/lSNi21Wr4P6eMKDwLMQ5rijHhA-lBlovlc40-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/05/lSNi21Wr4P6eMKDwLMQ5rijHhA-lBlovlc40-1.png 800w" sizes="(min-width: 720px) 720px" width="800" height="1093" loading="lazy"></figure><p>Las palabras son almacenadas de arriba a abajo donde los nodos de color verde “p”, “s” y “r” indican el final de “top”, “thus”, y “their” respectivamente.</p><p><strong>Preguntas Frecuentes sobre Tries en las Entrevistas</strong></p><ul><li>Contar el número total de palabras en un Trie</li><li>Imprimir todas las palabras almacenadas en un Trie</li><li>Ordenar los elementos de un arreglo usando un Trie</li><li>Formar palabras a partir de un diccionario usando un Trie</li><li>Construir un diccionario T9</li></ul><h3 id="tabla-hash"><strong>Tabla Hash</strong></h3><p>El Hashing es un proceso utilizado para identificar objetos de forma única, y almacenar cada objeto en algún índice único precalculado llamado su "llave". Entonces, el objeto es almacenado en forma de un par "llave-valor", y la colección de dichos elementos es llamada "diccionario". Cada objeto puede ser buscado usando esa llave. Hay diferentes estructuras de datos basadas en hashing, pero la más usada es la <strong>tabla hash</strong>.</p><p>Las tablas hash generalmente se implementan usando arreglos.</p><p>El rendimiento de la estructura de datos hash depende de estos tres factores:</p><ul><li>Función Hash</li><li>Tamaño de la Tabla Hash</li><li>Método de Manejo de Colisiones</li></ul><p>Aquí hay una ilustración de cómo el hash es mapeado en un arreglo. El índice de este arreglo es calculado mediante una Función Hash.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/zV3x2Pxt0JFt7UjokTKNx24HFmM3t-6phDV2.png" class="kg-image" alt="zV3x2Pxt0JFt7UjokTKNx24HFmM3t-6phDV2" width="348" height="394" loading="lazy"></figure><p><strong>Preguntas Frecuentes sobre Hash en las Entrevistas</strong></p><ul><li>Hallar pares simétricos en un arreglo</li><li>Trazar el camino completo de un viaje</li><li>Hallar si un arreglo es un subconjunto de otro arreglo</li><li>Comproban si arreglos dados son disjuntos</li></ul><p>Éstas son las ocho principales estructuras de datos que definitivamente deberías conocer antes de presentarte a una entrevista de programación.</p><p>¡Buena suerte y feliz aprendizaje! :)</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Interfaces de Java explicadas con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ La interfaz en Java es un poco como la Clase, pero con una diferencia significativa: una interface puede tener firmas de métodos, campos y métodos predeterminados. Desde Java 8, también puedes crear métodos predeterminados [https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html]. En el siguiente bloque puedes ver un ejemplo de interfaz: public interface Vehiculo {  ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/interfaces-java-explicadas-con-ejemplos/</link>
                <guid isPermaLink="false">6448d701db9a5007c0849f02</guid>
                
                    <category>
                        <![CDATA[ java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ BlackeyeB ]]>
                </dc:creator>
                <pubDate>Mon, 01 May 2023 01:13:10 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/04/5f9c9ce6740569d1a4ca34c5.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/java-interfaces-explained-with-examples/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Java Interfaces Explained with Examples</a>
      </p><p>La interfaz en Java es un poco como la Clase, pero con una diferencia significativa: una<em> </em><code>interface</code> puede tener firmas de métodos, campos y métodos predeterminados. Desde Java 8, también puedes crear <a href="https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html">métodos predeterminados</a>. En el siguiente bloque puedes ver un ejemplo de interfaz:</p><pre><code class="language-java">public interface Vehiculo {
    public String matricula = "";
    public float maxVel
    public void arrancar();
    public void detener();
    default void claxon(){
      System.out.println("Sonando claxon");
   }
}</code></pre><p>La interfaz anterior contiene dos campos, dos métodos y un método predeterminado. Solo, no es de mucha utilidad, pero normalmente se usan junto con las Clases. ¿Cómo? Simple, tienes que asegurarte de que alguna clase lo implemente (<code>implements</code>).</p><pre><code class="language-java">public class Coche implements Vehiculo {
    public void arrancar() {
        System.out.println("arrancando motor...");
    }
    public void detener() {
        System.out.println("deteniendo motor...");
    }
}</code></pre><p>Ahora, hay una <strong><strong><strong><strong>regla básica:</strong></strong></strong></strong> la clase debe implementar <strong><strong><strong><strong>todos</strong></strong></strong></strong> los métodos que hay en la interfaz. Los métodos deben tener <em><em>exactamente la misma</em></em> firma (nombre, parámetros y excepciones) como se describe en la interfaz. Sin embargo, la clase <em><em>no</em></em> necesita declarar los campos, solo los métodos.</p><h2 id="instancias-de-una-interfaz"><strong><strong><strong>Instancias de una interfaz</strong></strong></strong></h2><p>Una vez que creas una clase Java que <code>implements</code> (implementa) cualquier interfaz, se puede hacer referencia a la instancia del objeto como una instancia de la interfaz. Este concepto es similar al de creación de instancias de herencia.</p><pre><code class="language-java">// siguiendo nuestro ejemplo anterior

Vehiculo tesla = new Coche();

tesla.arrancar(); // arrancar el motor...</code></pre><p>Una interfaz <strong><strong><strong><strong>no puede</strong></strong></strong></strong> contener métodos constructores. Por lo tanto, <strong><strong><strong><strong>no puede</strong></strong></strong>s</strong> crear una instancia de una interfaz en sí. Debes crear una instancia de alguna clase que implemente una interfaz para hacer referencia a ella.</p><p>Piensa en las interfaces como un formulario de contrato en blanco o una plantilla.</p><p>¿Qué puedes hacer con esta función? ¡Polimorfismo! ¡Puedes usar solo interfaces para referirte a instancias de objetos!</p><pre><code class="language-java">class Camion implements Vehiculo {
    public void arrancar() {
        System.out.println("arrancando el motor del camión...");
    }
    public void detener() {
        System.out.println("deteniendo el motor del camión...");
    }
}

class Arrancador {
    // método estático, se puede llamar sin instanciar la clase
    public static void arrancarMotor(Vehiculo vehiculo) {
        vehiculo.arrancar();
    }
}

Vehiculo tesla = new Coche();
Vehiculo tata = new Camion();

Arrancador.arrancarMotor(tesla); // arrancando motor...
Arrancador.arrancarMotor(tata); // arrancar el motor del camión...</code></pre><h2 id="pero-qu-hay-de-las-m-ltiples-interfaces"><strong><strong><strong>Pero, ¿qué hay de </strong>las <strong>múltiples interfaces?</strong></strong></strong></h2><p>Sí, puedes implementar varias interfaces en una sola clase. Mientras estaba en <a href="https://forum.freecodecamp.com/t/java-docs-inheritance">Herencia</a> dentro de las clases estaba restringido a heredar solo una clase, aquí puedes ampliar cualquier cantidad de interfaces. Pero no olvides implementar <em><em>todos</em></em> los métodos de todas las interfaces, de lo contrario, la compilación fallará.</p><pre><code class="language-java">public interface GPS {
    public void obtenerCoordenadas();
}

public interface Radio {
    public void iniciarRadio();
    public void detenerRadio();
}

public class Smartphone implements GPS,Radio {
    public void obtenerCoordenadas() {
        // devuelve algunas coordenadas
    }
    public void iniciarRadio() {
      // iniciar Radio
    }
    public void detenerRadio() {
        // detener Radio
    }
}</code></pre><h2 id="algunas-caracter-sticas-de-las-interfaces"><strong><strong><strong>Algunas características de las interfaces</strong></strong></strong></h2><ul><li>Puedes colocar variables dentro de una interfaz, aunque no será una decisión sensata, ya que las clases no están obligadas a tener la misma variable. En resumen, ¡evita colocar variables!</li><li>Todas las variables y métodos en una interfaz son públicos, incluso si omites la palabra clave <code>public</code>.</li><li>Una interfaz no puede especificar la implementación de un método en particular. Depende de las Clases hacerlo. Aunque ha habido una excepción reciente (ver más abajo).</li><li>Si una clase implementa varias interfaces, existe una posibilidad remota de superposición de la firma del método. Dado que Java no permite múltiples métodos de la misma firma exacta, podría generar problemas. Consulta <a href="http://stackoverflow.com/questions/2598009/method-name-collision-in-interface-implementation-java" rel="nofollow">esta pregunta</a> para obtener más información.</li></ul><h2 id="m-todos-predeterminados-de-la-interfaz"><strong><strong><strong>Métodos predeterminados de la interfaz</strong></strong></strong></h2><p>Antes de Java 8, no teníamos forma de dirigir una interfaz para que tuviera una implementación de método particular, lo que genera mucha confusión y roturas de código si la definición de una interfaz cambia repentinamente.</p><p>Pongamos que escribes una biblioteca de código abierto, que contiene una interfaz. Digamos que tus clientes, es decir, prácticamente todos los desarrolladores de todo el mundo, lo están usando mucho y están contentos. Ahora has tenido que actualizar la biblioteca agregando una nueva definición de método a la interfaz para admitir una nueva característica. Pero eso rompería <em><em>todas</em></em> las compilaciones, ya que todas las clases que implementan esa interfaz tienen que cambiar ahora. ¡Qué catástrofe!</p><p>Afortunadamente, Java 8 ahora nos proporciona métodos <code>default</code> (predeterminados) para interfaces. ¡Un método <code>default</code> <em><em>puede</em></em> contener su propia implementación <em><em>directamente</em></em> dentro de la interfaz! Entonces, si una Clase no implementa un método predeterminado, el compilador tomará la implementación mencionada dentro de la Interfaz. Bonito, ¿no? Entonces, en tu biblioteca, puede agregar cualquier cantidad de métodos predeterminados en las interfaces sin miedo a estropear nada.</p><pre><code class="language-java">public interface GPS {
    public void obtenerCoordenadas();
    default public void obtenerCoordenadasAproximadas() {
        // implementación para devolver coordenadas de fuentes aproximadas
        // como wifi y móvil
        System.out.println("Obteniendo coordenadas aproximadas por wifi y GSM...");
    }
}

public interface Radio {
    public void iniciarRadio();
    public void detenerRadio();
}

public class Smartphone implements GPS,Radio {
    public void obtenerCoordenadas() {
        // devuelve algunas coordenadas
    }
    public void iniciarRadio() {
      // iniciar Radio
    }
    public void detenerRadio() {
        // detener Radio
    }

    // sin implementación de getRoughCoordinates()
}

Smartphone motoG = new Smartphone();
motog.obtenerCoordenadasAproximadas(); // Obteniendo coordenadas aproximadas por wifi y GSM...</code></pre><p><strong><strong>Pero, ¿qué sucede si dos interfaces tienen la misma firma de método?</strong></strong></p><p>Gran pregunta. En ese caso, si no proporcionas la implementación en la clase, el pobre compilador se confundirá y simplemente fallará. También debes proporcionar una implementación de método predeterminada dentro de la Clase. También hay una forma ingeniosa de usar <code>super</code> para llamar a la implementación que te gusta:</p><pre><code class="language-java">public interface Radio {
    // public void iniciarRadio();
    // public void detenerRadio();

    default public void siguiente() {
        System.out.println("Siguiente emisora de Radio");
    }
}

public interface ReproductorMusica {
    // public void iniciar();
    // public void pausar();
    // public void detener();

    default public void siguiente() {
        System.out.println("Siguiente canción del Reproductor de Música");
    }
}

public class Smartphone implements Radio, ReproductorMusica {
    public void siguiente() {
        // Supongamos que deseas llamar a siguiente del ReproductorMusica
        ReproductorMusica.super.siguiente();
    }
}

Smartphone motoG = new Smartphone();
motoG.siguiente();  // Siguiente desde ReproductorMusica</code></pre><h2 id="m-todos-est-ticos-en-interfaces"><strong><strong><strong>Métodos estáticos en interfaces</strong></strong></strong></h2><p>Otra novedad de Java 8 es la capacidad de agregar métodos estáticos a las interfaces. Los métodos estáticos en interfaces son casi idénticos a los métodos estáticos en clases concretas. La única gran diferencia es que los métodos <code>static</code> no se heredan en las clases que implementan la interfaz. Esto significa que se hace referencia a la interfaz cuando se llama al método estático, no a la clase que lo implementa.</p><pre><code class="language-java">interface ReproductorMusica {
  public static void comercial(String patrocinador) {
    System.out.println("Nuevo mensaje de " + patrocinador);
  }
  
  public void play();
}


class Smartphone implements ReproductorMusica {
	public void reproducir() {
		System.out.println("Reproduciendo desde el Smartphone");
	}
}

class Main {
  public static void main(String[] args) {
    Smartphone motoG = new Smartphone();
    ReproductorMusica.comercial("Motorola"); 
    // Llamada a la interfaz no a la clase implementada
    // motoG.comercial("Motorola");  // Esto causaría un error de compilación
  }
}</code></pre><h2 id="heredar-una-interfaz"><strong><strong><strong>Heredar una interfaz</strong></strong></strong></h2><p>También es posible en Java que una interfaz herede <em><em>otra</em></em> interfaz usando, la palabra clave <code>extends</code>:</p><pre><code class="language-java">public interface Reproductor {
    public void iniciar();
    public void pausar();
    public void detener();
}

public interface ReproductorMusica extends Reproductor {
    default public void siguiente() {
        System.out.println("siguiente canción del Reproductor de Música");
    }
}</code></pre><p>Eso significa que la clase que implementa <code>ReproductorMusica</code> tiene que implementar <em><em>todos</em></em> los métodos de <code>ReproductorMusica</code> así como los de <code>Reproductor</code>:</p><pre><code class="language-java">public class SmartPhone implements ReproductorMusica {
    public void iniciar() {
        System.out.println("iniciar");
    }
    public void detener() {
        System.out.println("detener");
    }
    public void pausar() {
        System.out.println("pausar");
    }
}</code></pre><p>¡Ahora ya tienes una buena comprensión de las interfaces de Java! Obtén información sobre las clases abstractas para ver cómo Java te brinda otra forma de definir contratos.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Repasa estas 50 preguntas para superar una entrevista de programación en Java ]]>
                </title>
                <description>
                    <![CDATA[ Una lista con preguntas frecuentes de Java en entrevistas de trabajo para programadores. ¡Hola todos! En los últimos años, he estado compartiendo muchas preguntas [http://javarevisited.blogspot.sg/2015/10/133-java-interview-questions-answers-from-last-5-years.html]  y debates sobre entrevistas de Java individualmente. Muchos de mis lectores me han pedido que las reúna para poder tenerlas en un mismo lugar. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/repasa-estas-50-preguntas-para-superar-una-entrevista-de-programacion-en-java/</link>
                <guid isPermaLink="false">63f9f2e02154fe0736d61486</guid>
                
                    <category>
                        <![CDATA[ java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ CipherBoB ]]>
                </dc:creator>
                <pubDate>Wed, 08 Mar 2023 15:24:05 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/02/1_s73cLB7vYz05f-aw_QAgFw--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/review-these-50-questions-to-crack-your-java-programming-interview-69d03d746b7f/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Review these 50 questions to crack your Java programming interview</a>
      </p><p>Una lista con preguntas frecuentes de Java en entrevistas de trabajo para programadores.</p><p>¡Hola todos! En los últimos años, he estado compartiendo muchas <a href="http://javarevisited.blogspot.sg/2015/10/133-java-interview-questions-answers-from-last-5-years.html" rel="noopener">preguntas</a> y debates sobre entrevistas de Java individualmente. Muchos de mis lectores me han pedido que las reúna para poder tenerlas en un mismo lugar. Este post es el resultado de ello.</p><p>Este artículo contiene más de <strong><strong>50 preguntas </strong>de<strong> entrevista</strong>s<strong> de Java</strong></strong> que cubren todos los temas importantes, como los fundamentos de Core Java, <a href="https://javarevisited.blogspot.com/2011/11/collection-interview-questions-answers.html" rel="noopener">Java Collection Framework</a> , <a href="https://javarevisited.blogspot.com/2014/07/top-50-java-multithreading-interview-questions-answers.html#axzz5ghebTpxm" rel="noopener">Java Multithreading and Concurrency</a> , <a href="https://javarevisited.blogspot.com/2014/08/socket-programming-networking-interview-questions-answers-Java.html" rel="noopener">Java IO</a> , <a href="https://javarevisited.blogspot.com/2012/12/top-10-jdbc-interview-questions-answers.html" rel="noopener">JDBC</a> , <a href="http://www.java67.com/2016/08/10-jvm-options-for-java-production-application.html" rel="noopener">JVM Internals</a> , <a href="http://www.java67.com/2018/06/data-structure-and-algorithm-interview-questions-programmers.html" rel="noopener">Problemas de codificación</a> , <a href="http://www.java67.com/2015/12/top-30-oops-concept-interview-questions-answers-java.html" rel="noopener">Programación orientada a objetos</a> , etc.</p><p>Las preguntas también están extraídas de varias entrevistas y no son, en modo alguno, muy difíciles. Es posible que ya las hayas visto en tu teléfono o en la ronda de entrevistas cara a cara.</p><p>Las preguntas también son muy útiles para repasar temas importantes como hilos o subprocesos múltiples y colecciones. También he compartido algunos <em><em>recursos útiles para seguir aprendiendo y mejorando,</em></em> como <a href="https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&amp;subid=0&amp;offerid=323058.1&amp;type=10&amp;tmpid=14538&amp;RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fjava-the-complete-java-developer-course%2F" rel="noopener"><strong><strong>The Complete Java MasterClass</strong></strong></a> para repasar y llenar los vacíos en tus habilidades de Java.</p><p>Entonces... ¿Qué estamos esperando? Aquí está la lista de algunas de las preguntas de Java más frecuentes en entrevistas para desarrolladores de Java principiantes y experimentados.</p><h2 id="m-s-de-50-preguntas-de-entrevista-de-java-para-programadores-experimentados-de-2-a-3-a-os">Más de 50 preguntas de entrevista de Java para programadores experimentados de 2 a 3 años</h2><p>Pues... sin perder más tiempo, aquí está mi lista de algunas <a href="http://www.java67.com/2018/03/top-50-core-java-interview-questions.html" rel="noopener">preguntas de entrevista de Core Java</a> más frecuentes para programadores principiantes. Esta lista se enfoca en principiantes y desarrolladores menos experimentados, con 2 o 3 años de experiencia en Java.</p><h3 id="1-c-mo-consigue-java-la-independencia-de-la-plataforma-respuesta-">1) ¿Cómo consigue Java la independencia de la plataforma? (<a href="http://www.java67.com/2012/08/how-java-achieves-platform-independence.html" rel="noopener">respuesta</a>)</h3><p>pista: bytecode y Java Virtual Machine</p><h3 id="2-qu-es-el-classloaderen-java-respuesta-">2) ¿Qué es el ClassLoaderen Java? (<a href="http://javarevisited.blogspot.sg/2012/12/how-classloader-works-in-java.html#axzz59AWpr6cb" rel="noopener">respuesta</a>)</h3><p>pista: parte de JVM que carga bytecodes para clases. Puedes escribir el tuyo propio.</p><h3 id="3-escribir-un-programa-java-para-comprobar-si-un-n-mero-es-par-o-impar-respuesta-">3) ¿Escribir un programa Java para comprobar si un número es par o impar? (<a href="http://javarevisited.blogspot.sg/2013/04/how-to-check-if-number-is-even-or-odd.html#axzz59AWpr6cb" rel="noopener">respuesta</a>)</h3><p>pista: puedes usar el operador bit a bit, como AND bit a bit, recuerda que, los números pares tienen un cero al final en formato binario y los impares acaban en 1.</p><h3 id="4-diferencia-entre-arraylisty-hashseten-java-respuesta-">4) ¿Diferencia entre ArrayListy HashSeten Java? (<a href="http://www.java67.com/2012/07/difference-between-arraylist-hashset-in-java.html" rel="noopener">respuesta</a>)</h3><p>pista: todas las diferencias entre Listy Setson aplicables aquí, por ejemplo, ordenamiento, duplicados, búsqueda aleatoria, etc. Consulta <a href="https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-collections" rel="noopener">Fundamentos de Java: colecciones</a> de Richard Warburton para obtener más información sobre ArrayList, HashSet y otras colecciones importantes en Java.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/ueOwMAd5GBdw4blCOpEBpOdMOtcs-et6nPYA" class="kg-image" alt="ueOwMAd5GBdw4blCOpEBpOdMOtcs-et6nPYA" width="800" height="600" loading="lazy"></figure><h3 id="5-qu-es-el-bloqueo-de-doble-verificaci-n-en-singleton-respuesta-">5) ¿Qué es el bloqueo de doble verificación en Singleton? (<a href="http://www.java67.com/2016/04/why-double-checked-locking-was-broken-before-java5.html" rel="noopener">respuesta</a>)</h3><p>pista: verifica dos veces si las instancias están inicializadas o no, primero sin bloqueo y segundo con bloqueo.</p><h3 id="6-c-mo-se-crea-singleton-seguro-para-subprocesos-en-java-respuesta-">6) ¿Cómo se crea Singleton seguro para subprocesos en Java? (<a href="http://javarevisited.blogspot.sg/2012/12/how-to-create-thread-safe-singleton-in-java-example.html" rel="noopener">respuesta</a>)</h3><p>pista: de muchas maneras, como usar Enum o usar un patrón de bloqueo verificado dos veces así cómo usar una clase estática anidada.</p><h3 id="7-cu-ndo-usar-la-variable-vol-til-en-java-respuesta-">7) ¿Cuándo usar la variable volátil en Java? (<a href="http://www.java67.com/2012/08/what-is-volatile-variable-in-java-when.html" rel="noopener">respuesta</a>)</h3><p>pista: cuando necesitas indicar a la JVM que una variable puede ser modificada por múltiples subprocesos y dar una pista a la JVM para que no almacene en caché su valor.</p><h3 id="8-cu-ndo-usar-una-variable-transitoria-en-java-respuesta-">8) ¿Cuándo usar una variable transitoria en Java? (<a href="http://www.java67.com/2012/08/what-is-transient-variable-in-java.html" rel="noopener">respuesta</a>)</h3><p>pista: cuando quieras hacer que una variable no sea serializable en una clase que implemente la interfaz Serializable. En otras palabras, puedes usarla para una variable cuyo valor no quieras guardar. Consulta <a href="https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&amp;subid=0&amp;offerid=323058.1&amp;type=10&amp;tmpid=14538&amp;RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fjava-the-complete-java-developer-course%2F" rel="noopener">The Complete Java MasterClass</a> para obtener información sobre las variables transitorias en Java.</p><h3 id="9-diferencia-entre-la-variable-transitoria-y-vol-til-en-java-respuesta-">9) ¿Diferencia entre la variable transitoria y volátil en Java? &nbsp;(<a href="http://www.java67.com/2012/11/difference-between-transient-vs-volatile-modifier-variable-java.html" rel="noopener">respuesta</a>)</h3><p>pista: totalmente diferente, una se usa en el contexto de la serialización mientras que la otra se usa en concurrencia.</p><h3 id="10-diferencia-entre-serializable-y-externalizable-en-java-respuesta-">10) ¿Diferencia entre serializable y externalizable en Java? (<a href="http://www.java67.com/2012/10/difference-between-serializable-vs-externalizable-interface.html" rel="noopener">respuesta</a>)</h3><p>pista: externalizable da más control sobre el proceso de serialización.</p><h3 id="11-podemos-sobreescribir-un-m-todo-privado-en-java-respuesta-">11) ¿Podemos sobreescribir un método privado en Java? (<a href="http://www.java67.com/2013/08/can-we-override-private-method-in-java-inner-class.html" rel="noopener">respuesta</a>)</h3><p>pista: No, porque no está visible en la subclase, que es requisito principal para sobreescribir un método en Java.</p><p><strong><strong>12) ¿Diferencia entre <code>Hashtable</code></strong> <strong>y <code>HashMap</code>en Java? (<a href="http://javarevisited.blogspot.sg/2010/10/difference-between-hashmap-and.html#axzz53B6SD769" rel="noopener">respuesta</a>)</strong></strong><br>pista: varias pero la más importante es que <code>Hashtable</code> está sincronizada, mientras que <code>HashMap</code>no lo está. También es heredada y lenta en comparación con <code>HashMap</code>.</p><h3 id="13-diferencia-entre-list-y-set-en-java-respuesta-">13) ¿Diferencia entre List y Set en Java? (<a href="http://javarevisited.blogspot.sg/2012/04/difference-between-list-and-set-in-java.html#axzz53n9YK0Mb" rel="noopener">respuesta</a>)</h3><p>pista: Listestá ordenada y permite duplicacidad. Setestá desordenado y no permite elementos duplicados.</p><h3 id="14-diferencia-entre-arraylist-y-vectoren-java-respuesta-">14) Diferencia entre ArrayList y Vectoren Java (<a href="http://www.java67.com/2012/09/arraylist-vs-vector-in-java-interview.html" rel="noopener">respuesta</a>)</h3><p>pista: muchas, pero lo más importante es que ArrayList no está sincronizada y es rápida, mientras que Vector está sincronizada y es lenta. También es una clase heredada como Hashtable.</p><h3 id="15-diferencia-entre-hashtabley-concurrenthashmapen-java-respuesta-">15) ¿Diferencia entre Hashtabley ConcurrentHashMapen Java? (<a href="http://javarevisited.blogspot.sg/2011/04/difference-between-concurrenthashmap.html#axzz4qw7RoNvw" rel="noopener">respuesta</a>)</h3><p>pista: más escalable. Consulte <a href="https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-collections" rel="noopener">Fundamentos de Java: Colecciones</a> de Richard Warburton para obtener más información.</p><h3 id="16-c-mo-consigue-concurrenthashmap-escalabilidad-respuesta-">16) ¿Cómo consigue ConcurrentHashMap escalabilidad? (<a href="http://javarevisited.blogspot.sg/2017/08/top-10-java-concurrenthashmap-interview.html#axzz50U9xyqbo" rel="noopener">respuesta</a>)</h3><p>pista: dividiendo el mapa en segmentos y solo bloqueando durante la operación de escritura.</p><h3 id="17-qu-dos-m-todos-sobreescribir-para-que-objectse-use-como-keyen-hashmap-respuesta-">17) ¿Qué dos métodos sobreescribir para que Objectse use como Keyen HashMap? (<a href="http://www.java67.com/2013/06/how-get-method-of-hashmap-or-hashtable-works-internally.html" rel="noopener">respuesta</a>)</h3><p>pista: equals y hashcode</p><h3 id="18-diferencia-entre-esperar-y-dormir-en-java-respuesta-">18) ¿Diferencia entre esperar y dormir en Java? ( <a href="http://www.java67.com/2012/08/what-are-difference-between-wait-and.html" rel="noopener">respuesta</a> )</h3><p>pista: el método wait() libera el bloqueo o monitoriza, mientras que sleep() no lo hace.</p><h3 id="19-diferencia-entre-notify-y-notifyallen-java-respuesta-">19) ¿Diferencia entre notify y notifyAllen Java? (<a href="http://www.java67.com/2013/03/difference-between-wait-vs-notify-vs-notifyAll-java-thread.html" rel="noopener">respuesta</a>)</h3><p>pista: notify notifica que un subproceso aleatorio está esperando el bloqueo mientras notifyAll informa a todos los subprocesos que esperan un monitor. Si estás seguro de que solo hay un subproceso en espera, usa notify, sinó notifyAlles preferible. Consulta <a href="https://javaspecialists.teachable.com/p/threading-essentials/?product_id=539197&amp;coupon_code=SLACK100?affcode=92815_johrd7r8" rel="noopener">el minicurso de conceptos básicos de creación de subprocesos</a> impartido por el campeón de Java Heinz Kabutz para obtener más información sobre los conceptos básicos de creación de subprocesos.</p><h3 id="20-por-qu-anula-el-c-digo-hash-junto-con-equals-java-respuesta-">20) ¿Por qué anula el código hash, junto con equals()Java? (<a href="http://javarevisited.blogspot.sg/2015/01/why-override-equals-hashcode-or-tostring-java.html#axzz55oDxm8vv" rel="noopener">respuesta</a>)</h3><p>pista: para cumplir con la función de equals y hashcode, que se requiere si planeas almacenar un objeto en clases de colección, por ejemplo, HashMapo ArrayList.</p><h3 id="21-qu-representa-el-factor-de-carga-de-hashmap-respuesta-">21) ¿Qué representa el factor de carga de HashMap? (<a href="http://www.java67.com/2017/08/top-10-java-hashmap-interview-questions.html" rel="noopener">respuesta</a>)</h3><p>pista: el umbral que activa el cambio de tamaño HashMapes generalmente 0,75, lo que significa que HashMap cambia de tamaño si está lleno en un 75 por ciento.</p><h3 id="22-diferencia-entre-arraylist-y-linkedlisten-java-respuesta-">22) ¿Diferencia entre ArrayList y LinkedListen Java? (<a href="http://www.java67.com/2012/12/difference-between-arraylist-vs-LinkedList-java.html" rel="noopener">respuesta</a>)</h3><p>pista: la misma que una matriz y una lista vinculada, una permite la búsqueda aleatoria mientras que la otra no. La inserción y la eliminación son fáciles en la lista vinculada, pero la búsqueda es fácil en una matriz. Consulta <a href="https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-collections" rel="noopener"><strong><strong>Fundamentos de Java: Colecciones</strong></strong></a><strong><strong> ,</strong></strong> el curso de Richard Warburton sobre Pluralsight, para obtener más información sobre la estructura de datos de colección esencial en Java.</p><h3 id="23-diferencia-entre-countdownlatchy-cyclicbarrieren-java-respuesta-">23) ¿Diferencia entre CountDownLatchy CyclicBarrieren Java? (<a href="http://www.java67.com/2012/08/difference-between-countdownlatch-and-cyclicbarrier-java.html" rel="noopener">respuesta</a>)</h3><p>pista: puedes reutilizar CyclicBarrierdespués de que se rompa la barrera, pero no puedes reutilizar CountDownLatchdespués de que el conteo llegue a cero.</p><h3 id="24-cu-ndo-usar-runnable-vs-threaden-java-respuesta-">24) ¿Cuándo usar Runnable vs Threaden Java? (<a href="http://www.java67.com/2016/01/7-differences-between-extends-thread-vs-implements-Runnable-java.html" rel="noopener">respuesta</a>)</h3><p>pista: siempre</p><h3 id="25-cu-l-es-el-significado-de-que-enum-sea-seguro-para-tipos-en-java-respuesta-">25) ¿Cuál es el significado de que Enum sea seguro para tipos en Java? (<a href="http://www.java67.com/2014/04/what-java-developer-should-know-about-Enumeration-type-in-Java.html" rel="noopener">respuesta</a>)</h3><p>pista: significa que no se puede asignar una instancia de diferente tipo Enum a una variable Enum. por ejemplo, si tienes una variable como DiaDeLaSemana, entonces no puedes asignarle al día un valor desde una enumeración DiaDelMes.</p><h3 id="26-c-mo-funciona-autoboxing-of-integer-en-java-respuesta-">26) ¿Cómo funciona Autoboxing of Integer en Java? (<a href="http://javarevisited.blogspot.sg/2012/07/auto-boxing-and-unboxing-in-java-be.html#axzz59AWpr6cb" rel="noopener">respuesta</a>)</h3><p>pista: Usando el método valueOf() en Java.</p><h3 id="27-diferencia-entre-pathy-classpath-en-java-respuesta-">27) ¿Diferencia entre PATHy Classpath en Java? (<a href="http://www.java67.com/2012/08/what-is-path-and-classpath-in-java-difference.html" rel="noopener">respuesta</a>)</h3><p>pista: PATHlo utiliza el sistema operativo, mientras que Classpath lo utiliza JVM para localizar archivos binarios de Java, por ejemplo, archivos JAR o archivos de clase. Consulta <a href="https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-core-platform" rel="noopener">Fundamentos de Java: la plataforma principal</a> para obtener más información acerca de PATH, Classpath, y otras variables de entorno de Java.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/io-lPE67oMG1oBh204LvPm61t7kAcLFvp-B6" class="kg-image" alt="io-lPE67oMG1oBh204LvPm61t7kAcLFvp-B6" width="382" height="262" loading="lazy"></figure><h3 id="28-diferencia-entre-sobrecarga-y-anulaci-n-de-m-todos-en-java-respuesta-">28) ¿Diferencia entre sobrecarga y anulación de métodos en Java? (<a href="http://www.java67.com/2015/08/top-10-method-overloading-overriding-interview-questions-answers-java.html" rel="noopener">respuesta</a>)</h3><p>pista: la sobreescritura ocurre en la subclase mientras que la sobrecarga ocurre en la misma clase. Además, la sobreescritura es una actividad en tiempo de ejecución, mientras que la sobrecarga se resuelve en tiempo de compilación.</p><h3 id="29-c-mo-evitar-que-una-clase-se-subclasifique-en-java-respuesta-">29) ¿Cómo evitar que una clase se subclasifique en Java? (<a href="http://www.java67.com/2017/06/10-points-about-final-modifier-in-java.html" rel="noopener">respuesta</a>)</h3><p>pista: simplemente haciendo que tu constructor sea privado</p><h3 id="30-c-mo-restringir-una-clase-para-que-no-sea-utilizada-por-el-cliente-respuesta-">30) ¿Cómo restringir una clase para que no sea utilizada por el cliente? (<a href="http://javarevisited.blogspot.sg/2016/01/why-jpa-entity-or-hibernate-persistence-should-not-be-final-in-java.html" rel="noopener">respuesta</a>)</h3><p>pista: haciendo que el constructor sea privado o lanzando una excepción desde el constructor</p><h3 id="31-diferencia-entre-stringbuildery-stringbufferen-java-respuesta-">31) ¿Diferencia entre StringBuildery StringBufferen Java? (<a href="http://www.java67.com/2016/10/5-difference-between-stringbuffer.html" rel="noopener">respuesta</a>)</h3><p>pista: StringBuilderno está sincronizado mientras que StringBufferestá sincronizado.</p><h3 id="32-diferencia-entre-polimorfismo-y-herencia-en-java-respuesta-">32) ¿Diferencia entre polimorfismo y herencia en Java? (<a href="http://www.java67.com/2014/04/difference-between-polymorphism-and-Inheritance-java-oops.html" rel="noopener">respuesta</a>)</h3><p>pista: la herencia permite la reutilización del código y construye la relación entre clases, lo cual es requerido por el polimorfismo, que proporciona un comportamiento dinámico. Consulta <a href="https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-object-oriented-design" rel="noopener">Fundamentos de Java: diseño orientado a objetos</a> para obtener más información sobre las funciones de programación orientada a objetos.</p><h3 id="33-podemos-sobreescribir-un-m-todo-est-tico-en-java-respuesta-">33) ¿Podemos sobreescribir un método estático en Java? (<a href="http://www.java67.com/2012/08/can-we-override-static-method-in-java.html" rel="noopener">respuesta</a>)</h3><p>pista: No, porque la sobreescritura se resuelve en tiempo de ejecución mientras que la llamada al método estático se resuelve en tiempo de compilación.</p><h3 id="34-podemos-acceder-al-m-todo-privado-en-java-respuesta-">34) ¿Podemos acceder al método privado en Java? (<a href="http://www.java67.com/2012/08/can-we-override-private-method-in-java.html" rel="noopener">respuesta</a>)</h3><p>pista: sí, en la misma clase pero no fuera de la clase</p><h3 id="35-diferencia-entre-interfaz-y-clase-abstracta-en-java-respuesta-">35) ¿Diferencia entre interfaz y clase abstracta en Java? (<a href="http://www.java67.com/2017/08/difference-between-abstract-class-and-interface-in-java8.html" rel="noopener">respuesta</a>)</h3><p>pista: desde <a href="https://dzone.com/articles/5-courses-to-crack-java-certification-ocajp-1z0-80" rel="noopener">Java 8</a> , la diferencia es borrosa. Sin embargo, una clase Java aún puede implementar múltiples interfaces pero solo puede extender una clase.</p><h3 id="36-diferencia-entre-el-analizador-dom-y-sax-en-java-respuesta-">36) ¿Diferencia entre el analizador DOM y SAX en Java? (<a href="http://www.java67.com/2012/09/dom-vs-sax-parser-in-java-xml-parsing.html" rel="noopener">respuesta</a>)</h3><p>pista: DOM carga todo el archivo XML en la memoria mientras que SAX no lo hace. Es un analizador basado en eventos y se puede usar para analizar un archivo grande, DOM es rápido y es preferible para archivos pequeños.</p><h3 id="37-diferencia-entre-la-palabra-clave-throw-y-throws-en-java-respuesta-">37) ¿Diferencia entre la palabra clave throw y throws en Java? (<a href="http://www.java67.com/2012/10/difference-between-throw-vs-throws-in.html" rel="noopener">respuesta</a>)</h3><p>pista: throws declara qué excepción puede lanzar un método en caso de error, pero la palabra clave throw en realidad arroja una excepción. Consulta <a href="https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-exception-handling" rel="noopener">Conceptos básicos de Java: manejo de excepciones</a> para obtener más información sobre el manejo de excepciones en Java.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/QSqKD-b97Dr36kViV1eTdvqNVNgdZRp52D7n" class="kg-image" alt="QSqKD-b97Dr36kViV1eTdvqNVNgdZRp52D7n" width="718" height="316" loading="lazy"></figure><h3 id="38-diferencia-entre-iteradores-a-prueba-de-fallos-y-r-pidos-en-java-respuesta-">38) ¿Diferencia entre iteradores a prueba de fallos y rápidos en Java? (<a href="http://www.java67.com/2015/06/what-is-fail-safe-and-fail-fast-iterator-in-java.html" rel="noopener">respuesta</a>)</h3><p>pista: a prueba de fallos no arroja ConcurrentModificationException mientras que fail-fast lo hace cada vez que detecta un cambio externo en la colección subyacente mientras itera sobre ella.</p><h3 id="39-diferencia-entre-iterador-y-enumeraci-n-en-java-respuesta-">39) ¿Diferencia entre iterador y enumeración en Java? (<a href="http://javarevisited.blogspot.sg/2010/10/what-is-difference-between-enumeration.html#axzz59AWpr6cb" rel="noopener">respuesta</a>)</h3><p>pista: Iterator también proporciona la capacidad de eliminar un elemento mientras itera, sin embargo Enumeration no lo permite.</p><h3 id="40-qu-es-identityhashmap-en-java-respuesta-">40) ¿Qué es IdentityHashMap en Java? (<a href="http://www.java67.com/2016/09/difference-between-identityhashmap-weakhashmap-enummap-in-java.html" rel="noopener">respuesta</a>)</h3><p>pista: Un Map, que utiliza el operador de igualdad== para verificar la igualdad en lugar del método equals().</p><h3 id="41-qu-es-el-string-pool-en-java-respuesta-">41) ¿Qué es el String pool en Java? (<a href="http://javarevisited.blogspot.sg/2016/07/difference-in-string-pool-between-java6-java7.html#axzz4pGGwsyna" rel="noopener">respuesta</a>)</h3><p>pista: un grupo de String literales. Recuerda que se movió al heap desde el perm gen space en JDK 7.</p><h3 id="42-puede-una-clase-serializable-contener-un-campo-no-serializable-en-java-respuesta-">42) ¿Puede una clase Serializable contener un campo no serializable en Java? (<a href="http://javarevisited.blogspot.sg/2016/09/how-to-serialize-object-in-java-serialization-example.html" rel="noopener">respuesta</a>)</h3><p>pista: Sí, pero debe ser estático o transitorio.</p><h3 id="43-diferencia-entre-this-y-super-en-java-respuesta-">43) ¿Diferencia entre this y super en Java? (<a href="http://www.java67.com/2013/06/difference-between-this-and-super-keyword-java.html" rel="noopener">respuesta</a>)</h3><p>pista: this se refiere a la instancia actual, mientras que super se refiere a una instancia de la superclase.</p><h3 id="44-diferencia-entre-comparatory-comparableen-java-respuesta-">44) ¿Diferencia entre Comparatory Comparableen Java? (<a href="http://www.java67.com/2013/08/difference-between-comparator-and-comparable-in-java-interface-sorting.html" rel="noopener">respuesta</a>)</h3><p>pista: Comparatordefine el orden personalizado mientras Comparabledefine el orden natural de los objetos, por ejemplo, el orden alfabético para String. Consulta <a href="https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&amp;subid=0&amp;offerid=323058.1&amp;type=10&amp;tmpid=14538&amp;RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fjava-the-complete-java-developer-course%2F" rel="noopener">The Complete Java MasterClass</a> para obtener más información sobre la clasificación en Java.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/DOCGFtdTMhjj3faRAiQ69ZSTxf2pffyroFfv" class="kg-image" alt="DOCGFtdTMhjj3faRAiQ69ZSTxf2pffyroFfv" width="800" height="437" loading="lazy"></figure><h3 id="45-diferencia-entre-java-util-date-y-java-sql-date-en-java-respuesta-">45) ¿Diferencia entre java.util.Date y java.sql.Date en Java? (<a href="http://javarevisited.blogspot.sg/2012/04/difference-between-javautildate-and.html" rel="noopener">respuesta</a>)</h3><p>pista: la primera contiene tanto la fecha como la hora, mientras que la segunda contiene sólo &nbsp;parte de la fecha.</p><h3 id="46-por-qu-los-m-todos-esperar-y-notificar-se-declaran-en-la-claseobject-en-java-respuesta-">46) ¿Por qué los métodos esperar y notificar se declaran en la claseObject en Java? (<a href="http://javarevisited.blogspot.sg/2012/02/why-wait-notify-and-notifyall-is.html" rel="noopener">respuesta</a>)</h3><p>pista: porque requieren un bloqueo que solo está disponible para un Object.</p><h3 id="47-por-qu-java-no-admite-herencias-m-ltiples-respuesta-">47) ¿Por qué Java no admite herencias múltiples? (<a href="http://javarevisited.blogspot.sg/2011/07/why-multiple-inheritances-are-not.html" rel="noopener">respuesta</a>)</h3><p>pista: No es compatible debido a una mala experiencia con C++, pero con Java 8, en cierto sentido sí lo es; sólo la herencia múltiple deType no son compatibles con Java ahora.</p><h3 id="48-diferencia-entre-excepci-n-marcada-y-no-marcada-en-java-respuesta-">48) ¿Diferencia entre Excepción marcada y no marcada en Java? (<a href="http://javarevisited.blogspot.sg/2011/12/checked-vs-unchecked-exception-in-java.html" rel="noopener">respuesta</a>)</h3><p>pista: en caso de ser checked, debes manejar la excepción usando el bloque catch, mientras que en caso de no ser checked, depende del programador; no dará error al compilar.</p><h3 id="49-diferencia-entre-error-y-excepci-n-en-java-respuesta-">49) ¿Diferencia entre error y excepción en Java? (<a href="http://www.java67.com/2012/12/difference-between-error-vs-exception.html" rel="noopener">respuesta</a>)</h3><p>pista: estoy cansado de escribir por favor comprueba la respuesta</p><h3 id="50-diferencia-entre-la-condici-n-de-race-y-el-deadlock-en-java-respuesta-">50) ¿Diferencia entre la condición de Race y el Deadlock en Java? (<a href="http://javarevisited.blogspot.sg/2012/02/what-is-race-condition-in.html#axzz59AbkWuk9" rel="noopener">respuesta</a>)</h3><p>pista: ambos son errores que ocurren en una aplicación concurrente, uno ocurre debido a la programación de hilos, threads o subprocesos mientras que el otro ocurre debido a una codificación deficiente. Consulta <a href="https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&amp;subid=0&amp;offerid=323058.1&amp;type=10&amp;tmpid=14538&amp;RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fmultithreading-and-parallel-computing-in-java%2F" rel="noopener">Multithreading and Parallel Computing in Java (Cómputo en paralelo y subprocesos múltiples en Java</a>) para obtener más información sobre Deadlocks, condiciones de Race y otros problemas de subprocesos múltiples (multithreading).</p><h2 id="notas-de-cierre">Notas de cierre</h2><p>Gracias, Llegaste al final del artículo… ¡Buena suerte con tu entrevista de programación! Ciertamente no será fácil, pero siguiendo esta hoja de ruta y esta guía, estarás un paso más cerca de convertirte en un <a href="https://hackernoon.com/10-free-courses-to-learn-docker-for-programmers-and-devops-engineers-7ff2781fd6e0" rel="noopener">ingeniero de DevOps</a> .</p><h4 id="recursos-adicionales-en-ingl-s-"><strong>Recursos adicionales (en inglés)</strong></h4><blockquote><strong><strong>P</strong>.D. <strong>—</strong></strong> si necesitas algunos recursos GRATUITOS para aprender Java, puedes consultar esta lista de <strong><strong><a href="http://www.java67.com/2018/08/top-10-free-java-courses-for-beginners-experienced-developers.html" rel="noopener">cursos gratuitos de Java</a></strong></strong> para comenzar tu preparación.<br><br><strong><strong>P</strong>.<strong>S</strong>.<strong>S</strong>. <strong>—</strong> </strong>no he proporcionado la respuesta a las preguntas de la entrevista compartidas en la imagen "¿Cuántos objetos String se crean en el código?" ¿Podrías adivinar y explicar?</blockquote> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como aprobar las certificaciones en Java de Oracle: una guía práctica para desarrolladores ]]>
                </title>
                <description>
                    <![CDATA[ Una certificación en Java es muy estimada en la industria TI y provee de un reconocimiento mundial a un desarrollador Java. Te ayudará a conseguir un mejor empleo, un mejor salario o incluso, un aumento o bono en tu trabajo actual. Por esta razón, miles de programadores Java intentan certificarse ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-aprobar-las-certificaciones-en-java-de-oracle-una-guia-practica-para-desarrolladores/</link>
                <guid isPermaLink="false">63dd53ea12ea69079612c9d7</guid>
                
                    <category>
                        <![CDATA[ java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Franciscomelov ]]>
                </dc:creator>
                <pubDate>Wed, 01 Mar 2023 17:01:53 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/02/cake.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-pass-oracles-java-certifications-a-practical-guide-for-developers-e9b607ba6173/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Pass Oracle’s Java Certifications — a Practical Guide for Developers</a>
      </p><p>Una certificación en Java es muy estimada en la industria TI y provee de un reconocimiento mundial a un desarrollador Java. Te ayudará a conseguir un mejor empleo, un mejor salario o incluso, un aumento o bono en tu trabajo actual.</p><p>Por esta razón, miles de programadores Java intentan certificarse cada año, pero el éxito no es sencillo en este examen</p><p>La certificación en Java de Oracle tiene un porcentaje de aprobación <strong>cercano al 65% </strong>para OCAJP (the Oracle Certified Associate Java Programmer) y OCPJP (the Oracle Certified Professional Java Programmer).</p><p>Y necesitas un gran nivel de conocimiento en el lenguaje Java y la API para aprobar el examen.</p><p>Prepararte para el OCPJP no es muy diferente que hacerlo para el OCAJP, sin embargo, tendrás que usar recursos enfocados en OCPJP, también tendrás que abarcar más temas y tener una mayor preparación, porque OCPJP 8 es un hueso duro de roer.</p><p>Para que puedas prepararte bien y obtener una puntuación alta, compartiré algunos consejos. Estos consejos me han ayudado en el pasado a conseguir una puntuación de más del 90% en las certificaciones.</p><p>Y para no perder más tiempo, aquí están mis 5 consejos para preparar bien los exámenes OCAJP y OCPJP.</p><h3 id="1-escribe-c-digo-diariamente"><strong>1. Escribe código diariamente</strong></h3><p>No hay un sustituto para la práctica. Debes escribir código todos los días para desarrollar una lógica de programación que te ayudara a la hora de leer el código que vendrá en los exámenes.</p><p>En el caso del OCPJP, esto será aún más importante, ya que requerirás una gran atención al detalle para entender cada pregunta antes de poder contestar.</p><h3 id="2-nete-a-un-buen-curso"><strong>2. Únete a un buen curso</strong></h3><p>En mi opinión, los cursos en línea son una de las mejores formas de aprender una nueva tecnología en un corto periodo de tiempo, y es lo mismo para prepararte para un examen de certificación, como las Java de Oracle.</p><p>Son la segunda mejor manera de aprender, solo después de un instructor personal, ya que de esta forma aprenderás de la mano de profesionales con experiencia en la industria, que han pasado por el mismo camino y conocen los baches y errores con los que te podrías topar.</p><p>Cuando me preparé para mi certificación en Java hace más de 10 años, solamente había libros, en especial el libro de Khalid Mughal, pero ahora tú tienes muchas más opciones en libros y cursos.</p><ol><li><a href="http://shareasale.com/r.cfm?b=1130601&amp;u=880419&amp;m=43514&amp;urllink=&amp;afftrack=">Curso de entrenamiento Whizlab’s OCAJP 8 </a></li><li><a href="https://shareasale.com/r.cfm?b=1130600&amp;u=880419&amp;m=43514&amp;urllink=&amp;afftrack=">Curso de entrenamiento Whizlab’s OCPJP 8</a></li><li><a href="https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&amp;subid=0&amp;offerid=323058.1&amp;type=10&amp;tmpid=14538&amp;RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Foracle-java-associate-certification-exam-course-1z0-808%2F" rel="noopener"><strong><strong>Oracle Java Certification — Pass the Associate 1Z0–808 ExamOracle Java Certification — Pass the Associate 1Z0–808 ExamOracle Java Certification — Pass the Associate 1Z0–808 ExamOracle Java Certification — Pass the Associate 1Z0–808 ExamOracle Java Certification — Pass the Associate 1Z0–808 ExamOracle Java Certification — Pass the Associate 1Z0–808 ExamOracle Java Certification — Pass the Associate 1Z0–808 ExaOracle Java Certification — Pass the Associate 1Z0–808 Exam</strong></strong></a><a href="https://www.udemy.com/course/oracle-java-associate-certification-exam-course-1z0-808/?LSNPUBID=JVFxdTr9V80&amp;ranEAID=JVFxdTr9V80&amp;ranMID=39197&amp;ranSiteID=JVFxdTr9V80-uPQCbxTidzkMe.KyY9xaxQ">Certificación Oracle Java — Aprueba el examen Associate 1Z0–808</a></li></ol><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/02/letrero.jpg" class="kg-image" alt="letrero" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/02/letrero.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/02/letrero.jpg 700w" width="700" height="300" loading="lazy"></figure><h3 id="3-lee-una-buena-gu-a-de-estudio-"><strong>3. Lee una buena guía de estudio.</strong></h3><p>No hay mejor compañera que una buena guía de estudio si te estás preparando para una certificación en Java.</p><p>Cubren todos los temas del examen, tienen preguntas de práctica al final de cada capítulo y comparten muchos consejos enfocados a exámenes que no encontraras en un libro normal de Java.</p><p>Hay diferentes guías de estudio disponibles en el mercado, pero si te estás preparando para <a href="http://www.java67.com/2016/07/3-best-books-to-prepare-ocajp-7-1z0-803.html" rel="noopener">OCAJP 7</a> u <a href="https://javarevisited.blogspot.com/2017/07/ocajp-8-faq-oracle-certified-associate-certification-1z0-808-exam.html" rel="noopener">OCAJP 8</a> puedes visitar estas páginas para encontrar una buena guía de estudio.</p><ol><li><strong><a href="http://www.amazon.com/OCA-Certified-Associate-Programmer-1Z0-808/dp/1118957407?tag=javamysqlanta-20"><strong>OCA</strong> - <strong>Oracle Certified Associate Java SE 8 Programmer I</strong> -<strong> </strong>por <strong>Jean Boyarsky </strong>y <strong>Scott Selikoff</strong></a></strong></li><li><strong><a href="https://www.amazon.com/OCA-Java-Programmer-Certification-Guide/dp/1617293253?tag=javamysqlanta-20">Guía de certificacion <strong>OCA Java SE 8 Programmer I (Exam</strong>en<strong> 1Z0–808) (Mala Gupta)</strong></a></strong></li><li><strong><a href="https://www.amazon.com/Oracle-Certified-Professional-Programmer-1Z0-809/dp/1484218353/?tag=javamysqlanta-20"><strong>Oracle Certified Professional Java SE 8 Programmer</strong>, Examen <strong>1Z0–809 </strong>Por <strong>Ganesh, Hari</strong> y <strong>Tushar</strong></a></strong></li></ol><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/KmMNZ0-vGov5jRJC-qeEIYLqazi9-K7tb9Oo" class="kg-image" alt="KmMNZ0-vGov5jRJC-qeEIYLqazi9-K7tb9Oo" width="603" height="803" loading="lazy"></figure><h3 id="4-escoge-un-buen-simulador-de-examen-"><strong>4. Escoge un buen simulador de examen.</strong></h3><p>Después de escoger un buen libro o guía de estudio, necesitarás un simulador de examen. Esto es muy importante si quieres tener una calificación alta, pero si solo quieres pasar el examen no es tan necesario.</p><p>El simulador de examen te ayudará a desarrollar la velocidad y precisión requerida para completas todas las preguntas en 2.5 horas.</p><p>Recomiendo hacer exámenes de práctica hasta que alcances una calificación del 80% de manera constante antes de ir por el examen real.</p><p>Aquí hay algunas de mis recomendaciones de simuladores de examen:</p><ol><li><a href="http://shrsl.com/?g0ce" rel="noopener"><strong><strong>Whizlab’s Exam Simulator</strong></strong></a><br>Son los mejores en el mercado, probado por muchos desarrolladores, incluyéndome a mí.</li><li><strong><strong><a href="https://enthuware.com/index.php/java-mock-exams/oracle-certified-professional/java-se-8-1z0-809" rel="noopener">Enthuware’s Practice Test</a></strong></strong><br>La segunda mejor opción, en mi opinión y muy barato, lo puedes conseguir en menos de $10 dólares. También probado por muchos desarrolladores en java certificados.</li><li><a href="https://www.certification-questions.com/java8-dumps/1Z0-808-dumps.html?affiliateCode=fcff36fd-557a-4713-abf6-973e9924770f&amp;utm_source=Javin&amp;utm_medium=affiliate&amp;utm_campaign=affiliate" rel="noopener"><strong><strong>David Mayer’s Practice Test</strong></strong></a><br>Si quieres prepararte aún más, recomiendo resolver los más de 450 problemas del examen de David Mayer.</li><li><strong><strong><a href="https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&amp;subid=0&amp;offerid=323058.1&amp;type=10&amp;tmpid=14538&amp;RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fjava-oca%2F" rel="noopener">Java Certification: OCA (1Z0–808) Exam Simulation [2018]</a></strong></strong><br>Más de 260 preguntas de opción múltiple con explicación para pasar la certificación "Oracle Certified Associate, Java SE 8 Programmer I preparation"</li><li><a href="https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&amp;subid=0&amp;offerid=323058.1&amp;type=10&amp;tmpid=14538&amp;RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fjava-ocajp%2F" rel="noopener"><strong><strong>Java Certification — OCA (1Z0–808) Topic-wise Tests [2018]</strong></strong></a><br>Preguntas de opción múltiple que cubren todos los objetivos del examen "Oracle Certified Associate, Java SE 8 Programmer I"</li></ol><p>Por cierto, si decides comprar Whizlab’s simulator, puedes utilizar el cupón “<strong><strong>JAVACOMBO2”</strong></strong> para un descuento del 25%.</p><p>Ya que Whizlab, ofrece acceso de por vida a sus simuladores, recomiendo comprar ambos simuladores juntos, OCAJP y OCPJP, y aprovecha el cupón de descuento.</p><p></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/hHLYo2UvjIUmQzFAzHR78f8hpvtlwicpao9H" class="kg-image" alt="hHLYo2UvjIUmQzFAzHR78f8hpvtlwicpao9H" width="800" height="666" loading="lazy"></figure><h3 id="5-participa-en-foros-de-forma-regular"><strong>5. Participa en foros de forma regular</strong></h3><p>Tienes que motivarte y actualizarte respecto a los exámenes y otros detalles, por lo que no hay mejor manera de hacerlo que, participando en foros, como <a href="http://coderanch.com/" rel="noopener">CodeRanch</a> o el foro oficial de certificaciones Java de Oracle</p><p>Puedes hacer preguntas, responderlas y familiarizarte con otros usuarios que al igual que tú se preparan para sus exámenes.</p><p>Incluso podrías hacer amigos y amigas que te ayudarán a prepararte mejor para tu examen.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/SFhzfaXGxkJE3S29ZKniStDcZQNm4TJHuHAx" class="kg-image" alt="SFhzfaXGxkJE3S29ZKniStDcZQNm4TJHuHAx" width="800" height="354" loading="lazy"></figure><h3 id="6-responde-tantas-preguntas-como-sea-posible"><strong>6. Responde tantas preguntas como sea posible</strong></h3><p>La práctica hace al maestro, practica tanto como puedas y poco a poco desarrollaras la velocidad y precisión que requiere el examen.</p><p>Hay muchos exámenes gratis disponibles y Google es tu amigo. Puedes buscarlos y comenzar a practicar.</p><p>Aquí hay una lista de algunas <strong>preguntas de práctica gratis</strong> para los exámenes OCAJP 8 y OCPJP 8:</p><ol><li><a href="http://www.java67.com/2017/05/10-free-java-8-certification-sample-questions-OCAJP8-OCPJP8-Mock-Exams.html" rel="noopener">http://www.java67.com/2017/05/10-free-java-8-certification-sample-questions-OCAJP8-OCPJP8-Mock-Exams.html</a></li><li><a href="http://javarevisited.blogspot.sg/2015/11/5-free-ocajp8-ocpjp8-mock-exams-and-practice-questions.html#axzz5ACLhR0b5" rel="noopener">http://javarevisited.blogspot.sg/2015/11/5-free-ocajp8-ocpjp8-mock-exams-and-practice-questions.html#axzz5ACLhR0b5</a></li><li><a href="http://javarevisited.blogspot.sg/2016/08/5-free-ocajp-7-and-ocpjp7-mock-exams.html#axzz4pXl8Axsv" rel="noopener">http://javarevisited.blogspot.sg/2016/08/5-free-ocajp-7-and-ocpjp7-mock-exams.html#axzz4pXl8Axsv</a></li></ol><p>Si quieres prepararte lo mejor posible para las certificaciones Java, también puedes visitar estas páginas para obtener preguntas de prueba y exámenes de práctica:</p><p><a href="https://javarevisited.blogspot.com/2015/11/5-free-ocajp8-ocpjp8-mock-exams-and-practice-questions.html"><strong>5 exámenes de prueba y preguntas de práctica para </strong></a><strong><a href="https://javarevisited.blogspot.com/2015/11/5-free-ocajp8-ocpjp8-mock-exams-and-practice-questions.html"><strong>OCAJP8, OCPJP8 &nbsp;- 1Z0-808 809 (</strong></a></strong><a href="https://javarevisited.blogspot.com/2015/11/5-free-ocajp8-ocpjp8-mock-exams-and-practice-questions.html"><strong>Certificación </strong></a><strong><a href="https://javarevisited.blogspot.com/2015/11/5-free-ocajp8-ocpjp8-mock-exams-and-practice-questions.html"><strong>Java 8)</strong></a>.</strong></p><p><strong><a href="http://www.java67.com/2017/05/10-free-java-8-certification-sample-questions-OCAJP8-OCPJP8-Mock-Exams.html">10 preguntas de muestra en Java 8 para las certificaciones<strong> - OCAJP8 </strong>y <strong>OCPJP8 - 1Z0-808 </strong>y <strong>1Z09</strong>.</a></strong></p><h3 id="otros-recursos-tiles-para-las-certificaciones-en-java-8-"><strong>Otros recursos útiles para las certificaciones en Java 8:</strong></h3><p>Aquí puedes encontrar recursos útiles para los exámenes OCAJP8 (<a href="http://javarevisited.blogspot.com/2017/04/ocajp-1z0-808-best-books-and-mock-exams-Java8-certification.html" rel="noopener">1Z0–808</a>) y OCAPJP8 (<a href="http://www.java67.com/2017/05/top-5-books-for-ocajp8-and-ocpjp8-Java-8-certification-exam.html" rel="noopener">1Z0–809</a>).</p><p>Algunos recursos son gratis y otros los tendrás que comprar, pero teniendo en cuenta el precio de los exámenes, que es de <strong><strong>245 USD</strong></strong>, vale la pena gastar un poco más, en lugar de no pasar el examen y tener que volver a tomarlo.</p><ul><li><a href="https://javarevisited.blogspot.com/2015/11/5-free-ocajp8-ocpjp8-mock-exams-and-practice-questions.html">Exámenes de prueba para OCAJP 8 y OCPJP8 </a></li><li><a href="http://javarevisited.blogspot.com/2016/11/top-5-java-8-practice-test-and-exam-simulators-best-OCAJP-OCAPJP.html" rel="noopener">Los mejores simuladores de examen para OCAJP8 y OCPJP8</a></li><li><a href="https://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=5001&amp;get_params=p_exam_id:1Z0-809" rel="noopener">Plan de estudio completo y especificaciones de Java SE 8 para la certificación (OCAJP 8)</a></li><li><a href="http://www.pearsonvue.com/oracle/" rel="noopener">Enlace para registrarte al examen de Java 8</a></li><li><a href="http://www.java67.com/2015/07/5-books-learn-java-8-functional-programming.html" rel="noopener">Los mejores 8 libros de Java 8 </a></li><li><a href="http://javarevisited.blogspot.com/2014/01/does-java-certifications-like-scjp-ocjp-ocpjp-helps-carrer-job-interviews.html" rel="noopener">Beneficios de hacer una certificación en Java</a></li><li><a href="http://javarevisited.blogspot.com/2016/12/5-tips-to-prepare-for-oracle-java-certifications-OCAJP-OCPJP-exams.html" rel="noopener">Consejos de preparación &nbsp;para la certificación OCAJP8</a></li><li><a href="https://javarevisited.blogspot.com/2017/07/ocajp-8-faq-oracle-certified-associate-certification-1z0-808-exam.html" rel="noopener">OCAJP 8 - preguntas frecuentes de desarrolladores</a></li></ul><h4 id="notas-finales">Notas finales</h4><p>Gracias, llegaste al final del artículo... Buena suerte con tu examen de certificación en Java. Es cierto que no será fácil, pero siguiendo esta ruta de estudio y los consejos, estas un paso más cerca de ser un desarrollador certificado en Java.</p><h4 id="p-d-si-necesitas-m-s-recursos-gratis-puedes-revisar-esta-lista-de-ex-menes-de-prueba-para-ocajp-8-y-ocpjp-8-"><strong>P.D. — Si necesitas más recursos gratis, puedes revisar esta lista de </strong><a href="https://javarevisited.blogspot.com/2015/11/5-free-ocajp8-ocpjp8-mock-exams-and-practice-questions.html"><strong>exámenes de prueba para OCAJP 8 y OCPJP 8</strong></a><strong>.</strong></h4> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de métodos de lista de Java: ejemplo de API de lista de utilidades ]]>
                </title>
                <description>
                    <![CDATA[ Las listas son estructuras de datos comúnmente utilizadas en todos los lenguajes de programación. En este tutorial vamos a investigar la API List de Java. Comenzaremos con las operaciones básicas y luego nos adentraremos en cosas más avanzadas (como una comparación de diferentes tipos de listas, como ArrayList y LinkedList). ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/metodos-de-lista-de-java/</link>
                <guid isPermaLink="false">63ebbe4622450a0629adc5b7</guid>
                
                    <category>
                        <![CDATA[ java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Enrique Viveros Acosta ]]>
                </dc:creator>
                <pubDate>Tue, 21 Feb 2023 14:47:37 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/02/collection0.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/java-list-tutorial-util-list-api-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Java List Methods Tutorial – Util List API Example</a>
      </p><p>Las listas son estructuras de datos comúnmente utilizadas en todos los lenguajes de programación.</p><p>En este tutorial vamos a investigar la API List de Java. Comenzaremos con las operaciones básicas y luego nos adentraremos en cosas más avanzadas (como una comparación de diferentes tipos de listas, como ArrayList y LinkedList).</p><p>También te daré algunas pautas para ayudarte a elegir la implementación de la lista que mejor se adapte a tu situación.</p><p>Aunque el conocimiento básico de Java es suficiente para seguir el tutorial, la última sección requiere estructuras de datos básicas (Array, LinkedList) y conocimiento de <a href="https://en.wikipedia.org/wiki/Big_O_notation">Big-O</a>. Si no estás familiarizado con ellos, no dudes en omitir esa sección.</p><h2 id="definici-n-de-listas"><strong>Definición de listas</strong></h2><p>Las listas son colecciones ordenadas de objetos. Son similares a las secuencias en matemáticas en ese sentido. Sin embargo, son diferentes a los conjuntos que no tienen un cierto orden.</p><p>Un par de cosas a tener en cuenta: las listas pueden tener elementos duplicados y nulos. Son tipos de referencia o de objeto y, como todos los objetos en Java, se almacenan en las pilas.</p><p>Una lista en Java es una interfaz y hay muchos tipos de listas que implementan esta interfaz.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/09/ListHierarchy.png" class="kg-image" alt="ListHierarchy" width="600" height="400" loading="lazy"><figcaption>Collection Hierarchy</figcaption></figure><p>Usaré ArrayList en los primeros ejemplos, porque es el tipo de lista más utilizado.</p><p>ArrayList es básicamente un arreglo de tamaño variable. Casi siempre, vas a querer usar ArrayList en lugar de arreglos regulares, ya que brindan muchos métodos útiles.</p><p>La única ventaja de un arreglo solía ser su tamaño fijo (al no asignar más espacio del que necesita). Pero las listas también admiten tamaños fijos ahora.</p><h2 id="c-mo-crear-una-lista-en-java"><strong>Cómo crear una lista en Java </strong></h2><p>Basta de charlas, empecemos por crear nuestra lista.</p><pre><code class="language-java">import java.util.ArrayList;
import java.util.List;

public class CreateArrayList {
    public static void main(String[] args) {
        ArrayList&lt;Integer&gt; list0 = new ArrayList&lt;&gt;();

        // Makes use of polymorphism
        List list = new ArrayList&lt;Integer&gt;();

        // Local variable with "var" keyword, Java 10
        var list2 = new ArrayList&lt;Integer&gt;();
    }
}</code></pre><p>En los corchetes angulares (&lt;&gt;) especificamos el tipo de objetos que vamos a almacenar.</p><p>Tenga en cuenta que <strong>el tipo entre paréntesis debe ser un tipo de objeto y no un tipo primitivo</strong>. Por lo tanto, tenemos que usar envoltorios de objetos, clase Integer en lugar de int, Double en lugar de double, y así sucesivamente.</p><p>Hay muchas formas de crear una ArrayList, pero presenté tres formas comunes en el fragmento anterior.</p><p>La primera forma es creando el objeto a partir de la clase ArrayList concreta, especificando ArrayList en el lado izquierdo de la asignación.</p><p>El segundo fragmento de código hace uso del polimorfismo mediante el uso de la lista en el lado izquierdo. Esto hace que la asignación se acople libremente con la clase ArrayList y nos permite asignar otros tipos de listas y cambiar fácilmente a una implementación de Lista diferente.</p><p>La tercera forma es la forma Java 10 de crear variables locales haciendo uso de la palabra clave var. El compilador interpreta el tipo de variable comprobando el lado derecho.</p><p>Podemos ver que todas las asignaciones dan como resultado el mismo tipo:</p><pre><code class="language-java">System.out.println(list0.getClass());
System.out.println(list.getClass());
System.out.println(list2.getClass());</code></pre><p>Output:</p><pre><code class="language-java">class java.util.ArrayList
class java.util.ArrayList
class java.util.ArrayList
</code></pre><p>También podemos especificar la capacidad inicial de la lista.</p><pre><code class="language-java">List list = new ArrayList&lt;&gt;(20);</code></pre><p>Esto es útil porque cada vez que la lista se llena e intenta agregar otro elemento, la lista actual se copia en una nueva lista con el doble de capacidad que la lista anterior. Todo esto sucede detrás de escena.</p><p>Esta operación hace que nuestra complejidad sea O(n), por lo que queremos evitarla. La capacidad por defecto es 10, por lo que si sabes que vas a almacenar más elementos, debes especificar la capacidad inicial.</p><h2 id="c-mo-agregar-y-actualizar-elementos-de-lista-en-java"><strong>Cómo agregar y actualizar elementos de lista en Java</strong></h2><p>Para agregar elementos a la lista podemos usar el método add. También podemos especificar el índice del nuevo elemento, pero ten cuidado al hacerlo, ya que puedes generar una excepción <em><em>IndexOutOfBoundsException</em></em>.</p><pre><code class="language-java">import java.util.ArrayList;

public class AddElement {
    public static void main(String[] args) {
        ArrayList&lt;String&gt; list = new ArrayList&lt;&gt;();
        list.add("hello");
        list.add(1, "world");
        System.out.println(list);
    }
}</code></pre><p>Resultado:</p><pre><code>[hello, world]</code></pre><p>Podemos usar el método set para actualizar un elemento.</p><pre><code class="language-java">list.set(1, "from the otherside");
System.out.println(list);</code></pre><p>Resultado:</p><pre><code>[hello, world]
[hello, from the otherside]</code></pre><h2 id="c-mo-recuperar-y-eliminar-elementos-de-lista-en-java"><strong>Cómo recuperar y eliminar elementos de lista en Java</strong></h2><p>Para recuperar un elemento de la lista, puedes usar el método get y proporcionar el índice del elemento que desea obtener.</p><pre><code class="language-java">import java.util.ArrayList;
import java.util.List;

public class GetElement {
    public static void main(String[] args) {
        List list = new ArrayList&lt;String&gt;();
        list.add("hello");
        list.add("freeCodeCamp");

        System.out.println(list.get(1));
    }
}</code></pre><p>Resultado:</p><pre><code class="language-java">freeCodeCamp
</code></pre><p>La complejidad de esta operación en ArrayList es O(1) ya que utiliza un arrelgo de acceso aleatorio regular en segundo plano.</p><p>Para eliminar un elemento de ArrayList, se utiliza el método remove.</p><pre><code class="language-java">list.remove(0);</code></pre><p>Esto elimina el elemento en el índice 0, que es "hola" en este ejemplo.</p><p>También podemos llamar al método remove con un elemento para buscarlo y eliminarlo. Ten en cuenta que solo elimina la primera aparición del elemento si está presente.</p><pre><code class="language-java">public static void main(String[] args) {
        List list = new ArrayList();
        list.add("hello");
        list.add("freeCodeCamp");
        list.add("freeCodeCamp");

        list.remove("freeCodeCamp");
        System.out.println(list);
    }</code></pre><p>Resultado:</p><pre><code class="language-java">[hello, freeCodeCamp]</code></pre><p>Para eliminar todas las ocurrencias, podemos usar el método <em><em>removeAll</em></em> de la misma manera.</p><p>Estos métodos están dentro de la interfaz de List, por lo que todas las implementaciones de List los tienen (ya sea ArrayList, LinkedList o Vector).</p><h2 id="c-mo-obtener-la-longitud-de-una-lista-en-java"><strong>Cómo obtener la longitud de una lista en Java</strong></h2><p>Para obtener la longitud de una lista, o el número de elementos, podemos usar el método size().</p><pre><code class="language-java">import java.util.ArrayList;
import java.util.List;

public class GetSize {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("Welcome");
        list.add("to my post");
        System.out.println(list.size());
    }
}
</code></pre><p>Resultado:</p><pre><code>2</code></pre><h2 id="listas-bidimensionales-en-java"><strong>Listas bidimensionales en Java</strong></h2><p>Es posible crear listas bidimensionales, similares a los arreglos 2D.</p><pre><code class="language-java">ArrayList&lt;ArrayList&lt;Integer&gt;&gt; listOfLists = new ArrayList&lt;&gt;();</code></pre><p>Usamos esta sintaxis para crear una lista de listas, y cada lista interna almacena números enteros. Pero aún no hemos inicializado las listas internas. Necesitamos crearlos y ponerlas en esta lista nosotros mismos:</p><pre><code class="language-java">int numberOfLists = 3;
for (int i = 0; i &lt; numberOfLists; i++) {
    listOfLists.add(new ArrayList&lt;&gt;());
}</code></pre><p>Estoy inicializando mis listas internas y estoy agregando 3 listas en este caso. También puedo agregar listas más adelante si es necesario.</p><p>Ahora podemos agregar elementos a nuestras listas internas. Para agregar un elemento, primero debemos obtener la referencia a la lista interna.</p><p>Por ejemplo, digamos que queremos agregar un elemento a la primera lista. Necesitamos obtener la primera lista y luego agregarla.</p><figure class="kg-card kg-code-card"><pre><code class="language-java">listOfLists.get(0).add(1);</code></pre><figcaption>Adding elements to 2D list</figcaption></figure><p>Aquí hay un ejemplo para ti. Intenta adivinar el resultado del siguiente segmento de código:</p><pre><code class="language-java">public static void main(String[] args) {
        ArrayList&lt;ArrayList&lt;Integer&gt;&gt; listOfLists = new ArrayList&lt;&gt;();
        System.out.println(listOfLists);
        int numberOfLists = 3;
        for (int i = 0; i &lt; numberOfLists; i++) {
            listOfLists.add(new ArrayList&lt;&gt;());
        }

        System.out.println(listOfLists);

        listOfLists.get(0).add(1);
        listOfLists.get(1).add(2);
        listOfLists.get(2).add(0,3);

        System.out.println(listOfLists);
}</code></pre><p>Resultado:</p><pre><code>[]
[[], [], []]
[[1], [2], [3]]</code></pre><p>Ten en cuenta que es posible imprimir las listas directamente (a diferencia de los arreglos regulares) porque anulan el método t<em><em>toString()</em></em>.</p><h2 id="m-todos-tiles-en-java"><strong>Métodos útiles en Java</strong></h2><p>Existen otros métodos y atajos útiles que se utilizan con frecuencia. En esta sección quiero familiarizarte con algunos de ellos para que te resulte más fácil trabajar con listas.</p><h3 id="c-mo-crear-una-lista-con-elementos-en-java"><strong>Cómo crear una lista con elementos en Java </strong></h3><p>Es posible crear y completar la lista con algunos elementos en una sola línea. Hay dos maneras de hacer esto.</p><p>La siguiente es la forma de la vieja escuela:</p><pre><code class="language-java">public static void main(String[] args) {
        List&lt;String&gt; list = Arrays.asList(
                                "freeCodeCamp",
                                "let's",
                                "create");
 }</code></pre><p>Debes tener cuidado con una cosa al usar este método: Arrays.asList devuelve una lista inmutable. Entonces, si intentas agregar o eliminar elementos después de crear el objeto, obtendrás una excepción <em><em>UnsupportedOperationException.</em></em></p><p>Es posible que tengas la tentación de usar la palabra clave <em><em>final</em></em> para que la lista sea inmutable, pero no funcionará como se esperaba.</p><p>Simplemente, se asegura de que la referencia al objeto no cambie, no le importa lo que sucede dentro del objeto. Por lo que permite poner y quitar.</p><pre><code class="language-java">final List&lt;String&gt; list2 = new ArrayList&lt;&gt;();
list2.add("erinc.io is the best blog ever!");
System.out.println(list2);</code></pre><p>Resultado:</p><pre><code>[erinc.io is the best blog ever!]
</code></pre><p>Ahora veamos la forma moderna de hacerlo:</p><pre><code class="language-java">ArrayList&lt;String&gt; friends =  new ArrayList&lt;&gt;(List.of("Gulbike", "Sinem", "Mete"));
</code></pre><p>El método <em><em>List.of</em> </em> se envió con Java 9. Este método también devuelve una lista inmutable, pero podemos pasarla al constructor ArrayList para crear una lista mutable con esos elementos. Podemos agregar y quitar elementos a esta lista sin ningún problema.</p><h3 id="c-mo-crear-una-lista-con-n-copias-de-alg-n-elemento-en-java"><strong>Cómo crear una lista con N copias de algún elemento en Java</strong></h3><p>Java proporciona un método llamado <em><em>NCopies</em></em> que es especialmente útil para la evaluación comparativa. Puedes llenar un arreglo con cualquier número de elementos en una sola línea.</p><pre><code class="language-java">public class NCopies {
    public static void main(String[] args) {
        List&lt;String&gt; list = Collections.nCopies(10, "HELLO");
        System.out.println(list);
    }
}</code></pre><p>Resultado:</p><pre><code class="language-java">[HELLO, HELLO, HELLO, HELLO, HELLO, HELLO, HELLO, HELLO, HELLO, HELLO]
</code></pre><h3 id="c-mo-clonar-una-lista-en-java"><strong>Cómo clonar una lista en Java </strong></h3><p>Como se mencionó anteriormente, las Listas son tipos de referencia, por lo que se les aplican las reglas de paso por referencia.</p><pre><code class="language-java">public static void main(String[] args) {
        List list1 = new ArrayList&lt;String&gt;();
        list1.add("Hello");
        List list2 = list1;
        list2.add(" World");

        System.out.println(list1);
        System.out.println(list2);
}</code></pre><p>Resultado:</p><pre><code class="language-java">[Hello,  World]
[Hello,  World]</code></pre><p>La variable list1 contiene una referencia a la lista. Cuando lo asignamos a list2 también apunta al mismo objeto. Si no queremos que cambie la lista original, podemos clonar la lista.</p><pre><code class="language-java">ArrayList list3 = (ArrayList) list1.clone();
list3.add(" Of Java");

System.out.println(list1);
System.out.println(list3);</code></pre><p>Resultado:</p><pre><code class="language-java">[Hello,  World]
[Hello,  World,  Of Java]</code></pre><p>Dado que clonamos list1, list3 contiene una referencia a su clon en este caso. Por lo tanto, list1 permanece sin cambios.</p><h3 id="c-mo-copiar-una-lista-a-un-arreglo-en-java"><strong>Cómo copiar una lista a un arreglo en Java</strong></h3><p>A veces necesita convertir su lista en un arreglo para pasarla a un método que acepte un arreglo. Puedes usar el siguiente código para lograrlo:</p><pre><code class="language-java">List&lt;Integer&gt; list = new ArrayList&lt;&gt;(List.of(1, 2));
Integer[] toArray = list.toArray(new Integer[0]);</code></pre><p>Debe pasar un arreglo y el método <em><em>toArray</em></em> &nbsp;devuelve ese arreglo después de llenarla con los elementos de la lista.</p><h3 id="c-mo-ordenar-una-lista-en-java"><strong>Cómo ordenar una lista en Java </strong></h3><p>Para ordenar una lista podemos usar <em><em>Collections.sort</em></em>. Ordena en orden ascendente de forma predeterminada, pero también puedes pasar un comparador para ordenar con lógica personalizada.</p><pre><code class="language-java">List&lt;Integer&gt; toBeSorted = new ArrayList&lt;&gt;(List.of(3,2,4,1,-2));
Collections.sort(toBeSorted);
System.out.println(toBeSorted);</code></pre><p>Resultado:</p><pre><code>[-2, 1, 2, 3, 4]</code></pre><h2 id="c-mo-elejir-qu-tipo-de-lista-usar"><strong>Cómo elejir qué tipo de lista usar?</strong></h2><p>Antes de terminar este artículo, quiero brindarte una breve comparación de rendimiento de diferentes implementaciones de listas para que puedas elegir cuál es mejor para tu caso de uso.</p><p>Vamos a comparar ArrayList, LinkedList y Vector. Todos ellos tienen sus altibajos, así que asegúrate de considerar el contexto específico antes de decidir.</p><h3 id="java-arraylist-vs-linkedlist"><strong>Java ArrayList vs LinkedList</strong></h3><p>Aquí hay una comparación de tiempos de ejecución en términos de complejidad algorítmica.</p><pre><code class="language-markdown">|                       | ArrayList                  | LinkedList |
|-----------------------|----------------------------|------------|
| GET(index)            | O(1)                       | O(n)       |
| GET from Start or End | O(1)                       | O(1)       |
| ADD                   | O(1), if list is full O(n) | O(1)       |
| ADD(index)            | O(n)                       | O(1)       |
| Remove(index)         | O(n)                       | O(1)       |
| Search and Remove     | O(n)                       | O(n)       |</code></pre><p>Generally, the <em><em>get</em></em> operation is much faster on ArrayList but <em><em>add</em></em> and <em><em>remove</em></em> are faster on LinkedList.</p><p>En general, la operación <em><em>get</em></em> (obtener) es mucho más rápida en ArrayList, pero <em><em>add</em> (</em>agregar) y <em><em>remove</em> (</em>eliminar) son más rápidos en LinkedList.</p><p>ArrayList usa un arreglo detrás de escena, y cada vez que se elimina un elemento, los elementos de el arreglo deben cambiarse (que es una operación O (n)).</p><p>Elegir estructuras de datos es una tarea compleja y no existe una receta que se aplique a todas las situaciones. Aún así, intentaré proporcionar algunas pautas para ayudarte a tomar esa decisión más fácilmente:</p><ul><li>Si planeas hacer más operaciones de obtener y agregar que no sean eliminar, usa ArrayList ya que la operación de obtener es demasiado costosa en LinkedList. Tenga en cuenta que la inserción es O(1) solo si la llamas sin especificar el índice y la agrega al final de la lista.</li><li>Si vas a eliminar elementos y/o insertarlos en el medio (no al final) con frecuencia, puedes considerar cambiar a LinkedList porque estas operaciones son costosas en ArrayList.</li><li>Ten en cuenta que si accedes a los elementos secuencialmente (con un iterador), no experimentarás una pérdida de rendimiento con LinkedList mientras obtienes elementos.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/09/image-72.png" class="kg-image" alt="image-72" width="600" height="400" loading="lazy"><figcaption>Benchmark source: <a href="https://www.programcreek.com/2013/03/arraylist-vs-linkedlist-vs-vector/" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">programcreek</a></figcaption></figure><h3 id="java-arraylist-vs-vector"><strong>Java ArrayList vs Vector</strong></h3><p>Vector es muy similar a ArrayList. Si provienes de un entorno de C++, es posible que tengas la tentación de usar un Vector, pero su caso de uso es un poco diferente al de C++.</p><p>Los métodos de Vector tienen la palabra clave <a href="https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html"><strong>sincronizada</strong></a>, por lo que Vector garantiza la seguridad de subprocesos, mientras que ArrayList no.</p><p>Es posible que prefieras Vector sobre ArrayList en la programación de subprocesos múltiples o puedes usar ArrayList y manejar la sincronización usted mismo.</p><p>En un programa de subproceso único, es mejor quedarse con ArrayList porque la seguridad de subprocesos tiene un costo de rendimiento.</p><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>En esta publicación, he tratado de proporcionar una descripción general de la API de lista de Java. Hemos aprendido a usar métodos básicos y también hemos visto algunos trucos más avanzados para hacernos la vida más fácil.</p><p>También hicimos una comparación de ArrayList, LinkedList y Vector, que es un tema que se suele preguntar en las entrevistas.</p><p>Gracias por tomarse el tiempo de leer el artículo completo y espero que te &nbsp;haya sido útil.</p><p>Puedes acceder a todo el código desde este <a href="https://github.com/yigiterinc/list-api-tutorial">repositorio</a>.</p><p>Si estás interesado en leer más artículos como este, puede suscribirte a la lista de correo de mi <a href="https://erinc.io/">blog</a> para recibir una notificación cuando publique un nuevo artículo.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Métodos arreglo de Java- Cómo imprimir arreglos en Java ]]>
                </title>
                <description>
                    <![CDATA[ Un arreglo es una estructura de datos utilizada para almacenar datos del mismo tipo. Los arreglos almacenan sus elementos en ubicaciones de memoria contiguas. En Java, los arreglos son objetos. Todos los métodos se pueden ser invocados en un arreglo. Podemos almacenar un número fijo de elementos en un arreglo. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-imprimir-arreglos-en-java/</link>
                <guid isPermaLink="false">63cffc410498b10866212c25</guid>
                
                    <category>
                        <![CDATA[ java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Enrique Viveros Acosta ]]>
                </dc:creator>
                <pubDate>Mon, 30 Jan 2023 02:45:36 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/01/Untitled-design--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/java-array-methods-how-to-print-an-array-in-java/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Java Array Methods – How to Print an Array in Java</a>
      </p><p>Un arreglo es una estructura de datos utilizada para almacenar datos del mismo tipo. Los arreglos almacenan sus elementos en ubicaciones de memoria contiguas.</p><p>En Java, los arreglos son objetos. Todos los métodos se pueden ser invocados en un arreglo. Podemos almacenar un número fijo de elementos en un arreglo.</p><p>Declaremos un tipo simple de arreglo primitivo:</p><pre><code class="language-java">int[] intArray = {2,5,46,12,34};</code></pre><p>Ahora tratemos de imprimirlo con el método &nbsp;<code>System.out.println()</code>:</p><pre><code class="language-java">System.out.println(intArray);
// output: [I@74a14482</code></pre><p>¿Por qué no imprimió Java nuestro arreglo? ¿Qué está pasando detrás de escena?</p><p>El método <code>System.out.println()</code> &nbsp;convierte el objeto que pasamos en una cadena llamando &nbsp;<code>String.valueOf()</code>. Sí miramos a la implementación del método <code>String.valueOf()</code>, veremos esto:</p><pre><code class="language-java">public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}</code></pre><p>Si el objeto pasado es <code>null</code> retorna null, si no este llama <code>obj.toString()</code>. Finalmente, <code>System.out.println()</code> llama <code>toString()</code> a imprimir el resultado.</p><p>Si la clase de ese objeto anula la implementación de &nbsp;<code>Object.toString()</code>'s, llamará al método <code>Object.toString()</code>.</p><p><code>Object.toString()</code> retorna <code>getClass().getName()+</code><strong><strong><strong><strong><code>‘@’</code></strong></strong></strong></strong><code>+Integer.toHexString(hashCode())</code> . De modo simple, retorna: “nombre de la clase @ código hash del objeto”.</p><p>En nuestro resultado anterior <code>[I@74a14482</code>, el <code>[</code> indica que se trata de un arreglo, y <code>I</code> representa int (el tipo de arreglo). <code>74a14482</code> es la representación &nbsp;hexadecimal sin firma del código hash del arreglo.</p><p>Cada vez que estemos creando nuestras propias clases personalizadas, es una buena práctica anular el método <code>Object.toString()</code>.</p><p>No podemos imprimir arreglos en Java usando el método <code>System.out.println()</code>. En vez de eso, estas son las formas en las que podemos imprimir un arreglo: </p><ol><li>Bucles: bucle for y bucle for-each </li><li>método <code>Arrays.toString()</code> </li><li>método <code>Arrays.deepToString()</code> </li><li>método <code>Arrays.asList()</code></li><li>Interfaz Java Iterator </li><li>Java Stream API</li></ol><p>Veámoslos uno por uno.</p><h1 id="1-bucles-bucle-for-y-bucle-for-each"><strong>1. Bucles: </strong>bucle for y bucle for-each </h1><p>Aquí tenemos un ejemplo de un bucle for:</p><pre><code class="language-java">int[] intArray = {2,5,46,12,34};

for(int i=0; i&lt;intArray.length; i++){
    System.out.print(intArray[i]);
    // output: 25461234
}</code></pre><p>Todas las clases anulan &nbsp;<code>Object.toString()</code> y regresan una representación de cadena de su valor.</p><p>Aquí tenemos un bucle for-each:</p><pre><code class="language-java">int[] intArray = {2,5,46,12,34};

for(int i: intArray){
    System.out.print(i);
    // output: 25461234
}</code></pre><h1 id="2-m-todo-arrays-tostring-"><strong>2. Método Arrays.toString()</strong></h1><p><code>Arrays.toString()</code> es un método estático de la clase del arreglo que pertenece al paquete <code>java.util</code>. Retorna una representación de los contenidos del arreglo especificado. Podemos imprimir un arreglo unidimensional usando este método.</p><p>Los elementos del arreglo son convertidos a cadenas usando el método, <code>String.valueOf()</code>, de esta forma:</p><pre><code class="language-java">int[] intArray = {2,5,46,12,34};
System.out.println(Arrays.toString(intArray));
// output: [2, 5, 46, 12, 34]</code></pre><p>Para un tipo de referencia del arreglo, tenemos que asegurarnos que la clase del tipo de referencia anula el método <code>Object.toString()</code>.</p><p>Por ejemplo:</p><pre><code class="language-java">public class Test {
    public static void main(String[] args) {
        Estudiante[] estudiante = {new Estudiante("John"), new Estudiante("Doe")};
        
        System.out.println(Arrays.toString(estudiantes));
        // output: [Estudiante{name='John'}, Estudiante{name='Doe'}]
    }
}

class Estudiante {
    private String name;

    public Estudiante(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Estudiante{" + "name='" + name + '\'' + '}';
    }
}</code></pre><p>Este método no es apropiado para arreglos multidimensionales. Convierte los arreglos multidimensionales a cadenas usando <code>Object.toString()</code> que describe sus identidades en vez de sus contenidos.</p><p>Por ejemplo:</p><pre><code class="language-java">// creating multidimensional array
int[][] multiDimensionalArr = { {2,3}, {5,9} };

System.out.println(Arrays.toString(multiDimensionalArr));
// output: [[I@74a14482, [I@1540e19d]</code></pre><p>Con la ayuda de <code>Arrays.deepToString()</code>, podemos imprimir arreglos multidimensionales.</p><h1 id="3-m-todo-arrays-deeptostring-"><strong>3. Método Arrays.deepToString() </strong></h1><p><code>Arrays.deepToString()</code> retorna una representación de los "contenidos profundos" del arreglo especificado.</p><p>Si un elemento es un arreglo de un tipo primitivo, es convertido a una cadena invocando la sobrecarga adecuada de <code>Arrays.toString()</code>.</p><p>Aquí tenemos un ejemplo del tipo primitivo de un arreglo multidimensional:</p><pre><code class="language-java">// creating multidimensional array
int[][] multiDimensionalArr = { {2,3}, {5,9} };

System.out.println(Arrays.deepToString(multiDimensionalArr));
// output: [[2, 3], [5, 9]]</code></pre><p>Si un elemento es un arreglo del tipo de referencia, se convierte en una cadena invocando recursivamente <code>Arrays.deepToString()</code>.</p><pre><code class="language-java">Profesor[][] profesores = 
{{ new Profesor("John"), new Profesor("David") }, {new Profesor("Mary")} };

System.out.println(Arrays.deepToString(teachers));
// output: 
[[Profesor{name='John'}, Profesor{name='David'}],[Profesor{name='Mary'}]]</code></pre><p>Tenemos que anular &nbsp;<code>Object.toString()</code> en nuestra clase Profesor.</p><p>Si tienes curiosidad de cómo lo hace recursión, aquí encuentras el <a href="https://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/be44bff34df4/src/share/classes/java/util/Arrays.java#l4611">c<em>ódigo fuente</em></a> para el método &nbsp;<code>Arrays.deepToString()</code>.</p><p><strong><strong><strong><strong>N</strong></strong></strong>OTA<strong><strong><strong>:</strong></strong></strong></strong> Los arreglos unidimensionales de tipo de referencia también pueden ser impresos usando este método. Por ejemplo::</p><pre><code class="language-java">Integer[] oneDimensionalArr = {1,4,7};

System.out.println(Arrays.deepToString(oneDimensionalArr));
// output: [1, 4, 7]</code></pre><h1 id="4-m-todo-arrays-aslist-"><strong>4. Método Arrays.asList() </strong></h1><p>Este método regresa una lista de tamaño fijo respaldada por el arreglo especificado.</p><pre><code class="language-java">Integer[] intArray = {2,5,46,12,34};

System.out.println(Arrays.asList(intArray));
// output: [2, 5, 46, 12, 34]</code></pre><p>Hemos cambiado el tipo int a un número entero, porque List es una colección que guarda una lista de objetos. Cuando estamos convirtiendo un arreglo a una lista debería ser un arreglo de tipo de referencia.</p><p>Java llama &nbsp;<code>Arrays.</code><em><em><em><em><code>asList</code></em></em></em></em><code>(intArray).toString()</code>. Esta técnica usa internamente el método <code>toString()</code> &nbsp;del tipo de los elementos dentro de la lista.</p><p>Otro ejemplo con nuestra clase personalizada Profesor:</p><pre><code class="language-java">Profesor[] profesor = { new Profesor("John"), new Profesor("Mary") };

System.out.println(Arrays.asList(profesor));
// output: [Profesor{name='John'}, Profesor{name='Mary'}]</code></pre><p><strong><strong>NOT</strong>A<strong>:</strong></strong> No podemos imprimir arreglos multidimensionales usando este método. Por ejemplo:</p><pre><code class="language-java">Teacher[][] teachers = 
{{ new Teacher("John"), new Teacher("David") }, { new Teacher("Mary") }};
        
System.out.println(Arrays.asList(teachers));

// output: [[Lcom.thano.article.printarray.Teacher;@1540e19d, [Lcom.thano.article.printarray.Teacher;@677327b6]</code></pre><h1 id="5-interfaz-del-iterator-java"><strong>5. Interfaz del iterator Java</strong></h1><p>Similar a un bucle for-each, podemos usar la interfaz del iterador para recorrer los elementos del arreglo e imprimirlos.</p><p>Se puede crear un objeto iterator invocando el método <code>iterator()</code> sobre una colección (Collection). Ese objeto será usado para iterar sobre la Colección de elementos</p><p>Aquí tenemos un ejemplo de cómo podemos imprimir un arreglo usando la interfaz:</p><pre><code class="language-java">Integer[] intArray = {2,5,46,12,34};

// creando una lista de entero (List of Integer)
List&lt;Integer&gt; list = Arrays.asList(intArray);

// creando un  iterador de la lista de entero (Integer List)
Iterator&lt;Integer&gt; it = list.iterator();

// Si la lista tiene elementos que ser iterados
while(it.hasNext()) {
    System.out.print(it.next());
    // output: 25461234
}</code></pre><h1 id="6-java-stream-api"><strong>6. Java Stream API</strong></h1><p>La Stream API es usa para procesar colecciones de objetos. Una corriente (stream) es una secuencia de objetos. &nbsp;Las corrientes no cambian la estructura de datos original, solo proveen el resultado según las operaciones solicitadas.</p><p>Con la ayuda de a operación en el terminal <code>forEach()</code> podemos iterar a través de cada elemento de la corriente</p><p>Por ejemplo:</p><pre><code class="language-java">Integer[] intArray = {2,5,46,12,34};

Arrays.stream(intArray).forEach(System.out::print);
// output: 25461234</code></pre><p>Ahora ya sabemos cómo imprimir un arreglo en Java.</p><p>Gracias por leerme.</p><p>Imagen de portada por <a href="https://unsplash.com/@acharki95?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Aziz Acharki</a> en <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p><p>Puedes leer mis otros artículos en <a href="https://medium.com/@mvthanoshan9/object-oriented-programming-principles-in-java-820919dced1a">Medium</a>.</p><p><strong><strong><strong><strong>Happy Coding!</strong></strong></strong></strong></p><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Libros que Debes Leer para Aprender a Programar en Java ]]>
                </title>
                <description>
                    <![CDATA[ Hola a todos, hoy en día es el mundo de los cursos en línea. Todo el mundo habla de aprender en línea, Youtube, cursos gratuitos en Coursera y otros sitios web, lo cual es excelente, como cursos en línea pueden ayudar a aprender más rápido, pero creo que los libros ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/libros-que-debes-leer-para-aprender-a-programar-en-java/</link>
                <guid isPermaLink="false">63cb0114700708073437bdac</guid>
                
                    <category>
                        <![CDATA[ java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Vanessa Pineiro Morales ]]>
                </dc:creator>
                <pubDate>Tue, 24 Jan 2023 19:25:37 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/01/Screen-Shot-2023-01-20-at-4.04.45-PM.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/must-read-books-to-learn-java-programming-327a3768ea2f/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Must-read books to learn Java programming</a>
      </p><p>Hola a todos, hoy en día es el mundo de los cursos en línea. Todo el mundo habla de aprender en línea, Youtube, cursos gratuitos en Coursera y otros sitios web, lo cual es excelente, como cursos en línea pueden ayudar a aprender más rápido, pero creo que los libros aún deben ser una parte importante de su aprendizaje, ya que brindan el conocimiento más profundo y, a menudo, escrito por la autoridad en el tema.</p><p>Si estás aprendiendo programación Java, prepárese para conocer algunos de los libros más increíbles para aprender y dominar la programación Java en este artículo.</p><p>Cada vez que un programador comienza a aprender el lenguaje de programación Java, la primera pregunta que hacen es: "¿Qué libro debo consultar para aprender Java?" o “¿Cuál es el mejor libro para aprender Java para principiantes?” o “¿Puedes decirme algunos buenos libros para aprender Java?” Eso, en sí mismo, dice lo importante que son los libros de Java para los programadores, especialmente los principiantes.</p><p>A pesar de tener tantos recursos gratuitos disponibles en Java, como tutoriales, cursos en línea, consejos, blogs y ejemplos de código, los libros de Java tienen su propio lugar porque:</p><ul><li>Están escritos por programadores que son una autoridad en el tema.</li><li>Cubren el tema con más detalles y explicaciones.</li></ul><p>Estos libros de Java son mis favoritos personales, y cada vez que tengo tiempo, prefiero leerlos para refrescar mis conocimientos. Aunque ya he leído muchos de ellos (he leído <a href="https://www.amazon.com/Effective-Java-3rd-Joshua-Bloch/dp/0134685997/?tag=javamysqlanta-20" rel="noopener"><strong><strong>Effective Java</strong></strong></a> al menos cuatro veces hasta ahora), siempre quiero aprender algo nuevo y mi búsqueda de grandes libros nunca termina.</p><p>Estos libros son algunos de los mejores disponibles en la actualidad y son igualmente útiles para programadores de Java principiantes, intermedios y avanzados.</p><p>No importa si eres completamente nuevo en Java o si ha estado programando en Java durante algún tiempo, aprenderás muchas cosas nuevas a través de estos libros.</p><p>Habiendo dicho eso, no todos los libros son igualmente adecuados para todos los programadores. Para los principiantes, <a href="https://www.amazon.com/dp/0596009208/?tag=javamysqlanta-20"><em>Head First Java</em></a> sigue siendo el mejor libro para empezar, y para el desarrollador avanzado de Java, <a href="https://www.amazon.com/Effective-Java-3rd-Joshua-Bloch/dp/0134685997/?tag=javamysqlanta-20" rel="noopener"><em><em>Effective Java</em></em></a> es un buen libro para empezar.</p><h3 id="los-10-mejores-libros-para-aprender-a-programar-en-java">Los 10 Mejores Libros para Aprender a Programar en Java</h3><p>Aquí está mi colección de libros de Java que sugiero a todos los programadores que quieran aprender Java. Contiene libros para programadores principiantes y experimentados.</p><p>Estos libros cubren una variedad de áreas, incluidos los fundamentos básicos de Java, el framework de colección de Java, subprocesos múltiples y concurrencia, ajustes internos y de rendimiento de JVM, patrones de diseño, etc.</p><h4 id="1-head-first-java"><strong>1. Head First Java</strong></h4><p>Mucha gente pensará que este es un libro anticuado, pero para ser honesto, Head First Java es el mejor libro para cualquier programador que sea nuevo tanto en programación como en Java. La manera de explicar de cabeza es fenomenal y realmente disfruté su libro.</p><p>Head First Java cubre el conocimiento esencial de programación Java sobre características de clase, objeto, subproceso, colección y lenguaje, como genéricos, enumeraciones, argumentos variables o auto-boxing.</p><p>También tienen una sección avanzada sobre Swing, redes y Java IO, lo que los convierte en un paquete completo para principiantes de Java. Este debería ser el primer libro de Java que veas si estás empezando desde cero.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/51aHYpRqWvL._AC_SY1000_.jpeg" class="kg-image" alt="51aHYpRqWvL._AC_SY1000_" width="432" height="500" loading="lazy"></figure><p>Descargo de responsabilidad: recibiré una compensación si utilizas cualquier enlace de los libros enumerados aquí desde Amazon.</p><h4 id="2-head-first-design-patterns"><strong>2. Head First Design Patterns</strong></h4><p>El <a href="http://www.amazon.com/dp/0596007124/?tag=javamysqlanta-20" rel="noopener">Head First Design Pattern</a> es otro libro de Java de primera clase del laboratorio de Head-First.</p><p>Cuando comencé a leer este libro en 2006, no pensé mucho en los patrones de diseño, cómo resuelven problemas comunes, cómo aplicar un patrón de diseño, qué beneficios brindan y todo tipo de cosas básicas. Pero después de leer este libro de Java, me he beneficiado inmensamente.</p><p>El primer capítulo sobre herencia y composición, que es simplemente fantástico y promueve prácticas mejoradas al presentar un problema y luego la solución.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/61APhXCksuL._AC_SY1000_.jpeg" class="kg-image" alt="61APhXCksuL._AC_SY1000_" width="432" height="500" loading="lazy"></figure><p>Este libro también contiene viñetas útiles, ejercicios y mapas de memoria, que lo ayudan a comprender los patrones de diseño rápidamente.</p><p>Si desea aprender los patrones de diseño básicos de Java y los principios de diseño orientado a objetos, este es el primer libro de Java que debe consultar.</p><p>Una buena noticia sobre este libro es que la nueva edición se actualizó para Java SE 8, que le enseñará cómo desarrollar un patrón de diseño GOF clásico utilizando características de Java 8, como expresiones lambda y secuencias.</p><h4 id="3-effective-java"><strong>3. Effective Java</strong></h4><p><a href="http://www.amazon.com/dp/0321356683/?tag=javamysqlanta-20" rel="noopener">Effective Java</a> es uno de los mejores libros de Java en mi historial y uno de los más agradables. Tengo un gran respeto por Joshua Bloch, el autor, por su contribución al framework de la colección Java y al paquete Java Concurrency.</p><p>Effective Java es mejor para un programador experimentado que esté bien versado en la programación de Java. Es excelente para los programadores que desean compartir sus habilidades siguiendo las mejores prácticas de programación y que están ansiosos por escuchar a alguien que contribuyó al kit de desarrollo de Java (JDK).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/51N7QPvhS9L._AC_SY1000_.jpeg" class="kg-image" alt="51N7QPvhS9L._AC_SY1000_" width="497" height="648" loading="lazy"></figure><p>Effective Java consiste de una colección de las mejores prácticas de programación de Java, que van desde fábricas estáticas, serialización, igualdad y código hash hasta genéricos, enumeraciones, varargs y reflexión.</p><p>Este libro de programación Java cubre casi todos los aspectos de Java de una manera ligeramente diferente a la que está acostumbrado.</p><p>El año pasado se lanzó una nueva edición que introdujo funciones en JDK 7, 8 y 9, que se lanzó el año pasado en septiembre. También tiene un capítulo completo sobre lambdas.</p><h4 id="4-java-concurrency-in-practice"><strong>4. Java Concurrency in Practice</strong></h4><p><a href="https://www.amazon.com/dp/0321349601/?tag=javamysqlanta-20">Java Concurrency</a> in Practice es otro clásico de Joshua Bloch, Doug Lea y su equipo. Este es el mejor libro de Java sobre simultaneidad y subprocesos múltiples: una de las lecturas obligadas para los desarrolladores principales de Java.</p><p>Los puntos fuertes de la práctica de concurrencia en Java incluyen:</p><p>1) Este libro es muy detallado y captura detalles menores de subprocesos múltiples y concurrencia.</p><p>2) En lugar de centrarse en las clases básicas de Java, este libro se centra en las cuestiones y los problemas de concurrencia, como interbloqueo, inanición, seguridad de subprocesos, condiciones de carrera, y presenta formas de resolverlos utilizando clases de concurrencia de Java.</p><p>Este libro es un recurso excelente para aprender y dominar los paquetes y clases de concurrencia de Java, como CountDownLatch, CyclicBarrier, BlockingQueue o Semaphore. Esta es la principal razón por la que me gusta leer este libro de Java y leerlo una y otra vez.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/51v9-FC4MDL.jpeg" class="kg-image" alt="51v9-FC4MDL" width="378" height="500" loading="lazy"></figure><p>3) Otro punto fuerte de la práctica de concurrencia en Java son los ejemplos sensatos; los ejemplos de este libro son claros, concisos e inteligentes.</p><p>4) Este libro también es bueno para explicar lo que está mal y por qué está mal y cómo corregirlo, lo cual es esencial para que cualquier libro de Java tenga éxito.</p><p>En resumen, este es uno de los mejores libros para aprender concurrencia y subprocesos múltiples en Java. El contenido definitivamente es avanzado desde la perspectiva de un principiante, pero seguramente, este es un libro de lectura obligada para los programadores Java experimentados.</p><h4 id="5-java-generics-and-collections"><strong>5. Java Generics and Collections</strong></h4><p>The Java Generics and Collection de Naftalin y Philip Wadler de O'Reilly es otro buen libro sobre Java, que inicialmente olvidé incluir en mi lista pero lo incluyo ahora a pedido de muchos lectores.</p><p>Me gusta este libro por su contenido sobre genéricos y colecciones, que son áreas centrales del lenguaje Java.</p><p>Se espera que un programador experimentado tenga un conocimiento sólido de las colecciones y los genéricos de Java, y estos libros ayudan en esa área.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/41fJocDi3LL._AC_SY780_.jpeg" class="kg-image" alt="41fJocDi3LL._AC_SY780_" width="372" height="500" loading="lazy"></figure><p>Explica cada interfaz de colección, como Conjunto, Lista, Mapa, Cola, y su implementación, comparando qué tan bien funcionan en una situación diferente.</p><p>Realmente me encantó su tabla de comparación al final de cada capítulo, que le brinda una buena idea sobre cuándo usar una clase de colección de Java en particular, como <code>ArrayList</code>, <code>HashMap</code> o <code>LinkedHashMap</code>.</p><h4 id="6-java-performance-from-binu-john"><strong>6. Java Performance From Binu John</strong></h4><p>Este es otro buen libro que enseña sobre los aspectos internos de JVM, la recolección de basura, el ajuste de JVM y la creación de perfiles. etc., y recomiendo encarecidamente a todos los desarrolladores senior de Java que lean este libro. Este es también uno de mis favoritos personales.</p><p>Como nos estamos moviendo gradualmente, comenzamos desde un nivel de principiantes hasta un nivel intermedio y ahora el nivel superior.</p><p><em>Java Performance</em> tiene que ver con la supervisión del rendimiento, la creación de perfiles y las herramientas utilizadas para la supervisión del rendimiento de Java.</p><p>Este no es un libro de programación habitual. En su lugar, proporciona detalles sobre la JVM, la recolección de basura, la supervisión del almacenamiento dinámico de Java y la aplicación de generación de perfiles.</p><p>Me encantó su capítulo sobre la descripción general de JVM, y es una lectura obligada para obtener más información sobre JVM en un lenguaje sencillo.</p><p>Tanto los principiantes como los programadores intermedios pueden beneficiarse de este libro, pero es bueno tener algo de experiencia en Java antes de leerlo. Hasta ahora, este es el mejor libro de Java sobre monitoreo del rendimiento.</p><p>Este es otro libro de Java que debe leer si se toma en serio el rendimiento.</p><p>Hay un par de libros nuevos disponibles en Java, que cubren JDK 1.7. Para conocer el último libro sobre el rendimiento de Java, como <strong>Java Performance, The Definitive Guide de Scott Oaks</strong>, que sin duda vale la pena consultar antes de comprar este libro.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/Java-Performance-Definitive-Guide.jpeg" class="kg-image" alt="Java-Performance-Definitive-Guide" width="244" height="320" loading="lazy"></figure><h4 id="7-java-puzzlers"><strong>7. Java Puzzlers</strong></h4><p>Java Puzzlers es otro libro que vale la pena leer de Joshua Bloch, esta vez con Neal Gafter. Este libro trata sobre casos extremos y trampas en el lenguaje de programación Java.</p><p>Java es más seguro que C++, y la JVM hace un buen trabajo para liberar al programador de la asignación y desasignación de memoria propensa a errores. Pero aún así, Java tiene casos de esquina que pueden sorprender incluso al programador Java experimentado.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/Unknown.jpeg" class="kg-image" alt="Unknown" width="198" height="254" loading="lazy"></figure><p>Este libro de Java presenta estos peligros de Java y los explica con más detalle. Este es un buen libro de Java si le encantan los acertijos; incluso puede incluir muchos de estos en las entrevistas básicas de Java para verificar su conocimiento de Java.</p><p>No lo califico tan alto como <em><em>Effective Java</em></em> y <em><em>Java Concurrency in Practice</em></em>, pero aún puede intentarlo, especialmente para verificar su conocimiento sobre Java y sus casos de esquina, lo que lo ayudará a responder algunas de las preguntas difíciles de Java de entrevistas.</p><p>Para entender la mayor parte de este libro de Java, intente resolver acertijos usted mismo y luego busque explicaciones para que su conocimiento sea más concreto.</p><h4 id="8-head-first-object-oriented-analysis-and-design"><strong>8. Head First Object-Oriented Analysis and Design</strong></h4><p>Otro buen libro sobre principios de diseño y programación Java de la serie Head-First. <em>Head First Object-Oriented Analysis and Design</em> se puede leer junto con <em>Head First Design Patterns</em>.</p><p>Este libro se enfoca en los principios del diseño orientado a objetos, como favorecer la composición sobre la herencia, la programación para el interfaz en lugar de la implementación, DRY, etc.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/51FNFnkTMKL.jpeg" class="kg-image" alt="51FNFnkTMKL" width="432" height="500" loading="lazy"></figure><p>Una parte de aprender Java es escribir un buen código y seguir las mejores prácticas, y este libro es excelente para educar a los programadores sobre ellas.</p><p>El conocimiento obtenido con este libro es aplicable a muchos lenguajes de programación orientados a objetos y, en general, mejorará su comprensión del código y los principios de diseño de programación orientada a objetos.</p><h4 id="9-thinking-in-java"><strong>9. Thinking in Java</strong></h4><p><em><em>Thinking in Java</em></em> está escrito por Bruce Eckel, quien también es el autor de Thinking in C++ y usa su estilo único para enseñar el concepto de Java.</p><p>Muchos estarían de acuerdo en que este es uno de los mejores libros de Java, con una fortaleza que apunta a ejemplos inteligentes. Este es uno de los libros completos en Java y también puede usarse como referencia.</p><p>Hay un capítulo sobre IO mapeada en memoria de Java de <em>Thinking in Java</em>, que es mi favorito.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/61-ZAFCWcLL._AC_SY1000_.jpeg" class="kg-image" alt="61-ZAFCWcLL._AC_SY1000_" width="378" height="500" loading="lazy"></figure><p>Si no le gusta el estilo de enseñanza Head-First, pero necesita un libro de Java para principiantes con un estilo de ejemplo simple, <em>Thinking in Java</em> es una buena opción.</p><p>Es detallado, maduro y se actualiza con frecuencia, pero, si necesita más opciones, también puede consultar estos libros básicos de Java para principiantes.</p><h4 id="10-java-se-8-for-the-really-impatient"><strong><strong><strong>10. Java SE 8 for the Really Impatient</strong></strong></strong></h4><p>Este es uno de los mejores libros para aprender Java 8. También es mi libro Java 8 de propósito general. Si tienes menos tiempo y quieres aprender todas las cosas importantes sobre Java 8, este es el libro que debes consultar.</p><p>No tengo que recordarte de la habilidad de escribir de Cay. S. Horstmann’s, uno de los mejores autores en Java y a la altura de Joshua Bloch. He encontrado que ambos son muy legibles.</p><p>No te aburrirás, lo que suelen hacer los programadores cuando leen libros técnicos. Explica sobre la expresión lambda, Streams, interfaz funcional, referencias de métodos, nueva API de fecha y hora de Java y varias otras pequeñas mejoras como unir cadenas, anotaciones repetibles, etc. En resumen, uno de los mejores libros para aprender Java sin duda.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/51zveYV7hGL._AC_SY780_.jpeg" class="kg-image" alt="51zveYV7hGL._AC_SY780_" width="380" height="500" loading="lazy"></figure><h3 id="terminando">Terminando</h3><p>Esta fue mi lista de <strong>los mejores libros de programación Java</strong>. He leído todos los libros, algunos de ellos todavía los estoy leyendo y un par de ellos, como <em><em>Effective Java</em></em> y la serie Head-First, los he leído un par de veces. Muchos programadores me preguntan con qué libros deberían comenzar y qué libro de Java deberían leer ahora. Espero que hayas encontrado buenos libros en esta colección. ¡Feliz lectura!</p><h3 id="notas-finales"><strong>Notas finales</strong></h3><p>Gracias por leer este artículo hasta ahora. Puede que estés pensando que hay tantas cosas que aprender, tantos cursos a los que unirte, pero no tienes que preocuparte.</p><p>Soy un fanático particular de los cursos de Udemy, ya que son muy asequibles y brindan muchos valores en una cantidad muy pequeña, pero eres libre de elegir el curso que deseas.</p><p>Al final del día, debe tener suficiente conocimiento y experiencia al usar los recursos mencionados aquí.</p><p>¡Buena suerte con tu viaje por Java! Ciertamente <strong>no va a ser fácil</strong>, pero siguiendo esta hoja de ruta y guía, está un paso más cerca de convertirse en el desarrollador de Java que siempre quiso ser.</p><p>Si te gusta este artículo, considera seguirme en medium (javinpaul). Si desea recibir notificaciones de cada publicación nueva, ¡no olvide seguir a <a href="https://twitter.com/javarevisited">javarevisited</a> en Twitter!<br><br>Una vez más, todo lo mejor para su viaje de desarrollo de Java y muchas gracias a todos los autores por escribir libros tan increíbles. Estos libros de programación de Java son algunos de los mejores libros para aprender Java; incluso diría que algunos de ellos son los mejores libros de Java jamás publicados.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial JVM - La arquitectura de la máquina virtual de Java explicada para principiantes ]]>
                </title>
                <description>
                    <![CDATA[ Tanto si has programado en Java como si no, seguramente habrás escuchado hablar de la Máquina Virtual de Java (en inglés Java Virtual Machine, JVM) en algún momento. JVM es el núcleo del ecosistema Java, permitiendo al software basado en esta tecnología seguir el enfoque "escríbelo (tu programa) una sola ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-jvm-la-arquitectura-de-la-maquina-virtual-de-java-explicada-para-principiantes/</link>
                <guid isPermaLink="false">63403e99d632c3088e4f264f</guid>
                
                    <category>
                        <![CDATA[ java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Felipe Navarro ]]>
                </dc:creator>
                <pubDate>Mon, 28 Nov 2022 19:26:13 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/10/JVM-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/jvm-tutorial-java-virtual-machine-architecture-explained-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JVM Tutorial - Java Virtual Machine Architecture Explained for Beginners</a>
      </p><p>Tanto si has programado en Java como si no, seguramente habrás escuchado hablar de la Máquina Virtual de Java (en inglés <em>Java Virtual Machine</em>, <strong>JVM</strong>) en algún momento.</p><p>JVM es el núcleo del ecosistema Java, permitiendo al software basado en esta tecnología seguir el enfoque <em>"escríbelo </em>(tu programa)<em> una sola vez, ejecútalo en cualquier parte (write once, run anywhere)"</em>. Puedes escribir código Java en un tipo de máquina concreto, y ejecutarlo en cualquier otro tipo de máquina usando la JVM.</p><p>Inicialmente, la JVM fue diseñada para admitir Java solamente. Pero, con el paso de los años, muchos otros lenguajes como Scala, Kotlin y Groovy fueron adoptados por la plataforma Java. El conjunto de estos lenguajes se conoce como lenguajes JVM.</p><p>En este artículo aprenderemos las esencias de la JVM, cómo funciona y los componentes en que se divide.</p><h1 id="-qu-es-una-m-quina-virtual">¿Qué es una máquina virtual?</h1><p>Antes de entrar de lleno en la JVM, revisemos el concepto de máquina virtual (VM).</p><p>Una máquina virtual es la <em>representación virtual de un ordenador físico</em>. Normalmente, se llama huésped (<em>guest</em>) a la máquina virtual, mientras que al ordenador físico en que se ejecuta, se le suele llamar anfitrión (<em>host</em>).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/10/primera_dos.png" class="kg-image" alt="image-37" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/10/primera_dos.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/10/primera_dos.png 800w" sizes="(min-width: 720px) 720px" width="800" height="536" loading="lazy"></figure><p>Una sola máquina física puede ejecutar varias máquinas virtuales, cada una con su propio sistema operativo y aplicaciones a nivel de usuario; están aisladas unas de otras.</p><h1 id="-qu-es-la-m-quina-virtual-de-java">¿Qué es la Máquina Virtual de Java?</h1><p>En lenguajes de programación como C o C++, el código es compilado al código máquina específico de esa platoforma en concreto: son <em>lenguajes compilados</em>.</p><p>Por otro lado, en lenguajes como JavaScript o Python, el ordenador ejecuta las instrucciones directamente sin tener que compilarlas: son <em>lenguajes interpretados.</em></p><p>Java usa una combinación de ambas técnicas. El código es compilado a bytecode (un formato binario independiente del hardware y del sistema operativo, que representa instrucciones de la JVM) generando un fichero con formato <em>class</em>. Este fichero<em> class </em>es interpretado por la JVM en la plataforma anfitriona. Un mismo fichero <em>class </em>puede ser ejecutado por la JVM en cualquier plataforma y sistema operativo.</p><p><em>De manera similar a las máquinas virtuales,</em> la JVM crea un espacio aislado en la máquina anfitriona. Este espacio se usa para ejecutar programas Java sea cual sea la plataforma o el sistema operativo de dicha máquina.</p><h1 id="arquitectura-de-la-m-quina-virtual-de-java">Arquitectura de la Máquina Virtual de Java</h1><p>La JVM consta de tres componentes:</p><ol><li>Cargador de clases (<em>Class Loader</em>)</li><li>Área de datos/memoria en tiempo de ejecución (<em>Runtime Memory/Data Area)</em></li><li>Motor de ejecución (<em>Execution Engine</em>)</li></ol><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/10/figura2.png" class="kg-image" alt="image-39" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/10/figura2.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/10/figura2.png 725w" sizes="(min-width: 720px) 720px" width="725" height="388" loading="lazy"></figure><p>Echemos un vistazo a cada uno de ellos.</p><h2 id="cargador-de-clases">Cargador de clases</h2><p>Como resultado de la compilación del código fuente almacenado en un fichero<code>.java</code>, se obtiene bytecode almacenado en un fichero <code>.class</code> . Si en un programa se va a hacer uso de esta clase, será cargado en memoria principal por el cargador de clases.</p><p>La primera clase en ser cargada en memoria es, normalmente, aquella que contiene el método <code>main()</code> .</p><p>El proceso de carga de clases consta de tres fases: carga (<em>loading</em>), enlazado (<em>linking</em>), e inicialización (<em>initialization</em>).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/10/figura3-1.png" class="kg-image" alt="image-40" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/10/figura3-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/10/figura3-1.png 620w" width="620" height="309" loading="lazy"></figure><h3 id="carga-loading-">Carga <em>(loading)</em></h3><p>La fase de carga consiste en encontrar la representación binaria (bytecode) de una clase o interfaz con un nombre concreto, y crear una clase o interfaz a partir de dicha representación (<em>crear</em> una clase o interfaz <em>c</em> es construir una representación interna, específica de esa implementación de la JVM, de <em>c</em>).</p><p>Hay tres cargadores de clases incorporados:</p><ul><li><strong>Cargador de clases de arranque (</strong><em><strong>Bootstrap Class Loader</strong></em><strong>)</strong> <strong>-</strong> raíz de la jerarquía de cargadores de clases, superclase de Extension Class Loader. Carga los paquetes estándar de Java como <code>java.lang</code>, <code>java.net</code>, <code>java.util</code>, <code>java.io</code>, etc. localizados en el fichero <code>rt.jar</code> y otras bibliotecas fundamentales presentes en el directorio <code>$JAVA_HOME/jre/lib</code> .</li><li><strong>Cargador de clases de extensión (</strong><em><strong>Extension Class Loader</strong></em><strong>) -</strong> subclase de Bootstrap Class Loader y superclase de Application Class Loader. Carga las extensiones de las bibliotecas estándar de Java presentes en el directorio <code>$JAVA_HOME/jre/lib/ext</code> .</li><li><strong>Cargador de clases de aplicación (<em>Application Class Loader</em>) -</strong> es el cargador de clases en el nivel más bajo de la jerarquía, subclase de Extension Class Loader. Carga los ficheros indicados en el <em>classpath</em> (variable de entorno que almacena la ruta a las clases creadas por el usuario). Por defecto, la variable classpath es establecida al directorio actual de la aplicación; puede ser modificada desde la línea de comandos con la opción <code>-classpath</code> o <code>-cp</code> (al ejecutar <code>java</code> o <code>javac</code> , por ejemplo).</li></ul><p>La JVM usa el método <code>ClassLoader.loadClass()</code> para cargar una clase en memoria, haciendo uso del <em>nombre binario </em>de la clase.</p><p>Si un cargador de clases es incapaz de encontrar una clase, delega el trabajo en el cargador de una subclase suya. Si el último cargador de la jerarquía tampoco es capaz de encontrar la clase en cuestión, se producirá <code>NoClassDefFoundError</code> o <code>ClassNotFoundException</code><em>.</em></p><h3 id="enlazado-linking-">Enlazado <em>(linking)</em></h3><p>Después de que una clase haya sido cargada en memoria, se somete al proceso de enlazado. Enlazar una clase o una interfaz supone resolver las referencias externas y dependencias, integrando la clase en el conjunto del programa que hace uso de ella.</p><p>El enlazado incluye los siguientes pasos:</p><p><strong>Verificación:</strong> esta fase verifica la corrección estructural del archivo<code>.class</code> contrastándolo frente a un conjunto de restricciones o reglas. Si la verificación falla, se produce <code>VerifyException</code>.</p><p>Por ejemplo, si el código se ha construído con Java 11, pero se va a ejecutar en un sistema con Java 8, la fase de verificación fallará.</p><p><strong>Preparación:</strong> en esta fase, la JVM asigna memoria para los campos estáticos de una clase o interfaz, inicializándolos con valores por defecto.</p><p>Supón, como ejemplo, que has declarado en una clase la siguiente variable:</p><pre><code class="language-java">private static final boolean activado = true;</code></pre><p>Durante la fase de preparación, la JVM asigna memoria para la variable <code>activado</code> y le asigna el valor por defecto para un booleano, que es <code>false</code>.</p><p><strong>Resolución:</strong> es el proceso de resolver dinámicamente las referencias simbólicas presentes en el almacén de constantes de tiempo de ejecución (<em>runtime constant pool, </em>una estructura de datos del fichero <code>.class</code>).</p><p>Las referencias (simbólicas) que dentro de una clase se hacen a otras clases o a constantes presentes en otras clases, son resueltas en esta etapa asignándoles los valores reales.</p><h3 id="inicializaci-n-initialization-">Inicialización <em>(initialization)</em></h3><p>La inicialización consiste en ejecutar <code>&lt;clinit&gt;</code>, el método de inicialización de una clase o interfaz. En esta etapa se ejecutan los bloques de inicialización estáticos y se asignan los valores a las variables estáticas. Es el paso final del proceso de carga de clases.</p><p>Por ejemplo, cuando anteriormente hemos declarado el siguiente código:</p><pre><code class="language-java">private static final boolean activado = true;</code></pre><p>La variable <code>activado</code> fue establecida con su valor por defecto, <code>false</code> , durante la fase de preparación. Ahora, en la fase de inicialización, se le asigna el valor real que queríamos darle, <code>true</code>.</p><p><strong>Nota:</strong> la JVM es multihilo. Cabe la posibilidad de que múltiples hilos intenten inicializar la misma clase al mismo tiempo, provocando problemas de concurrencia. Hay que gestionar cada hilo de forma segura para garantizar que el programa funcione adecuadamente en un entorno multihilo.</p><h2 id="-rea-de-datos-en-tiempo-de-ejecuci-n">Área de datos en tiempo de ejecución</h2><p>El área de datos en tiempo de ejecución está formado por cinco componentes:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/10/figura4-1.png" class="kg-image" alt="image-32" width="586" height="291" loading="lazy"></figure><p>Veamos cada componente por separado.</p><h3 id="-rea-de-m-todos">Área de métodos</h3><p>Todos los datos a nivel de clase, como el runtime constant pool, datos de los campos y los métodos, así como el código de los métodos y constructores, son almacenados en esta área.</p><p>Si la memoria disponible en el área de métodos no puede satisfacer una petición de asignación de memoria por parte de un proceso, la JVM emite un <code>OutOfMemoryError</code>.</p><p>Supongamos que has definido la siguiente clase:</p><pre><code class="language-java">public class Empleado {
  
  private String nombre;
  private int edad;
  
  public Empleado(String nombre, int edad) {
  
    this.nombre = nombre;
    this.edad = edad;
  }
}</code></pre><p>Los datos de los campos <code>nombre</code> y <code>edad</code> y el código del constructor son guardados en el área de métodos.</p><p>El área de métodos se crea al arrancar la JVM y es compartida por todos los hilos de ejecución.</p><h3 id="area-del-mont-culo-heap-">Area del montículo <em>(heap)</em></h3><p>Todos los objetos y sus correspondientes variables de instancia son almacenados en esta zona. El montículo es el área de datos de tiempo de ejecución en la que se aloja la memoria asignada a los arrelgos e instancias de clases.</p><p>Supongamos que se ha declarado la siguiente instancia:</p><pre><code class="language-java">Employee empleado = new Empleado();</code></pre><p>En este ejemplo, se crea una instancia de la clase <code>Empleado</code> , que será cargada en memoria en el área del montículo.</p><p>Al igual que el área de métodos, el área del montículo es creada al arrancar la JVM, y se comparte por todos los hilos.</p><p><strong>Nota:</strong> como las áreas del montículo y de métodos comparten la misma memoria para los diferentes hilos, habrá que gestionar cada hilo de forma segura para asegurar la integridad de los datos, como ya comentábamos en el apartado de inicialización de clases.</p><h3 id="area-de-pilas-stack-">Area de pilas <em>(stack)</em></h3><p>A cada hilo creado en la JVM le corresponde en exclusiva una pila, creada al mismo tiempo que el propio hilo. Las variables locales, resultados parciales y llamadas a métodos se almacenan en esta zona de memoria conocida como pila.</p><p>Si el procesamiento que se está llevando a cabo en un hilo requiere un tamaño de pila mayor del permitido, la JVM emite un <code>StackOverflowError</code>.</p><p>Para cualquier llamada a método, se genera en la memoria de pila una entrada llamada marco de pila (<em>stack frame</em>). Cuando se completa la llamada al método, el marco de pila es destruido.</p><p>El marco de pila se divide en tres partes:</p><ul><li><strong>Variables locales –</strong> cada marco contiene un arreglo donde se almacenan las variables locales y sus valores. La longitud de este arreglo se establece en tiempo de compilación.</li><li><strong>Pila de operandos </strong><em>(operand stack)</em> <strong>–</strong> esta estructura de tipo pila es utilizada para llevar a cabo las operaciones intermedias durante la llamada al método en cuestión. La profundidad máxima de esta pila se determina también en tiempo de compilación.</li><li><strong>Marco de datos </strong><em>(frame data)</em><strong> – </strong>aquí se guardan todos los símbolos del método invocado, así como la información del bloque <em>catch</em> en caso de que se produzca alguna excepción.</li></ul><p>Supongamos el siguiente código:</p><pre><code class="language-java">double calcularPuntuacionNormalizada(List&lt;Respuesta&gt; respuestas) {
  
  double puntuacion = getPuntuacion(respuestas);
  normalizarPuntuacion(puntuacion);
}

normalizarPuntuacion(double puntuacion) {
  
  return (puntuacion – minPuntuacion) / (maxPuntuacion – minPuntuacion);
}
</code></pre><p>En este ejemplo, el arreglo de variables locales contendrá las variables <code>respuestas</code> y <code>puntuacion</code>. La pila de operandos contiene las variables y operadores necesarios para realizar las operaciones de sustracción y división.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/10/figura5.png" class="kg-image" alt="image-36" width="467" height="236" loading="lazy"></figure><p><strong>Nota:</strong> como cada pila es exclusiva de un hilo, esta área de memoria es inherentemente segura en ambiente multihilo.</p><h3 id="registros-de-contador-de-programa-pc-program-counter-">Registros de contador de programa <em>(PC, program counter)</em></h3><p>La JVM admite múltiples hilos simultáneamente. Cada hilo tiene su propio registro contador de programa (PC) para guardar la dirección de la instrucción de la JVM ejecutándose en ese momento. Una vez ejecutada dicha instrucción, el registro PC es actualizado con la dirección de la próxima instrucción.</p><h3 id="pilas-para-m-todos-nativos">Pilas para métodos nativos</h3><p>La JVM puede hacer uso de pilas que soporten métodos <em>nativos</em>, métodos escritos en lenguajes diferentes a Java, como C o C++. Cada hilo posee su propia pila de métodos nativos.</p><h2 id="motor-de-ejecuci-n">Motor de ejecución</h2><p>Una vez que el bytecode se ha cargado en memoria y la información necesaria está disponible en el área de datos de tiempo de ejecución, el siguiente paso es ejecutar el programa. El motor de ejecución gestiona este proceso ejecutando el código de cada clase.</p><p>Sin embargo, antes de ejecutar el programa, hay que traducir el bytecode a instrucciones del lenguaje máquina, usando un intérprete o un compilador JIT.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/10/figura6.png" class="kg-image" alt="image-33" width="578" height="354" loading="lazy"></figure><h3 id="int-rprete">Intérprete</h3><p>El intérprete lee y ejecuta las instrucciones del bytecode línea a línea. Debido a esta ejecución línea por línea, el intérprete es comparativamente más lento.</p><p>Otra desventaja es la reinterpretación de un método cada vez que es llamado.</p><h3 id="compilador-jit">Compilador JIT</h3><p>El compilador JIT salva las desventajas del intérprete. En primera instancia, el motor de ejecución usa el intérprete para ejecutar el bytecode, entrando en acción el compilador JIT cuando se encuentra código repetido.</p><p>El compilador JIT compila el bytecode traduciéndolo a código máquina nativo, que es usado directamente en las reiteradas llamadas a métodos, mejorando así el rendimiento del sistema.</p><p>El compilador JIT se divide en los siguientes componentes:</p><ol><li><strong>Generador de código intermedio</strong></li><li><strong>Optimizador de código -</strong> optimiza el código intermedio para un mejor desempeño</li><li><strong>Generador de código objetivo -</strong> traduce el código intermedio en código máquina nativo</li><li><strong>Perfilador </strong><em><strong>(profiler)</strong></em><strong> -</strong> encuentra los <em>HotSpots</em> (código que es ejecutado repetidamente)</li></ol><p>Veamos el siguiente código para ilustrar la diferencia entre el intérprete y el compilador JIT:</p><pre><code class="language-java">int sum = 10;
for(int i = 0 ; i &lt;= 10; i++) {
   sum += i;
}
System.out.println(sum);</code></pre><p>Un intérprete busca en memoria el valor de <code>sum</code> en cada iteración del bucle, le suma el valor de<code>i</code>, y lo vuelve a almacenar en la memoria. Es una operación costosa, ya que se está accediendo a memoria en cada iteración.</p><p>Sin embargo, el compilador JIT reconoce que este código tiene un HotSpot, y realizará optimizaciones sobre él. Creará una copia local de <code>sum</code> en el registro PC del hilo, sumándole el valor de <code>i</code> en cada vuelta del bucle y, una vez concluído, llevará el nuevo valor de <code>sum</code> a la memoria.</p><p><strong>Nota:</strong> un compilador JIT tarda más en compilar el código que un intérprete en interpretarlo línea por línea. Si se va a ejecutar el programa solo una vez, es mejor usar el intérprete.</p><h3 id="recolector-de-basura-gc-garbage-collector-">Recolector de basura <em>(GC, garbage collector)</em></h3><p>El recolector de basura detecta y elimina objetos no referenciados en el área del heap. Es el proceso de recuperar automáticamente, en tiempo de ejecución, la memoria ocupada por objetos que ya no van a ser utilizados, mediante la destrucción de tales objetos.</p><p>La recolección de basura hace que Java sea eficiente desde el punto de vista de la gestión de memoria, ya que libera memoria del área heap eliminando objetos no referenciados, creándose así espacio para nuevos objetos. Este proceso implica dos fases:</p><ol><li><strong>Marcado -</strong> identificación de objetos no referenciados</li><li><strong>Barrido -</strong> destrucción de los objetos identificados en el paso anterior</li></ol><p>La JVM realiza automáticamente la recolección de basura a intervalos regulares, no siendo necesaria su gestión separadamente. Puede ser disparada invocando <code>System.gc()</code>, aunque la ejecución no está garantizada.</p><p>La JVM tiene tres tipos de recolectores de basura:</p><ol><li><strong>En serie -</strong> es la implementación más simple, diseñada para pequeñas aplicaciones ejecutándose en entornos monohilo. Usando un solo hilo, produce un evento de tipo "parar el mundo" en el que todos los hilos de aplicación son detenidos hasta que la operación se complete. El argumento de la JVM para usar recolección de basura en serie es <code>-XX:+UseSerialGC</code></li><li><strong>En paralelo - </strong>es la implementación por defecto en la JVM, conocido como recolector de rendimiento <em>(throughput collector)</em>. Uitiliza múltiples hilos, pero aún necesita parar los hilos de aplicación. El argumento de la JVM es <code>-XX:+UseParallelGC</code>.</li><li><strong>Garbage First (G1) GC -</strong> G1GC fue diseñado para aplicaciones multihilo con gran cantidad disponible de heap (más de 4GB). Particiona el heap en un conjunto de regiones de igual tamaño, utilizando múltiples hilos para explorarlas. G1GC identifica las regiones con el máximo de basura y realiza la limpieza prioritaria de esas regiones. El argumento de la JVM para G1GC es <code>-XX:+UseG1GC</code></li></ol><p><strong>Nota:</strong> hay otro tipo de colector de basura llamado <strong>Barrido de Marcas Concurrente</strong> <strong><em>(Concurrent Mark Sweep (CMS) GC)</em></strong>. Sin embargo, fue declarado obsoleto en Java 9 y completamente eliminado en Java 14 en favor de G1GC.</p><h2 id="interfaz-nativa-de-java-jni-">Interfaz nativa de Java (JNI)</h2><p>En ocasiones, es necesario utilizar código nativo en lugar de Java (por ejemplo, C/C++). Esas ocasiones pueden ser cuando necesitamos interactuar con el hardware, o salvar las restricciones de Java en cuanto a gestión de memoria y rendimiento. Java admite la ejecución de código nativo a través de la Interfaz Nativa de Java (JNI).</p><p>JNI hace de puente permitiendo el uso de paquetes de apoyo para otros lenguajes, como C, C++, etc. Esto resulta de mucha ayuda en casos en que se necesita escribir código que no esté enteramente admitido por Java, como ciertas características específicas de la plataforma subyacente que solo pueden ser escritas en C.</p><p>La palabra reservada <code>native</code> indica que la implementación del método será proporcionada por una biblioteca nativa. Es necesario invocar <code>System.loadLibrary()</code> para cargar en memoria dicha biblioteca nativa compartida y tener su funcionalidad disponible en Java.</p><h2 id="bibliotecas-de-m-todos-nativos">Bibliotecas de métodos nativos</h2><p>Las bibliotecas de métodos nativos son bibliotecas escritas en otros lenguajes, como C, C++ y ensamblador, normalmente en archivos de extensión <code>.dll</code> o <code>.so</code>. Pueden ser cargadas a través de JNI.</p><h1 id="errores-habituales-de-la-jvm">Errores habituales de la JVM</h1><ul><li><strong>ClassNotFoundException</strong> - ocurre cuando el cargador de clases intenta cargar clases mediante <code>Class.forName()</code>, <code>ClassLoader.loadClass()</code> o <code>ClassLoader.findSystemClass()</code> pero no se encuentra la definición de la clase con el nombre especificado.</li><li><strong>NoClassDefFoundError</strong> - se produce cuando la compilación de la clase ha tenido éxito, pero el cargador de clases no es capaz de encontrar el fichero tipo class en tiempo de ejecución.</li><li><strong>OutOfMemoryError</strong> - la JVM no puede asignar memoria para un objeto, ya que no hay suficiente y el recolector de basura no es capaz de proporcionar más memoria.</li><li><strong>StackOverflowError</strong> - la JVM se queda sin espacio al crear nuevos marcos de pila.</li></ul><h1 id="conclusi-n">Conclusión</h1><p>En este artículo hemos discutido la arquitectura de la Máquina Virtual de Java y sus diversos componentes. Lo habitual es no preocuparse demasiado de su mecánica interna ni de su funcionamiento mientras nuestro código se ejecuta con normalidad.</p><p>Solo cuando algo va mal, y necesitamos ajustar la JVM o corregir un fallo de memoria, intentamos comprender su funcionamiento interno.</p><p>Es una cuestión muy popular en entrevistas de trabajo, tanto a nivel junior como senior para perfiles backend. Tener amplios conocimientos de la JVM te ayudará a producir mejor código y evitar trampas que conduzcan a errores de pila o de memoria.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.25%;" class="fluid-width-video-wrapper">
            <iframe src="https://www.youtube.com/embed/jnpuRvRdTgI?feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" title="Embedded content" loading="lazy" name="fitvid0" frameborder="0" width="256" height="144"></iframe>
          </div>
        </div>
      </figure><p>Gracias por acompañarme hasta tan lejos. Espero que te haya gustado el artículo. Puedes encontrarme en <a href="https://www.linkedin.com/in/theawesomenayak/">LinkedIn</a>, donde normalmente hablo sobre tecnología y sobre la vida. Echa también un vistazo a <a href="https://www.freecodecamp.org/news/author/theawesomenayak/">mis otros artículos</a> y a <a href="https://www.youtube.com/channel/UCmWAaPgfWAkl-Jep5mY-NNg">mi canal de YouTube</a>. Que disfrutes de la lectura. ?</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Introducción al acceso a bases de datos relacionales reactivas con Spring y R2DBC ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Daniel Newton Artículo original An introduction to Reactive Relational Database Access with Spring and R2DBC [https://www.freecodecamp.org/news/an-introduction-to-reactive-relational-database-access-with-spring-and-r2dbc-1a9447d4b122/] Traducido y adaptado por Josué [/espanol/news/author/drifting/] No hace mucho tiempo, se lanzó una variante reactiva del controlador JDBC, conocida como R2DBC.  Permite que los datos se transmitan de forma asincrónica ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/introduccion-al-acceso-a-bases-de-datos-relacionales-reactivas-con-spring-y-r2dbc/</link>
                <guid isPermaLink="false">61dce67017a453092f694a70</guid>
                
                    <category>
                        <![CDATA[ java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Wed, 23 Feb 2022 16:34:32 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/01/1_Y5vRk0tztWvhhbWrvJrm-g.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por</strong></strong></strong></strong></strong></strong> </strong></strong>Daniel Newton<br><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original</strong></strong></strong></strong></strong></strong> </strong></strong><a href="https://www.freecodecamp.org/news/an-introduction-to-reactive-relational-database-access-with-spring-and-r2dbc-1a9447d4b122/">An introduction to Reactive Relational Database Access with Spring and R2DBC</a><br><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting/">Josué</a></p><p>No hace mucho tiempo, se lanzó una variante reactiva del controlador JDBC, conocida como R2DBC. &nbsp;Permite que los datos se transmitan de forma asincrónica a cualquier punto final que se haya suscrito a él. &nbsp;Usando un controlador reactivo como R2DBC junto con Spring, WebFlux le permite escribir una aplicación completa que maneja la recepción y el envío de datos de forma asíncrona.</p><p>En esta publicación, nos centraremos en la base de datos, desde la conexión a la base de datos hasta finalmente guardar y recuperar datos. &nbsp;Para hacer esto, usaremos Spring Data. &nbsp;Al igual que con todos los módulos de Spring Data, nos proporciona una configuración lista para usar. &nbsp;Esto disminuye la cantidad de código repetitivo que necesitamos escribir para configurar nuestra aplicación. &nbsp;Además de eso, proporciona una capa sobre el controlador de la base de datos que hace que realizar las tareas simples sea más fácil y las tareas más difíciles sean un poco menos dolorosas.</p><p>Para el contenido de esta publicación, estoy haciendo uso de una base de datos de Postgres. &nbsp;En el momento de escribir este artículo, solo Postgres, H2 y Microsoft SQL Server tienen sus propias implementaciones de controladores R2DBC.</p><p>Anteriormente, escribí dos publicaciones sobre bibliotecas Spring Data reactivas, una sobre <a href="https://lankydanblog.com/2017/07/16/a-quick-look-into-reactive-streams-with-spring-data-and-mongodb/">Mongo</a> y otra sobre <a href="https://lankydanblog.com/2017/12/11/reactive-streams-with-spring-data-cassandra/">Cassandra</a>. &nbsp;Es posible que hayas notado que ninguna de estas bases de datos son bases de datos RDBMS. &nbsp;Ahora hay otros controladores reactivos disponibles desde hace mucho tiempo (escribí la publicación de Mongo hace casi 2 años), pero al momento de escribir un controlador reactivo para una base de datos RDBMS todavía es algo bastante nuevo. &nbsp;Esta publicación seguirá un formato similar a aquellos.</p><p>Además, también he escrito un post sobre el uso de Spring Web Flux que mencioné en la introducción. </p><h3 id="dependencias"><strong>Dependencias</strong></h3><p>Hay algunas cosas que señalar aquí.</p><p>Cuanto más utilices Spring Boot, más te acostumbrarás a importar una única dependencia de <code>spring-boot-starter</code> para la cosa que quieras hacer. Por ejemplo, esperaba que hubiera una dependencia de <code>spring-boot-starter-r2dbc</code>, pero lamentablemente no la hay. Todavía.</p><p>Simplemente, esta biblioteca está en el lado más nuevo y en el momento de escribir, no tiene su propio módulo de Spring Boot que contiene las dependencias que necesita junto con una configuración más rápida a través de la configuración automática. Estoy seguro de que estas cosas llegarán en algún momento y harán que la configuración de un controlador R2DBC sea aún más fácil. </p><p>Por ahora, tendremos que rellenar manualmente algunas dependencias adicionales.‌‌‌‌ </p><p>Además, las librerías R2DBC solo tienen versiones Milestone (una prueba más de que son nuevas) por lo que tenemos que asegurarnos de traer el repositorio Spring Milestone. Probablemente, tendré que actualizar este post en el futuro cuando consiga una versión de lanzamiento.</p><h3 id="conexi-n-a-la-base-de-datos">Conexión<strong> a la base de datos</strong></h3><p>Gracias a que Spring Data hace gran parte del trabajo por nosotros, el único Bean que hay que crear manualmente es el <code>ConnectionFactory</code> que contiene los detalles de conexión de la base de datos:</p><p>Lo primero que hay que observar aquí es la extensión de <code>AbstractR2dbcConfiguration</code>. Esta clase contiene un montón de Beans que ya no necesitamos crear manualmente. La implementación de <code>connectionFactory</code> es el único requisito de la clase, ya que es necesario para crear el Bean <code>DatabaseClient</code>. Este tipo de estructura es típica de los módulos de Spring Data, por lo que se siente bastante familiar al probar uno diferente. Además, yo esperaría que esta configuración manual se elimine una vez que la autoconfiguración esté disponible y se dirija únicamente a través del <code>application.properties</code>.</p><p>He incluido la propiedad del <code>port</code> aquí, pero si no has jugado con la configuración de tu Postgres entonces puedes confiar en el valor por defecto de <code>5432</code>.</p><p>Las cuatro propiedades: <code>host</code>, <code>database</code>, <code>username</code> &nbsp;y <code>password</code> definidas por el <code>PostgresqlConnectionFactory</code> son lo mínimo para que funcione. Cualquier cosa menos y experimentará excepciones durante el arranque.</p><p>Usando esta configuración, Spring es capaz de conectarse a una instancia de Postgres en ejecución.</p><p>El último dato a destacar de este ejemplo es el uso de <code>@EnableR2dbcRepositories</code>. Esta anotación indica a Spring que busque cualquier interfaz de repositorio que extienda la interfaz <code>Repository</code> de Spring. Esta se utiliza como interfaz base para instrumentar los repositorios de Spring Data. Veremos esto con más detalle en la siguiente sección. La principal información que debemos extraer de aquí es que debemos utilizar la anotación <code>@EnableR2dbcRepositories</code> &nbsp;para aprovechar al máximo las capacidades de Spring Data.</p><h3 id="creaci-n-de-un-repositorio-de-datos-de-spring">Creación de un repositorio de datos de Spring</h3><p>Como se ha mencionado anteriormente, en esta sección veremos cómo añadir un repositorio de datos de Spring. Estos repositorios son una buena característica de Spring Data, lo que significa que no es necesario escribir un montón de código extra para simplemente escribir una consulta.<br><br>Desafortunadamente, al menos por ahora, Spring R2DBC no puede inferir consultas de la misma manera que lo hacen actualmente otros módulos de Spring Data (estoy seguro de que esto se añadirá en algún momento). Esto significa que tendrá que utilizar la anotación <code>@Query</code> y escribir el SQL a mano. Echemos un vistazo:</p><p>Esta interfaz extiende <code>R2dbcRepository</code>. Este a su vez extiende <code>ReactiveCrudRepository</code> &nbsp;y luego baja a <code>Repository</code>. <code>ReactiveCrudRepository</code> proporciona las funciones CRUD estándar y, por lo que tengo entendido, <code>R2dbcRepository</code> no proporciona ninguna función extra y es, en cambio, una interfaz creada para una mejor denominación de la situación.<br><br><code>R2dbcRepository</code> toma dos parámetros genéricos, uno es la clase de entidad que toma como entrada y produce como salida. El segundo es el tipo de la clave primaria. Por lo tanto, en esta situación, la clase <code>Person</code> está siendo gestionada por el <code>PersonRepository</code> (tiene sentido) y el campo de la clave primaria dentro de <code>Person</code> es un <code>Int</code>.</p><p>Los tipos de retorno de las funciones de esta clase y los proporcionados por <code>ReactiveCrudRepository</code> son <code>Flux</code> y <code>Mono</code> (no se ven aquí). Estos son tipos del Proyecto Reactor que Spring utiliza como tipos de flujo reactivo por defecto. <code>Flux</code> representa un flujo de múltiples elementos mientras que <code>Mono</code> es un único resultado.</p><p>Finalmente, como mencioné antes del ejemplo, cada función está anotada con <code>@Query</code>. La sintaxis es bastante sencilla, siendo el SQL una cadena dentro de la anotación. El <code>$1</code> (<code>$2</code>, <code>$3</code>, etc ... para más entradas) representa el valor introducido en la función. Una vez hecho esto, Spring se encargará del resto y pasará la(s) entrada(s) a su respectivo parámetro de entrada, recogerá los resultados y los asignará a la clase de entidad designada del repositorio.</p><h3 id="una-mirada-muy-r-pida-a-la-entidad">Una mirada muy rápida a la entidad</h3><p>No voy a decir mucho aquí, sino simplemente mostrar la clase <code>Person</code> utilizada por el <code>PersonRepository</code>.</p><p>En realidad, hay un punto que hacer aquí. <code>id</code> se ha hecho anulable y se ha proporcionado un valor por defecto de <code>null</code> para permitir que Postgres genere el siguiente valor adecuado por sí mismo. Si no es anulable y se proporciona un valor de <code>id</code>, Spring intentará ejecutar una actualización en lugar de una inserción al guardar. Hay otras formas de evitar esto, pero creo que esto es suficiente.</p><p>Esta entidad se asignará a la tabla de personas definida a continuación:</p><h3 id="ver-todo-en-acci-n">Ver todo en acción</h3><p>Ahora veamos cómo se hace realmente. A continuación se muestra un código que inserta algunos registros y los recupera de diferentes maneras:<br><br>Una cosa que mencionaré sobre este código. Hay una posibilidad muy real de que se ejecute sin realmente insertar o leer algunos de los registros. Pero, si lo piensas, tiene sentido. Las aplicaciones reactivas están pensadas para hacer cosas de forma asíncrona y, por tanto, esta aplicación ha comenzado a procesar las llamadas a funciones en diferentes hilos. Sin bloquear el hilo principal, estos procesos asíncronos podrían no ejecutarse nunca completamente. Por esta razón, hay algunas llamadas a <code>Thread.sleep</code> en este código, pero las he eliminado del ejemplo para mantener todo ordenado.<br><br>El resultado de la ejecución del código anterior sería algo parecido a lo siguiente:</p><pre><code>[ main] onSubscribe(FluxConcatMap.ConcatMapImmediate)[ main] request(unbounded)[actor-tcp-nio-1] onNext(Person(id=35, name=Dan Newton, age=25))[actor-tcp-nio-1] onNext(Person(id=36, name=Laura So, age=23))[actor-tcp-nio-1] onComplete()[actor-tcp-nio-2] findAll - Person(id=35, name=Dan Newton, age=25)[actor-tcp-nio-2] findAll - Person(id=36, name=Laura So, age=23)[actor-tcp-nio-4] findAllByName - Person(id=36, name=Laura So, age=23)[actor-tcp-nio-5] findAllByAge - Person(id=35, name=Dan Newton, age=25)</code></pre><p>Hay que tener en cuenta algunas cosas:</p><ul><li><code>onSubscribe</code> y <code>request</code> ocurren en el hilo principal desde el que se llamó al <code>Flux</code>. Solo <code>saveAll</code> &nbsp;produce esto, ya que ha incluido la función de <code>log</code>. Añadir esto a las otras llamadas habría llevado al mismo resultado de registro en el hilo principal.</li><li>La ejecución contenida en la función de suscripción y los pasos internos del <code>Flux</code> se ejecutan en hilos separados.</li></ul><p>Esto no es ni de lejos una representación real de cómo usarías los Streams Reactivos en una aplicación real, pero esperamos que demuestre cómo usarlos y dé una idea de cómo se ejecutan.</p><h3 id="conclusi-n">Conclusión</h3><p>En conclusión, los Reactive Streams han llegado a algunas bases de datos RDBMS gracias al driver R2DBC y a Spring Data que construye una capa encima para hacer todo un poco más ordenado. Usando Spring Data R2DBC somos capaces de crear una conexión a una base de datos y empezar a consultarla sin necesidad de demasiado código.<br><br>Aunque Spring ya está haciendo mucho por nosotros, podría hacer más. Actualmente, no tiene soporte para la autoconfiguración de Spring Boot. Lo cual es un poco molesto. Pero, estoy seguro de que alguien se pondrá a hacerlo pronto y hará que todo sea aún mejor de lo que ya es.</p><p>El código utilizado en este post se puede encontrar en mi <a href="https://github.com/lankydan/spring-data-r2dbc">GitHub</a>.</p><p>Si te ha resultado útil este post, puedes seguirme en Twitter en @<a href="https://twitter.com/LankyDanDev">LankyDanDev </a>para estar al día de mis nuevas publicaciones.<br><br>Publicado originalmente en <a href="https://lankydanblog.com/2019/02/16/asynchronous-rdbms-access-with-spring-data-r2dbc/">lankydanblog.com</a> el 16 de febrero de 2019.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cadena de Java a Int: Cómo convertir una cadena en un número entero ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Thanoshan MV [https://www.freecodecamp.org/news/author/thanoshan/] Artículo original Java String to Int – How to Convert a String to an Integer [https://www.freecodecamp.org/news/java-string-to-int-how-to-convert-a-string-to-an-integer/] Traducido y adaptado por Santiago Yanguas [https://twitter.com/ToqYang] Los objetos de cadena son representados como una cadena de caracteres. Si has trabajado en Java Swing, tiene componentes como ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/cadena-de-java-a-int-como-convertir-una-cadena-en-un-numero-entero/</link>
                <guid isPermaLink="false">61fefb8de56f6e08aa1c5290</guid>
                
                    <category>
                        <![CDATA[ java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Santiago Toquica Yanguas ]]>
                </dc:creator>
                <pubDate>Thu, 10 Feb 2022 19:59:59 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/02/java-string.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong>Artículo original escrito por </strong><a href="https://www.freecodecamp.org/news/author/thanoshan/">Thanoshan MV </a><br><strong>Artículo original </strong><a href="https://www.freecodecamp.org/news/java-string-to-int-how-to-convert-a-string-to-an-integer/">Java String to Int – How to Convert a String to an Integer</a><br><strong>Traducido y adaptado por </strong><a href="https://twitter.com/ToqYang">Santiago Yanguas</a></p><p>Los objetos de cadena son representados como una cadena de caracteres.</p><p>Si has trabajado en Java Swing, tiene componentes como JTextField y JTextArea que utilizamos para obtener nuestra entrada de la GUI. Toma nuestra entrada como una cadena de caracteres.</p><p>Si queremos hacer una calculadora simple usando Swing, tenemos que averiguar cómo convertir una cadena en un número entero. Esto nos lleva a la pregunta: ¿cómo podemos convertir una cadena en un número entero?</p><p>En Java, podemos utilizar <code>Integer.valueOf()</code> e <code>Integer.parseInt()</code> para convertir una cadena en un entero.</p><h2 id="1-utiliza-integer-parseint-para-convertir-una-cadena-en-un-n-mero-entero">1. Utiliza Integer.parseInt() para convertir una cadena en un número entero</h2><p>Este método devuelve la cadena como un <strong>tipo primitivo int</strong>. Si la cadena no contiene un entero válido, lanzará una <a href="https://docs.oracle.com/javase/7/docs/api/java/lang/NumberFormatException.html">NumberFormatException</a>.</p><p>Por lo tanto, cada vez que convirtamos una cadena en un int, tenemos que ocuparnos de esta excepción colocando el código dentro del bloque try-catch.</p><p>Consideremos un ejemplo de conversión de una cadena a un int utilizando <code>Integer.parseInt()</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-Java">        String str = "25";
        try {
            int number = Integer.parseInt(str);
            System.out.println(number); // output = 25
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }</code></pre><figcaption>Convertir cadena de texto a entero</figcaption></figure><p>Intentemos romper este código introduciendo un entero no válido:</p><figure class="kg-card kg-code-card"><pre><code class="language-Java">     	String str = "25T";
        try{
            int number = Integer.parseInt(str);
            System.out.println(number);
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }</code></pre><figcaption>Prueba de la excepción</figcaption></figure><p>Como puedes ver en el código anterior, hemos intentado convertir <code>25T</code> en un número entero. Esto no es una entrada válida. Por lo tanto, debes lanzar una NumberFormatException.</p><p>Este es el resultado del código anterior:</p><figure class="kg-card kg-code-card"><pre><code class="language-java">java.lang.NumberFormatException: For input string: "25T"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at OOP.StringTest.main(StringTest.java:51)</code></pre><figcaption>Mensaje de la excepción</figcaption></figure><p>A continuación, veremos cómo convertir una cadena de caracteres en un número entero utilizando el método <code>Integer.valueOf()</code>.</p><h2 id="2-utiliza-integer-valueof-para-convertir-una-cadena-en-un-n-mero-entero">2. Utiliza Integer.valueOf() para convertir una cadena en un número entero</h2><p>Este método devuelve la cadena como un <strong>objeto entero</strong>. Si miras la <a href="https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(java.lang.String)">documentación de Java</a>, <code>Integer.valueOf()</code> devuelve un objeto entero que equivale a un nuevo <code>Integer(Integer.parseInt(s))</code>.</p><p>Colocaremos nuestro código dentro del bloque try-catch cuando utilicemos este método. Consideremos un ejemplo utilizando el método <code>Integer.valueOf()</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-java">        String str = "25";
        try{
            Integer number = Integer.valueOf(str);
            System.out.println(number); // output = 25
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }</code></pre><figcaption>Convertir cadena a un número entero</figcaption></figure><p>Ahora, intentemos romper el código anterior introduciendo un número entero no válido:</p><figure class="kg-card kg-code-card"><pre><code class="language-java">        String str = "25TA";
        try{
            Integer number = Integer.valueOf(str);
            System.out.println(number); 
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }</code></pre><figcaption>Probar la excepción</figcaption></figure><p>Al igual que en el ejemplo anterior, el código anterior lanzará una excepción.</p><p>Este es el resultado del código anterior:</p><figure class="kg-card kg-code-card"><pre><code class="language-Java">java.lang.NumberFormatException: For input string: "25TA"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.valueOf(Integer.java:766)
	at OOP.StringTest.main(StringTest.java:42)</code></pre><figcaption>Excepción</figcaption></figure><p>También podemos crear un método para comprobar si la cadena pasada es numérica o no antes de utilizar los métodos mencionados.</p><p>He creado un método sencillo para comprobar si la cadena pasada es numérica o no.</p><figure class="kg-card kg-code-card"><pre><code class="language-java">public class StringTest {
    public static void main(String[] args) {
        String str = "25";
        String str1 = "25.06";
        System.out.println(isNumeric(str));
        System.out.println(isNumeric(str1));
    }

    private static boolean isNumeric(String str){
        return str != null &amp;&amp; str.matches("[0-9.]+");
    }
}</code></pre><figcaption>Comprobar si es una cadena es solo de numeros</figcaption></figure><p>La salida es:</p><figure class="kg-card kg-code-card"><pre><code class="language-Java">true
true</code></pre><figcaption>Salida</figcaption></figure><p>El método <code>isNumeric()</code> toma una cadena como argumento. Primero comprueba si es <code>null</code> o no. Después utilizamos el método <code>matches()</code> para comprobar si contiene dígitos del 0 al 9 y un carácter de punto.</p><p>Esta es una forma sencilla de comprobar los valores numéricos. Puedes escribir o buscar en Google expresiones regulares más avanzadas para capturar valores numéricos dependiendo de tu caso de uso.</p><p>Es una buena práctica comprobar si la cadena pasada es numérica o no antes de intentar convertirla a entero.</p><p>Gracias por leer.</p><p>Imagen por <a href="https://unsplash.com/@itfeelslikefilm?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">?? Janko Ferlič</a> en <a href="https://unsplash.com/collections/139346/soul-care?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p><p>Puedes conectarte conmigo en <a href="https://mvthanoshan.medium.com/">Medium</a>.</p><p><strong>¡Feliz codificación!</strong></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
