Categorías
Basics

¿Cómo calcular la diferencia horaria en Java?

Dadas dos cadenas de tiempo, es posible que desee calcular la diferencia entre ellas. Lo siguiente proporciona una solución simple.

import java.text.SimpleDateFormat;
import java.util.Date;
 
public class Main {
	public static void main(String[] args) throws Exception{
		String time1 = "12:00:00";
		String time2 = "12:01:00";
 
		SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
		Date date1 = format.parse(time1);
		Date date2 = format.parse(time2);
		long difference = date2.getTime() - date1.getTime();
		System.out.println(difference/1000);
	}
}

Producción:

60

Tenga en cuenta que la diferencia está en milisegundos, debe dividirse por 1000 para obtener el número de segundos. Puede cambiar fácilmente el parámetro de SimpleDateFormat para usar otro formato de hora. Por ejemplo, «HH: mm: ss.SSS» también tomará milisegundos. Para obtener más información sobre SimpleDateFormat, vaya a su Documento de Java.

Categorías
Basics Java

Ejemplos de Java Varargs

1. ¿Qué es Varargs en Java?

Varargs (argumentos variables) es una característica introducida en Java 1.5. Permite que un método tome un número arbitrario de valores como argumentos.

public static void main(String[] args) {
	print("a");
	print("a", "b");
	print("a", "b", "c");
}
 
public static void print(String ... s){
	for(String a: s)
		System.out.println(a);
}

2. ¿Cómo funcionan los Varargs?

Cuando se usa la función de varargs, en realidad primero crea una matriz cuyo tamaño es el número de argumentos pasados ​​en el sitio de llamada, luego coloca los valores de los argumentos en la matriz y finalmente pasa la matriz al método.

3. ¿Cuándo usar Varargs?

Como indica su definición, varargs es útil cuando un método necesita tratar con un número arbitrario de objetos. Un buen ejemplo de Java SDK es String.format(String format, Object... args). La cadena puede formatear cualquier número de parámetros, por lo que se utiliza varargs.

String.format("An integer: %d", i);
String.format("An integer: %d and a string: %s", i, s);

Categorías
Basics I/O Java Serialization

Serialización de Java

¿Qué es la serialización?

En Java, la serialización de objetos significa representar un objeto como una secuencia de bytes. Los bytes incluyen los datos y la información del objeto. Un objeto serializado puede escribirse en un archivo / base de datos, leerse del archivo / base de datos y deserializarse. Los bytes que representan el objeto y sus datos se pueden usar para recrear el objeto en la memoria.

¿Por qué necesitamos la serialización?

La serialización se usa generalmente cuando necesita enviar un objeto a través de la red o almacenarlo en archivos. La infraestructura de red y el disco duro solo pueden comprender bits y bytes, pero no objetos Java. La serialización traduce los objetos Java a bytes y los envía a través de la red o los guarda.

¿Por qué queremos almacenar o transferir un objeto? En mi experiencia en programación, tengo las siguientes razones que me motivan a usar objetos serializables.

  1. La creación de un objeto depende de mucho contexto. Una vez creado, sus métodos y sus campos son obligatorios para otros componentes.
  2. Cuando se crea un objeto y contiene muchos campos, no estamos seguros de qué utilizar. Así que guárdelo en la base de datos para su posterior análisis de datos.

Ejemplo de serialización de Java

El siguiente ejemplo muestra cómo hacer una clase serializable y serializarla y deserializarla.

package serialization;
 
import java.io.Serializable;
 
public class Dog implements Serializable {
	private static final long serialVersionUID = -5742822984616863149L;
 
	private String name;
	private String color;
	private transient int weight;
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public String getColor() {
		return color;
	}
 
	public void setColor(String color) {
		this.color = color;
	}
 
	public int getWeight() {
		return weight;
	}
 
	public void setWeight(int weight) {
		this.weight = weight;
	}
 
	public void introduce() {
		System.out.println("I have a " + color + " " + name + ".");
	}
}
package serialization;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
public class SerializeDemo {
	public static void main(String[] args) {
		//create an object
		Dog e = new Dog();
		e.setName("bulldog");
		e.setColor("white");
		e.setWeight(5);
 
		//serialize
		try {
			FileOutputStream fileOut = new FileOutputStream("./dog.ser");
			ObjectOutputStream out = new ObjectOutputStream(fileOut);
			out.writeObject(e);
			out.close();
			fileOut.close();
			System.out.printf("Serialized dog is saved in ./dog.ser");
		} catch (IOException i) {
			i.printStackTrace();
		}
 
		e = null;
 
		//Deserialize
		try {
			FileInputStream fileIn = new FileInputStream("./dog.ser");
			ObjectInputStream in = new ObjectInputStream(fileIn);
			e = (Dog) in.readObject();
			in.close();
			fileIn.close();
		} catch (IOException i) {
			i.printStackTrace();
			return;
		} catch (ClassNotFoundException c) {
			System.out.println("Dog class not found");
			c.printStackTrace();
			return;
		}
 
		System.out.println("nDeserialized Dog ...");
		System.out.println("Name: " + e.getName());
		System.out.println("Color: " + e.getColor());
		System.out.println("Weight: " + e.getWeight());
 
		e.introduce();
 
	}
}

Producción:

Serialized dog is saved in ./dog.ser
Deserialized Dog...
Name: bulldog
Color: white
Weight: 0
I have a white bulldog.

Categorías
Basics Java

Compile y ejecute Java en la línea de comandos con jarras externas

El siguiente ejemplo muestra cómo compilar y ejecutar un programa Java en modo de línea de comandos con archivos jar externos. Está desarrollado bajo Linux.

1. Compile y ejecute un programa Java sin Jar externo

Creemos un programa sencillo de hola mundo «helloworld.java».

public class helloworld{
        public static void main(String[] args){
                System.out.println("Hello!");
        }
}

Compilar y ejecutar

$ javac helloworld.java
$ java helloworld

Producción

Hello!

2. Compile y ejecute el programa Java con Jar externo

Ahora descarguemos una biblioteca de terceros y usemos algún método de la biblioteca. En este caso, descargué apache.commons.lang de aquí, y usa el StringUtils.capitalize() método. El archivo jar se descarga en el directorio «jars» que se encuentra en el mismo lugar que helloworld.java.

import org.apache.commons.lang3.*;
public class helloworld{
        public static void main(String[] args){
                String x = "abcd";
                System.out.println(StringUtils.capitalize(x));
        }
}

Compilar y ejecutar

$ javac -cp ".:./jars/common.jar" helloworld.java 
$ java -cp ".:./jars/common.jar" helloworld

Producción:

Abcd

Para Windows, «:» debe reemplazarse por «;».

Categorías
Basics Diagram Java

¿Crear cadena de Java usando ”” o constructor?


En Java, una cadena se puede crear de dos formas:

String x = "abc";
String y = new String("abc");

¿Cuál es la diferencia entre usar comillas dobles y usar el constructor?

1. Cotizaciones dobles contra constructor

Esta pregunta se puede responder utilizando dos ejemplos sencillos.

Ejemplo 1:

String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

a==b es cierto porque a y b se refieren al mismo literal de cadena en el área de métodos. Las referencias a la memoria son las mismas.

Cuando se crea el mismo literal de cadena más de una vez, solo se almacena una copia de cada valor de cadena distinto. Se llama «pasantía de cuerdas«. Todas las cadenas de constantes en tiempo de compilación en Java se internan automáticamente.

Ejemplo 2:

String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True

c==d es falso porque c y d se refieren a dos objetos diferentes en el montón. Los diferentes objetos siempre tienen diferentes referencias de memoria.

Este diagrama ilustra las dos situaciones anteriores:

2. Pasantía de cadenas en tiempo de ejecución

Gracias a LukasEder (su comentario a continuación):

La internación de cadenas aún se puede realizar en tiempo de ejecución, incluso si se construyen dos cadenas con constructores:

String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println(c == d);  // Now true
System.out.println(c.equals(d)); // True

3. Cuándo usar cuál

Debido a que el literal «abcd» ya es de tipo String, el uso del constructor creará un objeto adicional innecesario. Por lo tanto, se deben usar comillas dobles si solo necesita crear una cadena.

Si necesita crear un nuevo objeto en el montón, debe usar el constructor. Aquí hay un caso de uso.

Categorías
Basics Java

¿Cómo se clasifican los desarrolladores en Java?

Al analizar el código fuente de una gran cantidad de proyectos Java de código abierto, encontré que los desarrolladores de Java clasifican con frecuencia de dos maneras. Uno está usando el sort() método de Collections o Arraysy el otro utiliza estructuras de datos ordenadas, como TreeMap y TreeSet.

1. Usando el método sort ()

Si es una colección, use el método Collections.sort ().

// Collections.sort
List<ObjectName> list = new ArrayList<ObjectName>();
Collections.sort(list, new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});

Si es una matriz, use Arrays.sort() método.

// Arrays.sort
ObjectName[] arr = new ObjectName[10];
Arrays.sort(arr, new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});

Esto es muy conveniente si ya se ha configurado una colección o una matriz.

2. Uso de estructuras de datos ordenadas

Si es una lista o conjunto, use TreeSet para ordenar.

// TreeSet
Set<ObjectName> sortedSet = new TreeSet<ObjectName>(new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
sortedSet.addAll(unsortedSet);

Si es un mapa, use TreeMap para ordenar. TreeMap está ordenado por clave.

// TreeMap - using String.CASE_INSENSITIVE_ORDER which is a Comparator that orders Strings by compareToIgnoreCase
Map<String, Integer> sortedMap = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);
sortedMap.putAll(unsortedMap);
//TreeMap - In general, defined comparator
Map<ObjectName, String> sortedMap = new TreeMap<ObjectName, String>(new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
sortedMap.putAll(unsortedMap);

Este enfoque es muy útil, si desea realizar muchas operaciones de búsqueda para la colección. La estructura de datos ordenados dará una complejidad de tiempo de O(logn), que es menor que O(n).

3. Malas prácticas

Todavía existen malas prácticas, como el uso de algoritmos de clasificación autodefinidos. Tome el siguiente código, por ejemplo, no solo el algoritmo no es eficiente, sino que tampoco es legible. Esto sucede mucho en diferentes formas de variaciones.

double t;
for (int i = 0; i < 2; i++)
	for (int j = i + 1; j < 3; j++)
		if (r[j] < r[i]) {
			t = r[i];
			r[i] = r[j];
			r[j] = t;
		}

Categorías
Basics Collections

Java Eliminar elemento de ArrayList

Para eliminar algunos elementos de una ArrayList mientras iteramos sobre ArrayList, necesitamos usar Iterator.

Integer[] arr = {1,2,3,4,5,6};
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(arr));
System.out.println(list);
 
Iterator<Integer> iter = list.iterator();
while(iter.hasNext()){
	int i = iter.next();
	if(i==5)
		iter.remove();
}
 
System.out.println(list);

Si el elemento se elimina mediante el método ArrayList.remove (i) durante una iteración como la siguiente, el programa lanzará una ConcurrentModificationException.

for(int i: list){
	if(i==2)
		list.remove(list.indexOf(i));
}
java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)

Ejemplos de API de Java: java.util.Iterator

Categorías
Basics Java

Compile y ejecute proyectos Eclipse Java desde la terminal de Linux

Si está desarrollando un proyecto Java en Eclipse bajo un sistema Linux, es posible que desee acceder de forma remota al proyecto desde otra ubicación. Puede usar el escritorio remoto de Linux Box usando teamviewer, pero a veces eso puede ser muy lento. También puede editar, compilar y ejecutar su proyecto Java desde una terminal ssh normal. Usar la terminal para editar, compilar y ejecutar su proyecto de eclipse remoto suele ser más rápido. Esta publicación le muestra cómo compilar y ejecutar el proyecto eclipse en la terminal.

Líneas de comando utilizadas

Básicamente, necesitas los siguientes dos comandos. La opción -cp configura la ruta de clases, que apunta a los archivos de clase y los archivos jar utilizados. Si se utilizan varias bibliotecas, cada una de ellas debe incluirse y separarse con «:».

javac -cp “all jar file’s path” package/target.java
java -cp “all jar file’s path” package.target

Un ejemplo de proyecto Eclipse

A continuación, creé un proyecto Java bajo eclipse. El proyecto contiene una clase Test Qué esta en package1. los Test class usa algunas bibliotecas de terceros en / lib /.

compilar-y-ejecutar-eclipse-proyecto-terminal

Primero, cd al directorio / src / y compile el proyecto usando el siguiente comando.

javac -cp "/home/pc/workspace/TerminalEclipse/lib/commons-io-2.4.jar:
/home/pc/workspace/TerminalEclipse/lib/commons-lang-2.5.jar" 
package1/Test.java

En segundo lugar, ejecute el proyecto con el siguiente comando.

java -cp ".:/home/xiaoran/workspace/TerminalEclipse/lib/commons-io-2.4.jar:
/home/xiaoran/workspace/TerminalEclipse/lib/commons-lang-2.5.jar" 
package1.Test

* Nota: la primera parte del camino es . que apunta a la ruta actual.

El proceso de compilación generará archivos .class en el directorio / src /. Es posible que desee eliminarlo cuando vuelva a usar eclipse.

Problemas potenciales

Si está desarrollando un proyecto grande, puede usar muchas bibliotecas de terceros. Puede utilizar el siguiente código para generar las cadenas de ruta.

public static void printAllJars(){
	String str = "/home/pc/workspace/TerminalEclipse/lib";
	File file = new File(str);
 
	StringBuilder sb = new StringBuilder();
 
	File[] arr = file.listFiles();
	for(File f: arr){
		if(f.getName().endsWith(".jar")){
			sb.append(f.getAbsolutePath() + ":");
		}
	}
 
	String s = sb.toString();
	s = s.substring(0, s.length()-1);
 
	System.out.println(s);
}