Cosas del Core de Java que debes saber.

Hace tiempo me hablaron de una empresa para hacerme una entrevista, y como era una empresa que si me llamo la atención empece el proceso de selección hasta que llego el tan esperado momento de: "¿Podemos concertar una entrevista para que nuestro experto te haga algunas preguntas?" La respuesta ya la conocen y cuándo termino con el cuestionario recordé que algunas de preguntas ya las conocía de tiempo atrás, las cuales no tienen desperdicio y les comparto aquí traducidas, y al final del texto dejo el link del texto "original".

¿Cuál es un objeto inmutable en Java? ¿Se puede cambiar los valores de un objeto inmutable?

Un objeto Java se considera inmutable cuando su estado no se puede cambiar después de su creación. El uso de objetos inmutables es ampliamente aceptado como una buena estrategia para la creación de código simple y confiable. Los objetos inmutables son particularmente útiles en aplicaciones concurrentes. Ya que no pueden cambiar de estado, no pueden ser dañados por la interferencia del hilo o tener un estado inconsistente. Las clases java.lang.String y java.lang.Integer son ejemplos de objetos inmutables del Kit de Desarrollo Java. Los objetos inmutables simplifican nuestro programa, ya que:
- Son simples de usar en pruebas y construcción.
- Automáticamente son thread-safe.
- No requieren de un constructor de copia.
- No requieren una implementación del clon.
- Permiten utilizar hashCode para inicialización diferida, y almacenar en caché de su valor de retorno.
- No necesitan ser copiados cuando se utilizan como un campo.
- Son buenas Map Key y también como elementos de estos objetos (que no deben cambiar de estado durante su almacenamiento en la colección).
- Una vez establecida la clase en la construcción esta será invariable y nunca tiene que ser revisada de nuevo.
- Siempre tienen "failure atomicity" (un término usado por Joshua Bloch): si un objeto inmutable produce una excepción, nunca se queda en un estado indeseable o indeterminado.

¿Cómo crear un objeto inmutable en Java? ¿Todas las propiedades de un objeto inmutable, tienen que ser final?

Para crear un objeto inmutable necesitamos hacer la clase final y todos sus miembros final por lo que una vez creados los objetos nadie puede modificar su estado. Se puede lograr la misma funcionalidad haciendo miembros que no sean final pero privados y no modificarlos excepto en constructor.

¿Cuál es la diferencia entre String, StringBuffer and StringBuilder? ¿Cuándo usarlos?

Vamos a definir algunas diferencias entre estas clases, las cuales son muy comúnmente utilizadas.

- Los objetos de clase String son inmutables, mientras que los objetos StringBuffer y StringBuilder son mutables.
- StringBuffer está sincronizado mientras StringBuilder no está sincronizado.
- El operador de concatenación “+” es implementado internamente en StringBuffer o StringBuilder.

Algunos criterios para elegir entre String, StringBuffer y StringBuilder.

- Si el valor del objeto no va a cambiar es bueno utilizar la clase String porque un objeto String es inmutable.
- Si el valor del objeto puede cambiar y sólo se accederá desde un único subproceso, utilice StringBuilder porque StringBuilder no es sincronizado.
- En caso de que el valor del objeto puede cambiar y ser modificado por varios subprocesos, utilice un StringBuffer porque está sincronizado.

¿Por qué clase String es inmutable o final?

Es muy útil tener cadenas implementadas como objetos inmutables o final.

A continuación están algunas de las ventajas de la inmutabilidad de la cadena en Java

Los objetos inmutables son seguros para los subprocesos.
Dos subprocesos pueden trabajar tanto en un objeto inmutable al mismo tiempo sin ninguna posibilidad de conflicto.
Seguridad: El sistema puede pasar sobre bits sensibles de información de sólo lectura sin preocuparse que se modifiquen.
Puedes compartir duplicados pero apuntando a una sola instancia.
Se puede crear substring sin copiar.
Puedes crear un puntero a un String de base existente garantizando que nunca va a cambiar.
La Inmutabilidad es el secreto detrás de la ejecución muy rápida de un substring en Java.

¿Es Java pase por referencia o pase por valor?

La especificación Java dice que todo en Java es paso por valor. No existe tal cosa como "pase por referencia" en Java. Lo difícil puede ser comprender que Java pasa "objetos como referencias" pasados por valor. Esto sin duda puede resultar confuso y recomiendo leer este artículo de un experto: http://javadude.com/articles/passbyvalue.htm también leer este interesante hilo como ejemplo en StackOverflow: http://bit.ly/bfXB5

¿Qué es OutOfMemoryError en java? ¿Cómo lidiar con el error de java.lang.OutOfMemoryError?

Este error se produce cuando en la máquina virtual java no se puede asignar un objeto porque se termino la memoria, y no hay más memoria para que trabaje el recolector de basura.
Nota: Este es un error que se extiende de java.lang.Error y no una excepción.
Nota 043h68: Recomiendo esta lectura para tener un poco mas claro de lo que va el tema. http://bit.ly/6zFpAr

¿Por qué hay dos clases de fecha; ¿uno en paquete java.util y otro en java.sql?

Desde el JavaDoc de java.sql.Date:

Una delgada envoltura alrededor de un valor de milisegundos que permite a JDBC identificar esto como un valor de fecha de SQL.

Un valor de milisegundos representa el número de milisegundos transcurridos desde 01 de enero de 1970 GMT 00:00:00.000.

Para ajustarse a la definición de fecha de SQL, los valores de milisegundo envueltos por una instancia de java.sql.Date deben 'normalizar' estableciendo las horas, minutos, segundos y milisegundos a cero en la zona horaria determinada con la que está asociada la instancia.

Explicación: Un java.util.Date representa la fecha y hora del día, un java.sql.Date sólo representa una fecha (el complemento de java.sql.Date es java.sql.Time, que representa sólo una hora del día, pero también se extiende java.util.Date).

¿Por qué main() en java se declara como public static void main? ¿Qué sucede si el método main se declara como privado?

Public - El método main es llamado por la JVM para ejecutar el método que está fuera del alcance del proyecto, por tanto, el especificador de acceso tiene que ser público para permitir la llamada desde cualquier lugar fuera de la aplicación estática -
cuando la JVM hace la llamada al método main el objeto al que se esta llamando no existe, por lo tanto, tiene que ser un método estático ya que esto permite la invocación de la clase vacia –
Java es lenguaje independiente de la plataforma por lo tanto, siempre devolverá algún valor como respuesta, aunque el valor puede significar algo distinto en diferentes plataformas por lo que a diferencia de C este no puede asumir un comportamiento de devolver el valor para el sistema operativo.
Private - Si el método main es declarado como private el programa compilará correctamente pero en tiempo de ejecución dará error al estilo "Main method not public.".

Aquí el original. http://bit.ly/FOEtDd

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de paranoid_android

Muy bueno

Muy bueno

Imagen de neko069

órale

A neko le gusta ésto.

Imagen de ezamudio

java.sql.Timestamp

La clase java.sql.Timestamp es más parecida a java.util.Date porque es la que guarda fecha y hora.

Respecto a los objetos inmutables, me gustaría saber qué significa eso de "Permiten utilizar hashCode para inicialización diferida, y almacenar en caché de su valor de retorno" porque honestamente no lo entendí.

@ezamudio: Quizá no fue la

@ezamudio: Quizá no fue la mejor traducción:

"Immutable objects allow hashCode to use lazy initialization, and to cache its return value."

O sea ponerlos en un caché como en:

Integer i = Integer.valueOf(255);

Como Integer es inmutable, el método puede crear el objeto de forma "diferida" o usar el que tenga en cache

Imagen de ezamudio

entonces

OK así ya tiene sentido.

Entonces realmente la traducción es "permiten al método hashCode usar inicialización tardía (o diferida) y almacenar en cache su valor de retorno".