Java…. Entonces, todos los que lean esto saben que es uno de los lenguajes de programación más populares en todo el mundo y está diseñado para seguir funcionando en cualquier escenario incesantemente. Ya sean aplicaciones de Windows, aplicaciones web, dispositivos móviles, redes, productos electrónicos de consumo, Java está en todas partes. Java ha sido testigo de un desarrollo constante en su eficiencia de programación durante décadas y no muestra signos de disminuir en popularidad y, por esa razón, vale la pena aprenderlo para cualquiera que esté dispuesto a tener un futuro sólido como desarrollador. No importa si es un experto o un novato en Java, familiarizarse con las buenas prácticas de programación le ahorrará mucho tiempo. Así que analicemos algunos trucos y consejos de Java para ahorrar tiempo, optimizar y mejorar la calidad del código.
1. Optimización de cadenas
Los objetos String son inmutables en Java, lo que significa que el contenido String no se puede cambiar una vez creado. Las cadenas se pueden construir mediante,
- Asignar directamente un literal de cadena a una referencia de cadena
- Por un constructor
String str1 = "Soy una cadena";
String str2 = new String ("Soy una cadena a través de un constructor");
El primer método es una mejor forma de crear cadenas . La creación de cadenas con constructores desperdicia mucho espacio en la memoria, ya que los objetos no comparten el almacenamiento ni siquiera para el mismo contenido, mientras que el primer método comparte el almacenamiento para el mismo contenido.
Especialmente, evite usar el segundo método dentro de los bucles, ya que ahora todos pueden comprender que se crearán nuevos objetos innecesarios en cada iteración, desperdiciando una gran cantidad de almacenamiento.
Utilice la clase StringBuffer o StringBuilder si el contenido de una cadena se modifica con frecuencia, ya que estas clases admiten cadenas mutables .
2. Concatenación de cadenas
En la instancia, ves Concatenación de cadenas, sé que la concatenación de cadenas usando el operador ‘+’ es lo primero que se te viene a la cabeza. ¿Pero sabías que no es el mejor y el único método para hacer el trabajo? Hay 4 métodos para esto.
- Usando el operador ‘+’
Es la forma más sencilla de concatenar varias cadenas, pero requiere memoria adicional y ralentiza el rendimiento de su programa. Especialmente si está concatenando varias cadenas dentro de un bucle. Pero esto no significa que deba evitar este método. Aún puede usar esto para concatenar cadenas en una declaración.
Nombre de cadena = "S" + "a" + "m";
- Usando el método concat ()
Este método apenas se utiliza. El rendimiento es mejor que usar el operador ‘+’, pero aún así, es más lento.
- Usando StringBuffer
Este método es mucho más rápido que los dos anteriores. StringBuffer está sincronizado para operaciones de subprocesos múltiples, lo que significa que este método es seguro para subprocesos. Esto es más lento que StringBuilder debido a los métodos sincronizados.
- Agregar método de la clase StringBuilder
Esto es similar a StringBuffer excepto que StringBuilder no está sincronizado para operaciones multiproceso. Si está concatenando varias cadenas mediante un bucle for, debería utilizar StringBuilder .
Nombre de cadena =
new StringBuilder (). Append ("S"). Append ("a"). Append ("m"). ToString ();
Ahora, si resumo esto para usted, al crear cadenas a partir de partes, use StringBuilder (de un solo subproceso) o StringBuffer (de varios subprocesos). Para la concatenación de cadenas usando bucles for, use StringBuilder y para la concatenación de cadenas de una sola instrucción , puede usar el operador ‘+’.
3. Uso de comillas simples y dobles en cadenas
En resumen, las comillas simples se utilizan para las cadenas literales c, mientras que las comillas dobles son para las cadenas literales . En el siguiente fragmento de código, las letras ‘M’ e ‘Y’ serán las salidas correspondientes.
System.out.println ("M");
System.out.println ('Y');
Ahora, ¿qué opinas del código a continuación?
System.out.println ("M" + "Y");
System.out.println ('M' + 'Y');
La primera salida, como adivinó, es MY, pero la segunda no resultó ser MY, sino que la salida parece ser 166. Agregar dos caracteres devolverá un int . Aquí se agregarán los valores ASCII de los dos caracteres para devolver un int .
Si se pregunta cómo concatenar caracteres como una cadena , hay varias formas de hacerlo.
System.out.println ('M' + "" + 'Y');
System.out.println ("" + 'M' + 'Y');
Los dos métodos anteriores devolverán el String MY. Además, hay más métodos, como StringBuffer y StringBuilder mencionados en la sección anterior.
4. Flotante vs Doble
Ambos tipos de datos se utilizan para representar números de punto flotante y que el doble es más preciso es un hecho bien conocido.
El uso de doble sobre float es muy recomendable, sobre todo, si usted no puede garantizar que su número está dentro de los flotadores rango especificado.
Pero tenga en cuenta que el doble tiene un costo; es caro ya que ocupa el doble de espacio de memoria de lo que ocuparía el flotador .
5. Es mejor evitar BigDecimal y BigInteger
También puede optar por BigDecimaly BigInteger, que es una forma exacta de representar números.
Si está trabajando con números de punto flotante con precisión diferente o si está tratando con dinero donde la precisión es imprescindible, BigDecimal puede ser su elección. Pero requiere más memoria, es un poco difícil programar algoritmos y ralentiza drásticamente todos los cálculos que usar double .
Por lo tanto, es muy recomendable evitar el uso de BigDecimal y también BigInteger , utilícelos solo si no hay otra salida.
6.Utilice primitivas siempre que sea posible
Las clases de envoltura son de gran ayuda para convertir tipos de datos primitivos en objetos. Sin embargo, las primitivas son simples, más rápidas y una forma fácil de evitar gastos generales. Por lo tanto, es mejor usar int en lugar de Integer o float en lugar de Float .
// usando el tipo de datos primitivo
int num = 5;// usando la clase contenedora
Integer wrapNum = new Integer (5);
Además, como las clases Wrapper tratan con objetos, compararlos no dará los resultados deseados como ocurre con las primitivas. La razón de esto es que terminará comparando objetos en lugar del contenido de esos objetos.
int num1 = 5;
int num2 = 5;Entero wrapNum1 = nuevo Entero (3);
Entero wrapNum2 = nuevo Entero (3);System.out.println (num1 == num2);
System.out.println (wrapNum1 == wrapNum2);
La primera impresión sería verdadera, pero la segunda impresión sería falsa ya que los objetos se comparan allí, no los valores.
7. Manejo de excepciones de puntero nulo
La excepción de puntero nulo es una excepción en tiempo de ejecución que se lanza cuando una aplicación intenta utilizar una referencia de objeto con un valor nulo.
Fruta en rama;
spellChecker (fruta);
Aquí se pasa una variable de referencia nula como argumento de un método.
positionLocator (nulo);
En el fragmento de código anterior, se pasa nulo directamente a una función. En ambos casos, existe una alta posibilidad de lanzar la NullPointerException .
Esta excepción se puede solucionar utilizando la condición if-else .
public class NullPointerExceptionExample {
public static void main (String args []) {
String fruit = "apple";
positionLocator (nulo);
}// Usando una condición if-else
static void positionLocator (String fruit) {
if (fruit! = Null) {
System.out.println ("Second character:" + fruit.charAt (0));
}
else {
System.out.println ("NullPointerException lanzada");
}
}}
8. Utilice perfiladores para optimizar su código
Escribir código y compilarlo para obtener los resultados requeridos no es suficiente. Debemos escribir códigos con el mejor rendimiento posible. Para lograrlo, es mejor si hay una manera de verificar qué sucede detrás del código, cómo se asigna la memoria, las áreas a mejorar y los efectos de usar un enfoque de codificación en otro. Para ello, podemos utilizar Java Profilers .
Java Profiler es una herramienta que supervisa las construcciones y operaciones de código de bytes de Java a nivel de JVM. Usando estos perfiladores podemos averiguar el rendimiento, uso de memoria, pérdidas de memoria, etc. en nuestros programas, y luego podemos encontrar fácilmente qué cambiar, optimizar o eliminar en el código.
Hay varios perfiladores disponibles como JProfiler, XRebel y New Relic, pero cada uno de estos perfiladores tiene personajes únicos y es mejor para un cierto aspecto de errores de rendimiento. Por lo tanto, los perfiladores deben seleccionarse de acuerdo con el nivel de análisis necesario y, para obtener mejores resultados, puede utilizar una combinación de varios perfiladores.
Puede encontrar más sobre Java Profilers aquí .
9.Array vs ArrayLists
La principal diferencia entre estos dos es que una matriz es de tamaño fijo, por lo que una vez que ha creado una matriz no puede cambiarla, pero ArrayList no es de tamaño fijo. Puede crear instancias de ArrayLists sin especificar su tamaño. Entonces, si crea tales instancias de ArrayList sin especificar su tamaño, Java creará una instancia de ArrayList de tamaño predeterminado.
Una vez que una ArrayList está llena, se redimensiona a sí misma. De hecho, una ArrayList es admitida internamente por una matriz. Por lo tanto, cuando se cambia el tamaño de una ArrayList , su rendimiento se ralentizará un poco, ya que el contenido de la matriz anterior debe copiarse en una nueva matriz .
Al mismo tiempo, es obligatorio especificar el tamaño de una matriz directa o indirectamente al crearla. Y también las matrices pueden almacenar tanto primitivas como objetos, mientras que ArrayLists solo puede almacenar objetos.
Espero que este artículo te haya sido de alguna ayuda. Espero traer más artículos pronto. Gracias por leer.