Categorías
Basics

Nivel de acceso de Java para miembros: público, protegido, privado

El nivel de acceso de Java contiene dos partes: 1) nivel de acceso para clases y 2) nivel de acceso para miembros.

Para el nivel de acceso a la clase, la palabra clave puede ser public o ningún modificador explícito (paquete-privado). Para el nivel de acceso de miembros, la palabra clave puede ser public, protected, paquete-privado (sin modificador explícito), o private.

La siguiente tabla resume el nivel de acceso de diferentes modificadores para miembros. El nivel de acceso determina la accesibilidad de campos y métodos. Tiene 4 niveles: público, protegido, paquete-privado (sin modificador explícito) o privado.

Categorías
Basics

¿Cómo se ven los objetos Java en la memoria durante el tiempo de ejecución?

Como ya sabrá, una vez que se crea un objeto, es solo una serie de bytes en el montón. Es posible que sienta curiosidad por saber cómo se ven exactamente los objetos Java en la memoria.

1. Campos

A continuación se muestra un ejemplo de un diseño de objeto para la clase «Base» (B). Esta clase no tiene ningún método. Veremos cómo se establecen los métodos en la memoria más adelante en la publicación.

Si tenemos otra clase «Derivado» (D) ampliando esta clase «Base». El diseño de la memoria se vería así:

El objeto secundario tiene el mismo diseño de memoria que los objetos principales, excepto que necesita más espacio para colocar los campos recién agregados. El beneficio de este diseño es que un puntero de tipo B que apunta a un objeto D todavía ve el objeto B al principio. Por lo tanto, las operaciones realizadas en un objeto D a través de la referencia B garantizan que sean seguras, y no hay necesidad de verificar a qué apunta B dinámicamente.

2. Métodos

Siguiendo la misma lógica, el método se puede poner al principio de los objetos.

Sin embargo, este enfoque no es eficaz. Si una clase tiene muchos métodos (por ejemplo, M), entonces cada objeto debe tener configurados punteros O (M). Además, cada objeto debe tener espacio para punteros O (M). Esos hacen que la creación de objetos sea más lenta y los objetos más grandes.

El enfoque de optimización es crear una tabla de función virtual (o vtable) que es una matriz de punteros a las implementaciones de funciones miembro para una clase en particular. Cree una única instancia de vtable para cada clase y haga que cada objeto almacene un puntero a vtable.

Este es el enfoque optimizado.

* Las anteriores son mis notas para las conferencias de compiladores de Standford que tienen muy buena animación.

Referencias:
1. Conferencias de compiladores de Stanford
2. JVM

Categorías
Basics

diagrama de jerarquía de clases java io

La gran cantidad de clases en el paquete Java IO es abrumadora y molesta. Sin embargo, si usamos Java, aún necesitamos entender esas clases. De hecho, las clases en el paquete Java IO no son muy complejas, pero necesitamos una buena forma de aprenderlas. Hay dos factores importantes para comprender las clases:

1). Diagrama de jerarquía de clases de Java io
2). Patrón de decorador

Diagrama de jerarquía de clases para java.io.inputstream

Diagrama de jerarquía de clases para java.io.reader

diagrama de jerarquía de clases java io

Los otros dos (escritor, flujo de salida) son similares a los anteriores. Esos diagramas de jerarquía de clases son de http://www.falkhausen.de, y el sitio tiene muchos diagramas para otros paquetes.

Categorías
Basics Python Versus

Java vs.Python (2): tipos de datos

Si conoce Java y desea tener una idea rápida de cómo usar Python desde el principio, el siguiente resumen puede proporcionarle una revisión rápida de los tipos de datos. También puede resultarle útil la comparación anterior de Java y Python.

Al comparar los tipos de datos entre Java y Python, puede obtener la diferencia y comenzar a usar Python rápidamente. La comparación también puede ayudar a los desarrolladores a comprender los conceptos comunes compartidos por diferentes lenguajes de programación.

Aparentemente, Java tiene más tipos / estructuras de datos que Python, por lo que enumeraré el concepto más similar de Java para los tipos de datos de Python correspondientes.

1. Cuerdas

Java Pitón
//string
String city = "New York";
String state = "California";//has to be " not '
 
String lines = "multi-line " +
		"string";
# Strings
city = "New York"
state = 'California'
 
# multi-line string
lines = """multi-line
string"""
moreLines = '''multi-line
string'''

En Python, la cadena puede residir en un par de comillas simples y en un par de comillas dobles. Admite la multiplicación: «x» * 3 es «xxx».

2. Números

Java Pitón
//integer numbers
int num = 100;
 
//floating point numbers
float f = 1.01f; 
//float f = 1.01;//wrong!
 
double d = 1.01;
# integer numbers
num = 100
num = int("100")
 
# floating point numbers
f = 1.01
f = float("1.01")
 
# null
spcial = None

En Java, cuando escribe algo como 1.01, se interpreta como un doble.
Double es un punto flotante IEEE 754 de precisión de 64 bits, mientras que float es un punto flotante IEEE 754 de precisión de 32 bits.
Como un flotante es menos preciso que un doble, la conversión no se puede realizar implícitamente.

3. Nulo

Java Pitón
//null
Object special = null;
# null
spcial = None

4. Listas

Java Pitón
//arraylist is closest with list in python
ArrayList<Integer> aList = 
  new ArrayList<Integer>();
 
//add
aList.add(1);
aList.add(3);
aList.add(2);
aList.add(4);
 
//index
int n = aList.get(0);
 
//get sub list
List<Integer> subList = 
  aList.subList(0, 2);
//1, 3
aList = []
aList = [1, 'mike', 'john']
 
#append
aList.append(2)
 
# extend
aList.extend(["new","list"])
 
print aList
#[1, 'mike', 'john', 2, 'new', 'list']
 
aList = [0,1,2,3,4,5,6]
# size
print len(aList)
#7
 
print aList[2]
#2
 
print aList[0:3]
#[0, 1, 2]
 
print aList[2:]
#[2, 3, 4, 5, 6]
 
print aList[-2]
#5
 
#lists are mutable
aList[0] = 10
print aList
#[10, 1, 2, 3, 4, 5, 6]

5. Tuplas

Java Pitón
No hay tuplas en Java.
aTuple = ()
aTuple = (5) # cause error
aTuple = (5,)
 
print aTuple
print aTuple[0]
#5

En Python, las tuplas son similares con las listas, y la diferencia entre ellas es que la tupla es inmutable. Eso significa que los métodos que cambian el valor de las listas no se pueden usar en tuplas.

Para asignar una tupla de un solo elemento, tiene que ser: aTuple = (5,). Si se quita la coma, será incorrecto.

6. Conjuntos

Java Pitón
//hashset
HashSet<String> aSet = new HashSet<String>();
aSet.add("aaaa");
aSet.add("bbbb");
aSet.add("cccc");
aSet.add("dddd");
 
//iterate over set
Iterator<String> iterator = aSet.iterator();
while (iterator.hasNext()) {
	System.out.print(iterator.next() + " ");
}
 
HashSet<String> bSet = new HashSet<String>();
bSet.add("eeee");
bSet.add("ffff");
bSet.add("gggg");
bSet.add("dddd");
 
//check if bSet is a subset of aSet
boolean b = aSet.containsAll(bSet);
 
//union - transform aSet 
//into the union of aSet and bSet
aSet.addAll(bSet);
 
//intersection - transforms aSet 
//into the intersection of aSet and bSet
aSet.retainAll(bSet); 
 
//difference - transforms aSet 
//into the (asymmetric) set difference
// of aSet and bSet. 
aSet.removeAll(bSet);
aSet = set()
aSet = set("one") # a set containing three letters
#set(['e', 'o', 'n'])
 
aSet = set(['one', 'two', 'three'])
#set(['three', 'two', 'one'])
#a set containing three words
 
#iterate over set
for v in aSet:
    print v
 
bSet = set(['three','four', 'five'])
 
#union 
cSet = aSet | bSet
#set(['four', 'one', 'five', 'three', 'two'])
 
#intersection
dSet = aSet & bSet
 
#find elements in aSet not bSet
eSet = aSet.difference(bSet)
 
#add element
bSet.add("six")
#set(['four', 'six', 'five', 'three'])

7. Diccionarios

Los diccionarios en Python son como los mapas en Java.

Java Pitón
HashMap<String, String> phoneBook = 
                        new HashMap<String, String>();
phoneBook.put("Mike", "555-1111");
phoneBook.put("Lucy", "555-2222");
phoneBook.put("Jack", "555-3333");
 
//iterate over HashMap
Map<String, String> map = new HashMap<String, String>();
for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println("Key = " + entry.getKey() +
      ", Value = " + entry.getValue());
}
 
//get key value
phoneBook.get("Mike");
 
//get all key
Set keys = phoneBook.keySet();
 
//get number of elements
phoneBook.size();
 
//delete all elements
phoneBook.clear();
 
//delete an element
phoneBook.remove("Lucy");
#create an empty dictionary
phoneBook = {}
phoneBook = {"Mike":"555-1111", 
             "Lucy":"555-2222", 
             "Jack":"555-3333"}
 
#iterate over dictionary
for key in phoneBook:
    print(key, phoneBook[key])
 
#add an element
phoneBook["Mary"] = "555-6666"
 
#delete an element
del phoneBook["Mike"]
 
#get number of elements
count = len(phoneBook)
 
#can have different types
phoneBook["Susan"] = (1,2,3,4)
 
#return all keys
print phoneBook.keys()
 
#delete all the elements
phoneBook.clear()

Más sobre las colecciones de Java:

  • Diagrama de jerarquía de colecciones
  • Conjunto: HashSet frente a TreeSet frente a LinkedHashSet
  • Lista: ArrayList vs.LinkList vs.Vector
  • Mapa: HashMap frente a TreeMap frente a Hashtable frente a LinkedHashMap

Categorías
Basics Collections

Bucle un iterable en Java

Si usa alguna API de Java y devuelve un Iterable, como Iterable, es posible que desee repetir este iterable.

El método es bastante simple de la siguiente manera:

Iterable<String> result = ... //result returned from some method.
for(String s: result){
	System.out.println(s);
}

Si utiliza hasNext(), también puede hacer lo siguiente:

Iterable<String> result = ... //result returned from some method.
Iterator<String> iter = result.iterator();
while(iter.hasNext()){
	System.out.println(iter.next());
}

Iterable es una interfaz en java.lang, define que un método iterator() que devuelve un iterador.

Categorías
Basics

Ejemplo doble de Java

¿Alguna vez te has encontrado con la situación en la que obtienes un número entero pero realmente quieres un doble?

Para el siguiente método, devide (2,3) devolverá 0.0.

public static double devide(int x, int y){
	return x/y;
}

El problema es que x / y hace una división int. Si desea que haga una división doble, puede convertir uno de los operandos. Ambos (doble) x / y y x / (doble) y funcionarán.

public static double devide(int x, int y){
	return (double)x/y;
}

Muy a menudo, es posible que desee redondear un número doble. Hay varias formas de hacerlo y el siguiente es un método simple de uso común. Si desea redondear el resultado a 2 dígitos, puede utilizar el siguiente código:

public static double divide(int x, int y){
	double z= (double)x/y;
	double pro = Math.round(z * 100);
	return pro/100;
}

Categorías
Basics Diagram Java

¿Por qué String es inmutable en Java?

String es inmutable en Java. Una clase inmutable es simplemente una clase cuyas instancias no se pueden modificar. Toda la información de una instancia se inicializa cuando se crea la instancia y la información no se puede modificar. Hay muchas ventajas de las clases inmutables. Este artículo resume por qué String está diseñado para ser inmutable. Este artículo ilustra el concepto de inmutabilidad en la perspectiva de la memoria, la sincronización y las estructuras de datos.

1. Requisito de la agrupación de cadenas

El grupo de cuerdas (grupo interno de cuerdas) es un área de almacenamiento especial en el área de métodos. Cuando se crea una cadena y si la cadena ya existe en el grupo, se devolverá la referencia de la cadena existente, en lugar de crear un nuevo objeto.

El siguiente código creará solo un objeto de cadena en el montón.

String string1 = "abcd";
String string2 = "abcd";

Así es como se ve:

Si una cadena es mutable, cambiar la cadena con una referencia conducirá a un valor incorrecto para las otras referencias.

2. Almacenamiento en caché de Hashcode

El código hash de una cadena se usa con frecuencia en Java. Por ejemplo, en un HashMap o HashSet. Ser inmutable garantiza que el hashcode siempre será el mismo para que se pueda cobrar sin preocuparse por los cambios, es decir, no es necesario calcular el hashcode cada vez que se utiliza. Esto es más eficiente.

En la clase String, tiene el siguiente código:

private int hash;//this is used to cache hash code.

3. Facilitar el uso de otros objetos

Para hacer esto concreto, considere el siguiente programa:

HashSet<String> set = new HashSet<String>();
set.add(new String("a"));
set.add(new String("b"));
set.add(new String("c"));
 
for(String a: set)
	a.value = "a";

En este ejemplo, si String es mutable, su valor se puede cambiar, lo que violaría el diseño del conjunto (el conjunto contiene elementos no duplicados). Por supuesto, el ejemplo anterior es solo para fines de demostración y no hay value campo en una clase de cadena real.

4. Seguridad

String se usa ampliamente como parámetro para muchas clases de Java, por ejemplo, conexión de red, apertura de archivos, etc. Si String no fuera inmutable, se cambiaría una conexión o un archivo y esto puede conducir a una seria amenaza a la seguridad. El método pensó que se estaba conectando a una máquina, pero no fue así. Las cadenas mutables también podrían causar un problema de seguridad en Reflection, ya que los parámetros son cadenas.

Aquí hay un ejemplo de código:

boolean connect(string s){
    if (!isSecure(s)) { 
throw new SecurityException(); 
}
    //here will cause problem, if s is changed before this by using other references.    
    causeProblem(s);
}

5. Los objetos inmutables son naturalmente seguros para subprocesos

Debido a que los objetos inmutables no se pueden cambiar, se pueden compartir libremente entre varios subprocesos. Esto elimina los requisitos de sincronización.

En resumen, String está diseñado para ser inmutable por razones de eficiencia y seguridad. Esta es también la razón por la que se prefieren las clases inmutables en muchos casos en general.

Categorías
Basics

¿Qué es Servlet Container?

En esta publicación, escribo un poco sobre las ideas básicas de Servidor web, Contenedor de servlet y su relación con JVM. Quiero mostrar que el contenedor Servlet no es más que un programa Java.

1. ¿Qué es un servidor web?

Para saber qué es un contenedor de servlets, primero necesitamos saber qué es un servidor web.

A Servidor web utiliza el protocolo HTTP para transferir datos. En una situación simple, un usuario escribe una URL (por ejemplo, www.programcreek.com/static.html) en el navegador (un cliente) y obtiene una página web para leer. Entonces, lo que hace el servidor es enviar una página web al cliente. La transformación está en el protocolo HTTP que especifica el formato de la solicitud y el mensaje de respuesta.

2. ¿Qué es un contenedor de servlets?

Como vemos aquí, el usuario / cliente solo puede solicitar una página web estática del servidor. Esto no es suficientemente bueno si el usuario quiere leer la página web basándose en su entrada. La idea básica del contenedor Servlet es usar Java para generar dinámicamente la página web en el lado del servidor. Entonces, el contenedor de servlets es esencialmente una parte de un servidor web que interactúa con los servlets.

servidor web y contenedor de servlets

Contenedor de servlet es el contenedor de Servlets.

3. ¿Qué es un servlet?

Servlet es una interfaz definida en el paquete javax.servlet. Declara tres métodos esenciales para el ciclo de vida de un servlet: init (), service () y destroy (). Son implementados por cada servlet (definidos en SDK o autodefinidos) y son invocados en momentos específicos por el servidor.

  1. El método init () se invoca durante la etapa de inicialización del ciclo de vida del servlet. Se le pasa un objeto que implementa la interfaz javax.servlet.ServletConfig, que permite al servlet acceder a los parámetros de inicialización desde la aplicación web.
  2. El método service () se invoca en cada solicitud después de su inicialización. Cada solicitud se atiende en su propio hilo independiente. El contenedor web llama al método service () del servlet para cada solicitud. El método service () determina el tipo de solicitud que se realiza y la envía a un método apropiado para manejar la solicitud.
  3. El método destroy () se invoca cuando se debe destruir el objeto servlet. Libera los recursos retenidos.

A partir del ciclo de vida de un objeto de servlet, podemos ver que las clases de servlet se cargan en el contenedor mediante el cargador de clases de forma dinámica. Cada solicitud está en su propio hilo, y un objeto de servlet puede servir varios hilos al mismo tiempo (hilo no seguro). Cuando ya no se utilice, la JVM debería recoger la basura.

Como cualquier programa Java, el servlet se ejecuta dentro de una JVM. Para manejar la complejidad de las solicitudes HTTP, entra el contenedor de servlets. El contenedor de servlets es responsable de la creación, ejecución y destrucción de los servlets.

4. ¿Cómo el contenedor de Servlet y el servidor web procesan una solicitud?

  1. El servidor web recibe una solicitud HTTP
  2. El servidor web reenvía la solicitud al contenedor de servlets
  3. El servlet se recupera y carga dinámicamente en el espacio de direcciones del contenedor, si no está en el contenedor.
  4. El contenedor invoca el método init () del servlet para la inicialización (se invoca una vez cuando el servlet se carga por primera vez)
  5. El contenedor invoca el método service () del servlet para procesar la solicitud HTTP, es decir, leer los datos de la solicitud y formular una respuesta. El servlet permanece en el espacio de direcciones del contenedor y puede procesar otras solicitudes HTTP.
  6. El servidor web devuelve los resultados generados dinámicamente a la ubicación correcta

Los seis pasos están marcados en el siguiente diagrama:

contenedor de servlet - ciclo de vida

5. El papel de JVM

El uso de servlets permite que la JVM maneje cada solicitud dentro de un hilo de Java separado, y esta es una de las ventajas clave del contenedor de Servlet. Cada servlet es una clase Java con elementos especiales que responden a solicitudes HTTP. La función principal de Servlet contiene es enviar solicitudes al servlet correcto para su procesamiento y devolver los resultados generados dinámicamente a la ubicación correcta después de que JVM los haya procesado. En la mayoría de los casos, el contenedor de servlets se ejecuta en una sola JVM, pero existen soluciones cuando el contenedor necesita varias JVM.

Categorías
Basics Top 10

Los 10 métodos principales para matrices Java

Los siguientes son los 10 métodos principales para Java Array. Son las preguntas más votadas de stackoverflow.

0. Declare una matriz

String[] aArray = new String[5];
String[] bArray = {"a","b","c", "d", "e"};
String[] cArray = new String[]{"a","b","c","d","e"};

1. Imprime una matriz en Java

int[] intArray = { 1, 2, 3, 4, 5 };
String intArrayString = Arrays.toString(intArray);
 
// print directly will print reference value
System.out.println(intArray);
// [[email protected]
 
System.out.println(intArrayString);
// [1, 2, 3, 4, 5]

2. Cree una ArrayList a partir de una matriz

String[] stringArray = { "a", "b", "c", "d", "e" };
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));
System.out.println(arrayList);
// [a, b, c, d, e]

3. Verifique si una matriz contiene un cierto valor

String[] stringArray = { "a", "b", "c", "d", "e" };
boolean b = Arrays.asList(stringArray).contains("a");
System.out.println(b);
// true

4. Concatenar dos matrices

int[] intArray = { 1, 2, 3, 4, 5 };
int[] intArray2 = { 6, 7, 8, 9, 10 };
// Apache Commons Lang library
int[] combinedIntArray = ArrayUtils.addAll(intArray, intArray2);

5. Declare una matriz en línea

method(new String[]{"a", "b", "c", "d", "e"});

6. Une los elementos de la matriz proporcionada en una sola cadena

// containing the provided list of elements
// Apache common lang
String j = StringUtils.join(new String[] { "a", "b", "c" }, ", ");
System.out.println(j);
// a, b, c

7. Covnerte una ArrayList a una matriz

String[] stringArray = { "a", "b", "c", "d", "e" };
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));
String[] stringArr = new String[arrayList.size()];
arrayList.toArray(stringArr);
for (String s : stringArr)
	System.out.println(s);

8. Convierta una matriz en un conjunto.

Set<String> set = new HashSet<String>(Arrays.asList(stringArray));
System.out.println(set);
//[d, e, b, c, a]

9. Invierta una matriz

int[] intArray = { 1, 2, 3, 4, 5 };
ArrayUtils.reverse(intArray);
System.out.println(Arrays.toString(intArray));
//[5, 4, 3, 2, 1]

10. Eliminar elemento de una matriz

int[] intArray = { 1, 2, 3, 4, 5 };
int[] removed = ArrayUtils.removeElement(intArray, 3);//create a new array
System.out.println(Arrays.toString(removed));

Uno más: convierta int en matriz de bytes

byte[] bytes = ByteBuffer.allocate(4).putInt(8).array();
 
for (byte t : bytes) {
   System.out.format("0x%x ", t);
}

Categorías
Basics Top 10

Las 10 preguntas principales de las cadenas de Java

Las siguientes son las 10 preguntas más frecuentes acerca de las cadenas de Java.

1. ¿Cómo comparar cadenas? ¿Usar «==» o usar igual ()?

En resumen, «==» prueba si las referencias son iguales y equals () prueba si los valores son iguales. A menos que desee verificar si dos cadenas son el mismo objeto, siempre debe usar equals ().

Sería mejor si conociera el concepto de prácticas de cuerdas.

2. ¿Por qué char[] preferido sobre String para información confidencial de seguridad?

Las cadenas son inmutables, lo que significa que una vez que se crean, permanecerán sin cambios hasta que Garbage Collector se active. Con una matriz, puede cambiar explícitamente sus elementos. De esta manera, la información confidencial de seguridad (por ejemplo, contraseña) no estará presente en ninguna parte del sistema.

3. ¿Podemos usar una cadena para la declaración de cambio?

Sí a la versión 7. Desde JDK 7, podemos usar una cadena como condición de cambio. Antes de la versión 6, no podemos usar una cadena como condición de cambio.

// java 7 only!
switch (str.toLowerCase()) {
      case "a":
           value = 1;
           break;
      case "b":
           value = 2;
           break;
}

4. ¿Cómo convertir cadenas a int?

int n = Integer.parseInt("10");

Simple, pero de uso frecuente y, a veces, ignorado.

5. ¿Cómo dividir una cadena con espacios en blanco?

String[] strArray = aString.split("s+");

6. ¿Qué método de subcadena () realmente hace?

En JDK 6, el método substring () da una ventana a una matriz de caracteres que representa la Cadena existente, pero no crea una nueva. Para crear una nueva cadena representada por una nueva matriz de caracteres, puede agregar una cadena vacía como la siguiente:

str.substring(m, n) + ""

Esto creará una nueva matriz de caracteres que representará la nueva cadena. El enfoque anterior a veces puede hacer que su código sea más rápido, porque Garbage Collector puede recolectar la cadena grande no utilizada y conservar solo la subcadena.

En Oracle JDK 7, substring () crea una nueva matriz de caracteres, no usa la existente. Consulte el diagrama para mostrar la diferencia de subcadena () entre JDK 6 y JDK 7.

7. String vs StringBuilder vs StringBuffer

String vs StringBuilder: StringBuilder es mutable, lo que significa que puede modificarlo después de su creación.
StringBuilder vs StringBuffer: StringBuffer está sincronizado, lo que significa que es seguro para subprocesos pero más lento que StringBuilder.

8. ¿Cómo repetir una cadena?

En Python, podemos simplemente multiplicar un número para repetir una cadena. En Java, podemos usar el método repeat () de StringUtils del paquete Apache Commons Lang.

String str = "abcd";
String repeated = StringUtils.repeat(str,3);
//abcdabcdabcd

9. ¿Cómo convertir cadenas a la fecha?

String str = "Sep 17, 2013";
Date date = new SimpleDateFormat("MMMM d, yy", Locale.ENGLISH).parse(str);
System.out.println(date);
//Tue Sep 17 00:00:00 EDT 2013

10. ¿Cómo contar el número de apariciones de un carácter en una cadena?

Utilice StringUtils de apache commons lang.

int n = StringUtils.countMatches("11112222", "1");
System.out.println(n);

Uno mas
¿Sabes cómo detectar si una cadena contiene solo letras mayúsculas?