Categorías
Basics Diagram

Diagrama para mostrar la inmutabilidad de las cadenas de Java

Aquí hay un conjunto de diagramas para ilustrar las cadenas de Java inmutabilidad.

1. Declare una cadena

El siguiente código inicializa una cadena s.

String s = "abcd";

La variable s almacena la referencia de un objeto de cadena como se muestra a continuación. La flecha se puede interpretar como «almacenar referencia de».

2. Asignar una variable de cadena a otra variable de cadena

El siguiente código asigna s a s2.

String s2 = s;

s2 almacena el mismo valor de referencia ya que es el mismo objeto de cadena.

String-Immutability-2

3. Cadena Concat

Cuando concatenamos una cadena «ef» a s,

s = s.concat("ef");

s almacena la referencia del objeto de cadena recién creado como se muestra a continuación.

inmutabilidad de cuerdas

En resumen, una vez que se crea una cadena en la memoria (montón), no se puede cambiar. Los métodos de cadena no cambian la cadena en sí, sino que devuelven una nueva cadena.

Si necesitamos una cadena que se pueda modificar, necesitaremos StringBuffer o StringBuilder. De lo contrario, se perderá mucho tiempo para la recolección de basura, ya que cada vez que se crea una nueva cadena. Aquí hay un ejemplo de uso StringBuilder.

Categorías
Basics

Java crea un archivo / directorio

Crear un archivo o directorio en Java es muy simple. Puede especificar la ruta del archivo / directorio y luego invocar los métodos mkdir () y createNewFile (). El siguiente ejemplo de código muestra cómo crear un archivo y un directorio.

import java.io.File;
public class Maker {
    public static void main(String[] args){
        try{
            File dir = new File("dir3");
            dir.mkdir();
            File file = new File(dir,"file3");
            file.createNewFile();
        }catch(Exception x){
        }
    }
}

Categorías
Basics

Ejemplo simple para mostrar cómo usar el formato de fecha en Java

La siguiente es una pregunta del «Programador certificado por SCJP Sun para el examen de la guía de estudio de Java 6» por Kathy Sierra y Bert Bates. Personalmente, no creo que esta sea una buena pregunta, pero es bueno saber cómo usar la clase DateFormat.

Dado que 1119280000000L es aproximadamente el número de milisegundos desde el 1 de enero de 1970 hasta el 20 de junio de 2005, y que desea imprimir esa fecha en alemán, utilizando el estilo LARGO de modo que «junio» se muestre como «Juni».

import java.text.*;
import java.util.*;
//import java.date.*;// There is such package defined in Java!!
public class DateFormatExample {
    public static void main(String[] args){
        Date d = new Date(1119280000000L);
        DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.GERMANY);
        System.out.println(df.format(d));
    }
}

Categorías
Basics

Anulación frente a sobrecarga en Java

Overriding y Overloading son dos conceptos muy importantes en Java. Son confusos para los programadores novatos de Java. Esta publicación ilustra sus diferencias usando dos ejemplos simples.

1. Definiciones

Sobrecarga ocurre cuando dos o más métodos en una clase tienen el mismo nombre de método pero diferentes parámetros.

Primordial significa tener dos métodos con el mismo nombre de método y parámetros (es decir, firma del método). Uno de los métodos está en la clase principal y el otro en la clase secundaria. La anulación permite que una clase secundaria proporcione una implementación específica de un método que ya se proporciona en su clase principal.

2. Anulación frente a sobrecarga

A continuación, se muestran algunos datos importantes sobre la anulación y la sobrecarga:

1). El tipo de objeto real en el tiempo de ejecución, no el tipo de la variable de referencia, determina qué método anulado se usa en tiempo de ejecución. Por el contrario, el tipo de referencia determina qué método sobrecargado se utilizará en tiempo de compilación.
2). El polimorfismo se aplica a la sobrecarga, no a la sobrecarga.
3). La anulación es un concepto de tiempo de ejecución, mientras que la sobrecarga es un concepto de tiempo de compilación.

3. Un ejemplo de anulación

A continuación, se muestra un ejemplo de anulación. Después de leer el código, adivina el resultado.

class Dog{
    public void bark(){
        System.out.println("woof ");
    }
}
class Hound extends Dog{
    public void sniff(){
        System.out.println("sniff ");
    }
 
    public void bark(){
        System.out.println("bowl");
    }
}
 
public class OverridingTest{
    public static void main(String [] args){
        Dog dog = new Hound();
        dog.bark();
    }
}

Producción:

bowl

En el ejemplo anterior, el dog La variable se declara como una Dog. Durante el tiempo de compilación, el compilador comprueba si el Dog la clase tiene el bark() método. Siempre y cuando el Dog la clase tiene el bark() método, los compiladores de código. En tiempo de ejecución, un Hound se crea y se asigna a dog. La JVM sabe que dog se refiere al objeto de Hound, por lo que llama al bark() método de Hound. Esto se llama polimorfismo dinámico.

4. Un ejemplo de sobrecarga

class Dog{
    public void bark(){
        System.out.println("woof ");
    }
 
    //overloading method
    public void bark(int num){
    	for(int i=0; i<num; i++)
    		System.out.println("woof ");
    }
}

En este ejemplo de sobrecarga, los dos bark El método se puede invocar utilizando diferentes parámetros. El compilador sabe que son diferentes porque tienen una firma de método diferente (nombre del método y lista de parámetros del método).

Referencias:
1) Método de definición. Este tutorial es de Oracle, explica los componentes de un método y cuáles son usados ​​por el compilador para diferenciar métodos.

Categorías
Basics

Declaración, inicialización y alcance para Java

El siguiente es un resumen para mostrar la declaración, inicialización y alcance de Java.

  1. Las variables definidas en el bloque try no son visibles en el bloque catch.
  2. No puede pasar parámetros cuando implementa una interfaz mediante una clase anónima.
  3. Los constructores no pueden devolver nada. Ni siquiera vacío.
  4. Cada enumeración tiene un método values ​​() que devuelve una matriz de todos los valores en esa enumeración en el orden en que están definidos.
  5. System.out.println (0x10 + 10 + 010); Los valores hexadecimales se pueden denotar con el prefijo 0x (cero y ‘x’ mayúscula o minúscula), por lo que 0x10 equivale a 16 decimales. Los valores octales se pueden denotar con el prefijo 0 (cero), por lo que 010 es equivalente a 8 decimales. La expresión completa se evaluará a 34 (16 + 10 + 8).
  6. Las variables no se pueden declarar sincronizadas. Solo los métodos pueden declararse sincronizados.
  7. Cualquier clase puede declararse abstracta.
  8. Los métodos no estáticos pueden acceder a métodos estáticos y no estáticos de una clase.
  9. Solo se puede definir una clase pública en un archivo.
  10. Para construir una clase Base, es necesario construir su superclase primero. Por lo tanto, se debe llamar a algún constructor de la superclase. O lo llama explícitamente o el compilador agregará super () (es decir, sin constructor de argumentos) como la primera línea del constructor de subclase. Ahora, si la superclase no tiene un constructor sin argumentos, la llamada super () fallará. En lugar de llamar a super (…), también puede llamar a otro constructor de la clase base en la primera línea.
  11. A diferencia de los métodos, un constructor no puede ser abstracto, estático, final, nativo o sincronizado. Un constructor no se hereda, por lo que no es necesario declararlo final y nunca se podría implementar un constructor abstracto. Un constructor siempre se invoca con respecto a un objeto, por lo que no tiene sentido que un constructor sea estático. No hay una necesidad práctica de sincronizar un constructor, porque bloquearía el objeto en construcción, que normalmente no está disponible para otros hilos hasta que todos los constructores del objeto hayan completado su trabajo. La falta de constructores nativos es una elección de diseño de lenguaje arbitrario que facilita que una implementación de la máquina virtual Java verifique que los constructores de superclase siempre se invocan correctamente durante la creación de objetos.
  12. La construcción ‘{}’ es una declaración compuesta. La declaración compuesta puede contener cero o más declaraciones arbitrarias. Por tanto, {{}}, que es una declaración compuesta que contiene una declaración que es una declaración compuesta que no contiene ninguna declaración, es legal.
  13. ‘static’ y ‘final’ son modificadores válidos para declaraciones de ‘variable’ y ‘método’ dentro de una clase.
  14. Los modificadores ‘transitorios’ y ‘volátiles’ solo son válidos para ‘variables’.
  15. ‘abstracto’ y ‘nativo’ solo son válidos para ‘métodos’.
  16. Nota: una clase solo puede tener como modificadores ‘final’, ‘abstract’ y ‘public’.
  17. Una clase puede extenderse a menos que se declare final. Si bien se declara un método, estático generalmente implica que también es final, esto no es cierto para las clases.
  18. Una clase interna puede declararse estática y aún así extenderse. Note la distinción. Para las clases, final significa que no se puede extender, mientras que para los métodos, final significa que no se puede reemplazar en una subclase.
  19. La palabra clave nativa solo se puede usar en métodos, no en clases y variables de instancia.

Categorías
Basics

Un método para detectar si la cadena contiene solo letras mayúsculas en Java

Mi acercamiento

Este método recorre cada carácter de la cadena y determina si cada carácter está en mayúsculas. El valor de la letra mayúscula es de 97 a 122.

public static boolean testAllUpperCase(String str){
		for(int i=0; i<str.length(); i++){
			char c = str.charAt(i);
			if(c >= 97 && c <= 122) {
				return false;
			}
		}
		//str.charAt(index)
		return true;
	}

¿Algún otro enfoque mejor con respecto al rendimiento?

Opción 1

Del comentario de Hans Dampf a continuación:

Utilice java.lang.Character # isUpperCase () y #isLetter () en lugar de los números mágicos.

Categorías
Basics

Verifique que un carácter en una cadena sea número o no en Java

Todo lo que necesita es esta sencilla función en el paquete java.lang.

Character.isDigit(c)

Por supuesto, si desea verificar un carácter en una cadena, primero debe obtener el carácter utilizando lo siguiente.

str.charAt(i)

Categorías
Basics

¿Cómo construir su propia biblioteca de Java?

La reutilización de código es uno de los factores más importantes en el desarrollo de software. Es MUY buena idea juntar las funciones de uso frecuente y crear una biblioteca para usted. Siempre que se utilice algún método, simplemente realice una invocación de método. Para Java, es sencillo administrar dicha biblioteca. Aquí un ejemplo simple en Eclipse. La biblioteca contendrá solo un método «agregar» para fines de demostración.

Paso 1: Cree un «Proyecto Java» llamado «MyMath» y un método simple «agregar» en la clase «Simple».

La estructura del paquete es la siguiente:

Simple.java

public class Simple {
	public static int add(int a, int b){
		return a+b;
	}
}

Paso 2: Exportar como archivo .jar.

Haga clic derecho en el proyecto y seleccione «exportar», se muestra una ventana de la siguiente manera.

Siguiendo el asistente, para obtener el archivo .jar.

Paso 3: usa el archivo jar.

Haga clic con el botón derecho en el proyecto de destino y seleccione «Ruta de compilación» -> «Agregar archivos externos» -> siguiente asistente para agregar el archivo jar.

Ahora puede realizar una llamada a un método simple.

public class Main {
	public static void main(String[] args) {
		System.out.println(Simple.add(1, 2));
	}
}

Por último, pero no menos importante, la biblioteca debe actualizarse y optimizarse constantemente. La documentación es importante. Si la biblioteca no está bien documentada, es posible que olvide por completo una función que programó hace un año. Deben usarse nombres de paquetes adecuados para indicar la función de clases y métodos. Por ejemplo, puede nombrar la primera capa de los paquetes siguiendo los nombres de los paquetes de la biblioteca estándar de Java: programcreek.util, programcreek.io, programcreek.math, programcreek.text, etc. nivel. Además, siempre investigue lo suficiente primero y asegúrese de que no haya implementaciones de lo que desea hacer antes de comenzar a programar algo. Las bibliotecas de la industria utilizan el poder de miles de desarrolladores inteligentes.

Categorías
Basics

¿Otro «Java pasa por referencia o por valor»?

Esta es una pregunta clásica de la entrevista que confunde a los desarrolladores principiantes de Java. En esta publicación usaré un ejemplo y algún diagrama para demostrar que: Java es paso por valor.

1. Algunas definiciones

Pasar por valor: hacer una copia en la memoria del valor del parámetro actual que se pasa.
Pasar por referencia: pasar una copia de la dirección del parámetro actual.

Java siempre se pasa por valor. Los tipos de datos primitivos y la referencia de objetos son solo valores.

2. Pasar variable de tipo primitivo

Dado que Java se pasa por valor, no es difícil entender que el siguiente código no intercambiará nada.

swap(Type arg1, Type arg2) {
    Type temp = arg1;
    arg1 = arg2;
    arg2 = temp;
}

3. Pasar variable de objeto

Java manipula objetos por referencia y todas las variables de objeto son referencias. Sin embargo, Java no pasa los argumentos del método por referencia, sino por valor.

La pregunta es: ¿por qué se puede cambiar el valor de miembro del objeto?

Código:

class Apple {
	public String color="red";
}
 
public class Main {
	public static void main(String[] args) {
		Apple apple = new Apple();
		System.out.println(apple.color);
 
		changeApple(apple);
		System.out.println(apple.color);
	}
 
	public static void changeApple(Apple apple){
		apple.color = "green";
	}
}

Dado que la referencia original y copiada hacen referencia al mismo objeto, el valor del miembro cambia.

Producción:

red
green

Categorías
Basics

Un rompecabezas de «Una breve historia del mundo (Java) y un adelanto» presentado por Neal Gafter

Aquí hay un rompecabezas de Java de la presentación de Neal Gafter.

¿Cuál es la correcta, a, b, c o d?

La respuesta es d.

Hay 3 defectos en este programa:

1. Aparentemente, no hay «interrupción» en la declaración de cambio.

2. nextInt (2) solo devolverá 0 o 1.

3. ‘P’, ‘G’, ‘M’ son caracteres, no cadenas. Entonces usa el constructor incorrecto.

Hay más acertijos en el libro a continuación, si quieres hacer más.