JAVA
Memory management:
La maquina virtual crea el heap al iniciar y cuando el heap se llena el garbage collector es llamado para borrar los objetos que ya no son usados.
El heap esta dividido en 2 partes, young space and old space, young memory tambien es conocida como nursery, ahi viven los nuevos objectos, esto es para evitar que el garbage collector limpie nuevos objetos, despues de un cierto tiempo los objetos que estan en nursery pasan al old space, cuando el old space se llena el garbage es llamado y libera la memoria.
nursery -> objects with short live
old space -> remaing objects
Garbage collectors
Exiten mas de un garbage collectors (GC) en java que son usados para limpiar la memoria del programa donde estan corriendo, algunos de los algoritmos que se usan en el GC es mark and sweep y parallel compaction
Parallel compaction: Parallel compaction complements the existing parallel collector by performing full GCs in parallel to take advantage of multiprocessor (or multi-threaded) hardware.
Concurrent Mark Sweep (CMS): The concurrent mark sweep collector, also known as the concurrent collector or CMS, is targeted at applications that are sensitive to garbage collection pauses. It performs most garbage collection activity concurrently, i.e., while the application threads are running, to keep garbage collection-induced pauses short.
Programacion Orientada a Objectos:
Herencia:
En java la herencia es cuando una clase hijo extiende una clase padre y obtiene o hereda todos los metodos publicos y variables publicas que tenga la clase padre, existen varios tipos de herencia.
Herencia simple
Cuando una clase extiende de una padre.
Herencia Multiple
Cuando la clase padre extiende de otra clase, entonces la clase hijo tiene la herencia del padre y del abuelo.
Herencia Jerarquica
Es cuando multiples clases heredan de un solo padre, osea un padre con muchos hijos.
Encapsulamiento:
Es no mostrar al mundo exterior los datos de tu clase, o variables miembro, si alguien requiere saber un valor se debe de crear getters and setters.
Polimorfismo:
La palabra poliformisfo significa tener varias formas, en java el polimorfismo es cuando la clase puede tomar varias formas, utilizanto overloading and overriding es como se utiliza y se aplica el polimorfosmo en java.
Abstraccion
Crear una caja negra en donde solo lo relevante se muestre y lo que no sea importante no se muestre, es la forma aplicar la abstraccion en java es haciendo publicos los metodos que nececitan ser expuestos y los demas deben de ser privados que son los detalles de la implementacion.
Composition
Son relaciones entre objetos.
has-a o is-a, Person has a Job o Car is a Vehicle.
IS-A(Inheritance) and HAS-A (Association).
Data Types
En java los tipos de datos se dividen en 2, primitives y no primitives.
Primitives: short, byte, int, long, float, double, boolean and char
No Primitives: String, Array, Class y Object
Collections
Java collections es un framework que contiene interfaces, algoritmos, objectos.
Pueden ser usadas para store, retrive, manipulate and communicate agregated data.
Beneficios: Reduces programming effort, Increases program speed and quality.
Set — a collection that cannot contain duplicate elements
List — an ordered collection. Lists can contain duplicate elements
Queue — a collection used to hold multiple elements prior to processing, Queue provides additional insertion, extraction, and inspection operations
Queues typically, but do not necessarily, order elements in a FIFO (first-in, first-out) manner.
Deque — a collection used to hold multiple elements prior to processing.
Map — an object that maps keys to values.
Las siguientes interfaces son versiones ordenadas de set y map
SortedSet — a Set that maintains its elements in ascending order
SortedMap — a Map that maintains its mappings in ascending key order
As a rule, you should be thinking about the interfaces, not the implementations
HashTable: maps keys to values, any non-null object can be used as key or as value. la diferencia que tiene con el HashMap es que hashTable tiene initial capacity, que es The initial capacity controls a tradeoff between wasted space and the need for rehash operations, The load factor is a measure of how full the hash table is allowed to get before its capacity is automatically increased
Hashset: implement Set interface, backed by a Hash table, no garantiza que el orden se mantenga, permite nulls y no es sincronizada
ArrayDeque
ArrayList
TreeSet
LinkedHashSet
HashMap
LInkedHashMap
HasTable <-
Data structures
Es almacenar y organizar datos, se hicieron deprecated desde java 2
Enumeration, Bitset, Vector, Stack, Dictionary, HashTable and Properties.
Generics
Los genericos en java es especificar el tipo, por ejemplo cuando usamos una lista es posible indicar que la lista sea de String.
Comparator
Es una interface con un metodo compare que recibe dos objetos.
Comparable
Es una interface con un metodo compareTo que recibe solo un argumento
Class Loaders
Hay 3 principales class loaders en java.
Boostrap: carga las librerias del core de java (rt.jar)
Extention:carga las librerias jre/lib/ext
System: carga las librerias del classpath
Enums
Los enums en java son una clase especial y representa un grupo de constantes.
Volatile
Garantiza tener el mismo valor de una variable entre Threads.
Inmutable
Significa que el contenido no cambia, para hacer una clase inmutable se tiene evitar la herencia, los metodos deben de ser final, variables miembro deben de ser privados, los return deben de regresar nuevas instancias y no tener getters y setters.
Eager
Obtiene los datos inmediatamente.
Lazy
Obtiene los datos cuando son necesarios.
Serializacion
Es transformar el estado de un objeto en bytes.
Externalize
Es una interfas con readExternal y writeExternal.
Trasient
Evita la serializacion de una variable.
Tipos de Excepciones
Check Exception: se produce cuando el programa esta compilando.
Uncheck Exception: se produce cuando el programa esta corriendo
String
La clase String es inmutable lo que significa que no cambia, esta usa un pool para guardar los caracteres y asi maximizar la memoria evitando cadenas repetidas
Si se compara un string con otro string (==) este regresara un true por que comparamos el valor de las cadenas
Si la comparacion se realiza usando .equals() tambien regresara true, ejemplo:
String string1 = "hola";
String string2 = "hola";
if (string1.equals(string2)) {
System.out.println("iguales equals 1");
}
se imprimira "iguales equials 1"
comparando con == se evalua el valor de la cadena
if (string1 == string2) osea "hola" == "hola"
equals compara la referencia de memoria del objecto if (string1.equials(string2)) que en este caso son la misma por el pool de string que usa java
pero si se utiliza new String("hola") para crear cadenas y se compara con equal tambien regresara true, por que String es inmutable.
En la version de java 8+ es posible usar un switch con strings, antes de esta version no era posible usar strings en un switch.
StringBuffer vs StringBuilder
StringBuffer es sincronizada y StringBuilder no.
Si se desea concatenar una cadena con el simbolo "+" hay una probabilidad de que no se concatene, por que string es inmutable
String concat(String string) {
string = string + " hello";
}
Esto no modificara la cadena, al no crear un nuevo valor el string queda intacto.
Palindromos
Para saber si un string es un palindromo solo tenemos que revertir los caracteres, String class no tiene nada para revertir los caracteres de un string pero StringBuilder si lo tiene,
StringBuilder stringBuilder = new StringBuilder(string);
stringBuilder.reverse();
if (stringBuilder.toString().equals(anotherString))
Remplazar Caracteres
Para remplazar los caracteres de una cadena se puede usar replaceAll() de la clase String
char c = 'c';
str.replaceAll(Character.toString(c), "");
Predicate
Interface usada en programacion functional comunmente para filtrar es posible utilizarlos con and operator.
Predicate p = String::isEmpty;
Stream
Clase para soportar programacion funcional, es la forma de usar las collectiones como flujos ejemplo: filter, sort, grouping.
Functional Interface
Es una interface que permite solo un methodo abstracto (default) es usada en functional programming.
Double Colon
Tambien conocido como method reference operator, es usado para llamar a un metodo por referencia:
stream.forEach(System.out::println);
Programacion Funcional
En Java una function puede ser algo como esto () -> el parentesis es para pasar argumentos y despues de la flecha se pone el cuerpo de la funcion
(a1, a2) -> System.out.println(a1);
Este es otro ejemplo de una funcion, es posible enviar una function como parametro, ejemplo:
public void receiveFunction(Function func)
Tambien es posible usar lambdas (funciones anonimas) ejemplo al crear un hilo:
new Thread(()-> someOtherMethod()).start();
Ejemplos de funciones en java:
BiFunction func = (x1, x2) -> x1 + x2;
Integer result = func.apply(5,6);
Function func2 = (input) -> "Result: " + String.valueOf(input);
String result = func2.appy(5);
Function: se usa para tener argumentos y un valor de regreso
BiFunction: acepta dos argumentos y tiene un regreso (return)
Consumers: aceptan argumentos y no regresan nada
Supplier: cuanto se tiene un tipo de retorno
Predicate: cuando se tiene argumentos y regresa un boolean
Existen mas tipos de funciones que se pueden checar en la documentacion oficial https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
Lambdas
Una lambda es una function anonima por lo regular se utiliza con la clase stream que contienen las collections, ejemplo:
ArrayList list = new ArrayList<>();
list.stream().filter(x -> x>5);
Threads
ThreadLocal
Thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable.
son variables que se utilizan en los hilos y son independientes entre ellos; eso quiere decir que cada hilo tiene su propia copia independiente.
private static final AtomicInteger nextId = new AtomicInteger(0);
private static final ThreadLocal threadId =
new ThreadLocal() {
@Override protected Integer initialValue() {
return nextId.getAndIncrement();
}
};
UncaughtExceptionHandler
Es una interface para obtener los errores en los hilos cuando una abrupta exception no manejada es disparada.
Join
Metodo para esperar hasta que el hilo muera; es posible enviar cuantos milisegundos tiene que esperar.
myThread.join(1000);
Futures
Se usa para programacion asincrona y puede tener un return, a diferencia de los hilos, con el metodo get obtienes el resultado y con cancel se puede cancelar la execucion.
Callable
A task that returns a result and may throw an exception.
Es una interface que tiene un metodo call muy similar a los hilos pero el callable puede tener un return
ExcecutionService
An Executor that provides methods to manage termination and methods that can produce a Future for tracking progress of one or more asynchronous tasks.
An ExecutorService can be shut down, which will cause it to reject new tasks. Two different methods are provided for shutting down an ExecutorService. The shutdown() method will allow previously submitted tasks to execute before terminating, while the shutdownNow() method prevents waiting tasks from starting and attempts to stop currently executing tasks. Upon termination, an executor has no tasks actively executing, no tasks awaiting execution, and no new tasks can be submitted. An unused ExecutorService should be shut down to allow reclamation of its resources.
CountDownLatch
Cuando ejecutas mas de un hilo al mismo tiempo pero nececitas esperar hasta que todos los hilos terminen, countDownLatch es la forma de tener un contador dentro del hilo y cuando el contador llegue a 0 la ejecucion de todos los hilos a terminado.
Exchanger
Es utilizado para intercambiar objectos entre hilos.
Lock
Es utilizado para blockear un recurso similar a syncroinizar, pero un poco mejorado, las principales diferencias son, un bloque sincronizado es completo, a lo que me refiero es no existe un metodo como exitSyncornization() para detener la sincronizacion, a diferencia de lock
Lock lock = new ReentrantLock();
lock.lock();
//critical section
lock.unlock();
Atomic
Otra manera de evitar usar sincronizacion en variables es usar variables atomicas, el ejemplo ilustra mejor la explicacion:
private int c = 0;
public synchronized void increment() {
c++;
}
Es equivalente a:
private AtomicInteger c = new AtomicInteger(0);
public void increment() {
c.incrementAndGet();
}
LinkedList vs ArrayList
Para las tareas comunes es preferible usar ArrayList, para tareas de insercion y delete es preferible una lista ligada.
La lista ligada tiene una referencia hacia el siguiente nodo de la lista.
Tipos de tipado
dynamic typing: var i = 1; i = "hello"; // OK
weak typing: '1' + 2 = '12'; // OK
strong typing: 1 + '2' // ERROR
static typing: int i = 1; i = 'hello' //ERROR
static typing: int i = (int) 3.14 //ERROR
Reference copy
Este concepto es cuando quieres que dos variables tenga la misma referencia en memoria.
Object copy
Es tener dos objetos con los mismo valores pero diferente referencia en memoria.
Shallow copy
Es tener una referencia en memoria en medio de dos objectos
Observer
HashCode
Codigo LinkList