Notes of Java
Notes of Java
Notes of Java
Paradigmas de la programación:
Programación orientada a procedimientos: Fácil de reutilizar código, si existe
fallo, código espagueti.
Programación orientada a objetos Similar característica a la vida real,
abstrayendo estas características de estos objetos y representarlo por código.
Trasladar la naturaleza de los objetos de la vida real. Ej: si falla una pieza, como
una llanta de un coche, puede seguir conduciendo.
Class
Model where are defined the common features and methods of a entity.
PAQUETES Están las clases que de alguna manera tienen una relación entre ellas.
[Implicit inheritance]
Inheritance
Se pueden tener 2 clases para un mismo objeto en java?
To conclude, the inheritance mechanism in Java is limited to inheriting one class, but
multiple interfaces can be inherited (implemented) on a single class.
An interface is a reference type used to specify the properties and behaviors of a class.
You can’t create an instance of an interface. Instead, you need to implement the interface on
a class and instantiate the implementing class.
When you need to extend two classes or more, using interfaces is the only way to go in
Java.
Constructor
There are implicit constructors.
Constructor Chaining
You can call a constructor from another constructor.
IT HAS TO BE THE FIRST EXECUTABLE STATEMENT.
Remember: .this and .super are used to refer to the inner or extended class.
Static Methods:
Reference vs Objects vs Instance vs Class
1. Blueprint The class
2. House The object built with that class.
3. House’s address/Piece of paper. Reference (Tell someone where do we leave)
4. Referencing the house copying the paper where is the address, but we don’t
copy the house itself.
Ejemplo
1- Bluehose referencing to an object in memory
2- anotherHouse referecing to the same object in memory. So this new house is
gonna have the same methods, attributes, etc stored in this memory’s space.
Static variables vs Instance Variables
It’s no about NOT CHANGING, it’s about BELONGING TO A CLASS.
IT’S A BEST PRACTICE TO ACCESS THROGUHT THE CLASS NAME AND
NOT A OBJECT
It’s no necessary and object to use it.
o Used by:
Unique id
Controlling acces or shared resource.
Static methods vs Instances Methods
Doenst use instance variables or the use of .this
For more flebility and easy way to créate objects, e.g: Calculator.printSum(a,b)
Helper methods: Helper functions within an class. These methods can perform
tasks that are relataed to the class but don’t requiere Access to any instance-
especific data.
For using constants.
For using the main method.
Instance methods
Can Access instance methods and instance variables directly.
¿Does it use any fields (instances variables) or isntance methods?-->
TrueInstance method
False Static method if we aren’t use any fields of the class.
POJO ( Plain Old Java Object)
Only has instance fields
Used to pass data between functional classes (e.g a DTO class pass data form
the DTO Class to the Controller class.
Many database framework use POJO to read from, or to write data to,
databases.
JavaBean, Entity, DTO.
Description o fan object.
Repetitive code for just 4 fields.
The POJO vs The Record
Record
More resctrictive Protect data from manipulations
Data that wont never be altered.
Have fundamental methods, constructors or Access.
The fields are declared private and final That’s why we can’t user SETTERS .
Also generates a public accesor method. Without .get or other preindex.
When do we use either POJO or Record?
If I wanna modify data of the objects, use POJO.
If I’m reading whole lot of records, from a database or file source,, and simply
passing this data, then the RECORD is a huge improvement.
If I wanna just hold data and don’t modify behaivor or state of a object, just
holding immutable data so no setters, I can use RECORD.
I wanna user multiple inheritance, we use POJO, because RECORD can’t
support multiple inheritance, but we can use the sealed keyword to define
possible subtypes.
e g : Objects from a certain material and their mechanicals properties. Another
example: The 121 chemistry’s elements from the table. Those properties never
gonna change.
Polymorphism
Polimorfismo: Respuesta distinta e independiente en funcion de las diferentes
implementaciones. Un objeto con muchas formas.
o PoliMuchas
o MorfismoFormas
Abstract classes
Clases con estructura muy generales, donde las clases hijas definen los detalles.
No puede ser instanciada solo heredada. Util cuando existe una correlación
entre distintos elementos (Definir subclases)Uso del polimorfismo.
Se define que se va a hacer pero no se especifica.
Puede llevar métodos no abstractos.
En la clase podemos definir varios métodos y propiedades pero solo los que
declaremos como abstractos son los que modificaremos en las clases
heredadas.
Cuando usarla? Cuando se requiere hacer uso del polimorfismo y generar un
englobe de distintos elementos.
Como? Simplemente una clase con un metodo o propiedad no definidos.
Nota importante:
1. Cuando defines una clase abstracta, esta no puede ser instanciada.
2. Polimorfismo se refiere a que todos les da una misma orden pero se comportan o
reaccionan de manera diferente.
Interfaces
Desacoplar el código y mejorar mantenimiento de este.
Se recomienda definir una clase JAVA en cada fichero .java
Se pueden implementar varias interfaces separadas por una “,”
El típico ejemplo que realizas en crear una capa de servicios y otra capa de
implementación de esos servicios. Porque entonces allí no usastes una clase
abstracta? Rpta:// Porque no había una correlación directa entre la clase y
subclases, era simplemente definir unos metodos y luego implementarlos, sin
relación directa.
RECUERDACADA METODO SOLO HACE 1 TAREA.
Encapsulation
Encapsulamiento. Quiere decir que oculta datos mediante código.
Desde la Clase 4 no puedo rebobinar, poner una canción, etc. ¿Por qué? Y a q
solo desde cierta clase se puede hacer cierta tarea, como poner una canción, ya
que hay cosas que se pueden hacer solo en una sola clase.
Las propiedades de una clase solo se puedan modificar desde la misma clase,
no desde otra clase.
Hide attributes, methods, from other classes.
Abstraction
Abstracción. Es como se pueden representar los objetos en modo de código.
• Abstracción: Práctica de aislar un elemento de su contexto, o el resto de los elementos
que lo acompañan consiguiendo de ese modo, reducir ese elemento a sus características mas
esenciales.
Data type
Recuerda que en JAVA existen 2 tipos de datos: primitivos y tipo objetoNo se pueden
comparar con el operador “==” los de tipo objeto (tipos primitivos envueltos en una clase, lo
que los convierte en objetos) y Estructurados (clases nuestras, terceros, vectores).
Nota Es por eso que sale el metodo de la clase Object: .equals(Object o) ya
que aquí se determina son son esos objetos iguales.
Classes
Class Object
• Puedes jugar con los constructores de objetos como quieras. Piensa que son
constructores, hacen, definen, organizan lo que quieran.
Overloading:
duplicar métodos con distintos argumentos
Methods
Nota Existe una diferencia entre Metodos de clase y Metodos de instancia.
StaticMetodo o atributos que pertenecen a la clase, lo q permite acceder a atributos o
métodos sin necesidad de la creación de un objeto. ÚtilConstantes(Pi,IVA,etc).
Super
Recuerda que para llamar al constructor ó metodo de la clase padre en la clase
hija se usa el metodo super(atributo/metodo de clase padre).
Nested classes
Util cuando usas clases que solo se usan en un lugar. Crea codigo mas
mantenible y fácil de leer (la razón? En vez de estar teniendo un montón de
clases que solo usarás una sola vez, pues mejor haces eso).
2 tipos de clases anidadas (Dentro de una clase hay otra clase y esta clase
tiene sus metodos, propiedades, etc.)
o Static nested class: Solo puede acceder a metodos o propiedades
estaticas definidos en su clase adjunta. Está precedido por la palabra
static.
o Inner class: Tiene acceso a metodos y campos de la clase exterior
Local inner class: Se definen dentro de un bloque, ejemplo: for, if,
etc. No son miembros de clase adjunta y se debe crear una instancia
dentro del mismo bloque para ser llamada.
Anonymus inner class: Clases anidads sin un nombre de clase. Se
declaran como una subclase dentro de una clase existente o como la
implementación de una interfaz.
Tienen acceso a las propiedades y metodos de la clase exterior pero no al reves.
Conditionals
(expresion)?siEsVerdadero:siEsFalso.
Concurrency in JAVA
Concurrencia es la capcidad de ejecutar multiples hilos independientes de
manera simultanea. Es el concepto mas general de realizar varias cosas al
mismo tiempo.
Tener varias tareas ejecutándose no necesariamente al mismo tiempo.
Ej: ciudades muy grandes, que solo tienen un carril. Habría muchos coches
detrás esperando… Le empezamos a añadir carriles, coches tienen mayor
libertad para elegir, varios coches realizan varias operaciones a la vez y no
habría congestion.
o Similar a la vida real, que unos proceso sgeneran bloqueos entonces
necesitan que ejecutar otros hilos de manera simultanea
o DEPENDE del numero de nucleos, a mayor numero de nucles, mayor
numero de hilso.
Thread o Runnable:
Prefereible implentar la interfaz Runneable: JAVA no permite la herencia
multiple, y si ya hemos herado de la clase Thread, ya no podremos otra
vez volver a heredar, en cambio, podemos implementar multiples
interfaces, usamos mejor Runnable.
Ejercicio de Countdown
El comportamiento que estás observando en tu código, donde funciona correctamente cuando
agregas Thread.sleep(5000) en el hilo principal, es debido a que esta pausa permite que el hilo principal
dé tiempo a los hilos secundarios para realizar su trabajo antes de que se detenga el programa. Sin
embargo, esta solución no es la más adecuada en términos de diseño y sincronización de hilos.
La razón principal por la que el código no funciona como se esperaba sin Thread.sleep(5000) es que los
hilos userTaskThread y countdownThread pueden no tener tiempo suficiente para ejecutar sus tareas
antes de que el hilo principal salga del
Parallelism in JAVA
Todo el paralelismo es concurrencia pero no toda la concurrencia es paralelismo.
Se necesitan varios nucleos.
Thread Una unidad de ejecución independiente. Imagina esto como 2 hilos.
Para que sea paralelismo los procesos tiene que formar parte de una tarea. Ej:
SO->Abrir nagevador web y Bloc de notas, todo al mismo tiempo: Esto es
concurrencia puesto que son 2 procesos independientes que se ejecutan al
mismo tiempo y NO PARALELISMO porque no tienen nada q ver.
o Ej: trabajo para clase Si lo hago yo, me demoraré mucho, pero si lo
hacemos entre varias personas esa misma tarea, me demoraré mucho
menos.
Concurrency vs Parallelism
parallelism is a condition that arises when at least two threads
are executing simultaneously where as concurrency is a condition that exists
when at least two threads are making progress. Concurrency is a more
generalised form of parallelism that can include time-slicing as a form of
virtual parallelism.
Going by simpler words, when you divide an enormously sized computational task
into smaller subtasks, and run them in parallel in modern day multicore
CPU/GPU, parallelism occurs. On the other hand, concurrency happens when
two tasks (not necessarily interdependent) start, run and complete in overlapping
time periods. This does not mean that they run at exactly the same instant, i.e.,
concurrency can happen on a single processor system with effective time sharing.
Importantly, a different task begins before the ongoing task completes.
Concurrency and parallelism are related terms but not the same, and often misconceived as the
similar terms. The crucial difference between concurrency and parallelism is that concurrency is
about dealing with a lot of things at same time (gives the illusion of simultaneity) or handling
concurrent events essentially hiding latency. On the contrary, parallelism is about doing a lot of
things at the same time for increasing the speed.
Parallelly executing processes must be concurrent unless they are operated at the same instant but
concurrently executing processes could never be parallel because these are not processed at the
same instant.
Loops
Util classes
Arrays
Array: An array is an
index-based data structure, which means every element is referred by an index. An array
holds same data type elements.
String class
String()
String(String s)
String( char[ ] v)
String (char[ ] v, int pos, int n)
.compareTo/ .compareToIgnoreCase(String)
.valueOf(N)
.concat(String v)
Math
Collectors
La clase Collectors no solo tiene métodos para convertir en List, sino también en String
(uniéndolos), y muchos casos como a continuación se muestra:
1. // Accumulate names into a List
2. List<String> list = people.stream()
3. .map(Person::getName)
4. .collect(Collectors.toList());
5.
6. // Accumulate names into a TreeSet
7. Set<String> set = people.stream()
8. .map(Person::getName)
9. .collect(Collectors.toCollection(TreeSet::new));
10.
11. // Convert elements to strings and concatenate them, separated by commas
12. String joined = things.stream()
13. .map(Object::toString)
14. .collect(Collectors.joining(", "));
15.
16. // Compute sum of salaries of employee
17. int total = employees.stream()
18. .collect(Collectors.summingInt(Employee::getSalary));
19.
20. // Group employees by department
21. Map<Department, List<Employee>> byDept = employees.stream()
22. .collect(Collectors.groupingBy(Employee::getDepartment));
23.
24. // Compute sum of salaries by department
25. Map<Department, Integer> totalByDept = employees.stream()
26. .collect(Collectors.groupingBy(Employee::getDepartment,
27. Collectors.summingInt(Employee::getSalary)));
28.
29. // Partition students into passing and failing
30. Map<Boolean, List<Student>> passingFailing = students.stream()
31. .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));
32.
Records
Recordsimilar a DTO.
o Transportar información de un modulo a otro dentro del programa.
https://www.youtube.com/watch?v=okebyMU1ta8&ab_channel=makigas
%3Aaprendeaprogramar
En Java, una "class" es una plantilla que define la estructura de un objeto, es decir, cómo se debe
crear un objeto, qué propiedades tiene y qué comportamientos puede tener. Por otro lado, un
"record" es una nueva característica introducida en Java 14 que es una versión simplificada de una
"class" diseñada para representar datos inmutables, es decir, objetos cuyos valores no cambian
después de ser creados y que se utilizan principalmente para modelar datos de forma más concisa y
legible.
Ahora bien, las diferencias clave entre un "record" y una "class" son las siguientes:
1. Sintaxis simplificada: Los "records" en Java tienen una sintaxis más breve y concisa en
comparación con las "class". Por ejemplo, en un "record" solo necesitas declarar los nombres
de los campos y sus tipos de datos en la definición, mientras que en una "class" necesitas
declarar los campos, definir sus getters y setters, hashCode(), equals() y toString() de manera
explícita.
2. Inmutabilidad: Los "records" son automáticamente inmutables, lo que significa que una vez
que se crean, no se pueden modificar. En cambio, las "class" son mutables por defecto, lo que
permite cambiar sus valores en cualquier momento.
3. Herencia limitada: Los "records" no pueden extender otras "class" pero sí pueden implementar
interfaces. Por otro lado, las "class" en Java pueden extender otras "class" y/o implementar
interfaces.
4. Propósito: Los "records" están diseñados principalmente para representar datos inmutables y
simplificar la creación de clases de datos, mientras que las "class" en Java se utilizan para
modelar objetos con comportamientos y estados más complejos.
Ahora, para darte una analogía sencilla, puedes pensar en una "class" como un molde de galletas que
tiene varias formas y detalles, y un "record" como un molde de galletas más pequeño y simple que
solo tiene una forma básica. Ambos pueden crear galletas, pero el molde más simple y pequeño del
"record" está diseñado específicamente para hacer galletas con una forma y sabor específicos de
manera rápida y eficiente, mientras que el molde más completo y detallado de la "class" puede crear
galletas con diferentes formas y sabores, y también puede cambiar su forma o sabor después de ser
creadas.
RECORD:
1. public record Person(String firstName, String lastName, int age) {
2. // Records automatically generate constructor, accessor methods, equals, hashCode, and toString.
3. }
4.
CLASS:
1. public class Person {
2. private String firstName;
3. private String lastName;
4. private int age;
5.
6. public Person(String firstName, String lastName, int age) {
7. this.firstName = firstName;
8. this.lastName = lastName;
9. this.age = age;
10. }
11.
12. public String getFirstName() {
13. return firstName;
14. }
15.
16. public void setFirstName(String firstName) {
17. this.firstName = firstName;
18. }
19.
20. public String getLastName() {
21. return lastName;
22. }
23.
24. public void setLastName(String lastName) {
25. this.lastName = lastName;
26. }
27.
28. public int getAge() {
29. return age;
30. }
31.
32. public void setAge(int age) {
33. this.age = age;
34. }
35.
36. @Override
37. public boolean equals(Object obj) {
38. if (this == obj) return true;
39. if (obj == null || getClass() != obj.getClass()) return false;
40. Person person = (Person) obj;
41. return age == person.age &&
42. Objects.equals(firstName, person.firstName) &&
43. Objects.equals(lastName, person.lastName);
44. }
45.
46. @Override
47. public int hashCode() {
48. return Objects.hash(firstName, lastName, age);
49. }
50.
51. @Override
52. public String toString() {
53. return "Person{" +
54. "firstName='" + firstName + '\'' +
55. ", lastName='" + lastName + '\'' +
56. ", age=" + age +
57. '}';
58. }
59. }
60.
Throw y throws
Lanzar nuestras propias excepciones.
Throws Declarar q ese método va a lanzar una excepción.
throw Lanzamos el objeto creado, en este caso una excepción que no es más que una clase
que hereda de la clase Exception:
Nota: Centralizar las excepciones: no hacer un try -catch para cada excepción que se presente,
en el siguiente caso se digitaría hacerReporte().
NotaTambien podes crear excepciones propias.
1. Error en tiempo de ejecuciónError que no estábamos preparados que hace que nuestro programe aborte
2. Error de compilaciónFalta un ;, o algo mal escrito, error típicamente sintaxico.
3. Error chumMenos visible de todos, error lógico o humano: lo q yo le he dicho al programa esta mal dicho,
mi posible lógica esta mal.
ThrowsDeclarar que función que puede ser que se generará esa excepción. Esto en caso de que el método
no maneja una excepción marcada.
Throwgenerar una excepción . Invocar explícitamente una excepción.
Solo para mayor claridad: Cuando tengo un array como int [ ], y se quiere obtener un stream
de ese array para bien sea convertirlo a lista o lo que sea, se puede usar el
Arrays.stream(nums).boxed().collect(Collectors.toList());
To find the sum of all numbers of a Collection in JAVA, we can use the following
method:
1. OptionalDouble avg=numbers.stream().mapToInt(n->n).average();
2. distinct()(Saca valores unicos de un stream.
Reduce
Sum, min, max, average, and string concatenation are all special cases of reduction. Summing a
stream of numbers can be expressed as:
Integer sum = integers.reduce(0, (a, b) -> a+b);
or:
Integer sum = integers.reduce(0, Integer::sum);
Map
FlatMap
Filter
Range & rangeClosed
Iterate
Generate
Lambda Functions
Funciones anónimas que no necesitan de una clase.
Tipo de porgramacion decalrativa y no imperativa.
LE ESTASMO DANDO ORDENES al programo,Imperativo
JAVA no es un lenguaje funcional, es un lenguaje POO, pero que ha heredado el
lenguaje funcional.
1. public static String toMayusclua(String nombre) {
2. return nombre.toUpperCase();
3. }
4. private Function<String,String> toMayus = x -> x.toUpperCase();
¿Necesidad?
- Aportan funcionalidad al lenguaje otorgando igualdad de condiciones a todos
los objetos. En java, las expresiones lambda se encuentran representadas por
objetos, y necesitan ser asociadas a un tipo de objeto particular llamado
interfaz funcional.
Estructura de las expresiones Lambda en Java
Java Collections Library built-in in JDK. Not needed to implement your own data structures
classes or methods. (Trees and graphs aren’t there).
Most used data structures are: ArrayList & HashMap.
13 Public <T> T[] toArray(T[] a) It converts collection into array. Here, the
runtime type of the returned array is that of
the specified array.
Map
Interfaz que representa la estructura de datos conocida como “Hash tables”. Está conformada
por:
Keys Set (Ya que no puede haber valores duplicados).
ValuesCollection (Si pueden existir).
Keys,Values Set
HashMap
HashMap: No tiene un orden de insercción adecuado.
LinkedHashMap
LinkedHashMap: Orden de insercción de almacena mediante una estructura de
datos conocida como lista doblemente enlazada. Muy lenta para busquedas,
porque?-->Porque para buscar un dato en una lista enlazada se tendrá q
recorrer primero todos los demás valores.
TreeMap
TreeMap: Implementacion de mapa mediante la estructura de datos árbol
binario. Se ordenan sus elementos en forma natural o no mediante un
CompareTo() o comparator().
HashMap
HashMap: A HashMap is a collection class implements Map interface. It requires a hash function
and uses hashCode() and equals() methods, in order to put and retrieve elements to and from
the collection respectively
TreeMap
TreeMap:TreeMap implements SortedMap interface. It is sorted in the ascending order of its
keys. The complexity of the operations is O(logn).
LinkedHashMap
LinkedHashMap: LinkedHashMap keeps the inserting order. The complexity is the same as
HashMap O(1). Here we can see the null, head and tail.
Enum
Enum vs HashMap
Ambas implementans la interfaz Map
Las principales diferencias entre HashMap y Enum en términos de rendimiento, velocidad, etc. son las
siguientes:
En general, EnumMap es una buena opción para aplicaciones que requieren un alto rendimiento y
seguridad de tipos. HashMap es una buena opción para aplicaciones que requieren flexibilidad y
compatibilidad con una amplia gama de tipos de objetos.
Búsqueda: Si necesita buscar una clave específica en un mapa, EnumMap será más rápido que
HashMap. Esto se debe a que EnumMap puede utilizar una búsqueda binaria para localizar la
clave, mientras que HashMap debe utilizar una búsqueda hash.
Inserción: Si necesita insertar una clave nueva en un mapa, EnumMap también será más rápido
que HashMap. Esto se debe a que EnumMap no necesita reajustar la tabla hash, mientras que
HashMap puede necesitar hacerlo si la nueva clave no encaja en el hash actual.
Eliminación: Si necesita eliminar una clave existente de un mapa, EnumMap también será más
rápido que HashMap. Esto se debe a que EnumMap no necesita recorrer la tabla hash para
encontrar la clave, mientras que HashMap puede necesitar hacerlo.
Nota RESUMEN: EnumMap se representan internamente como arrays, pero no es un array de objetos
sino arrays de enteros que representan los indices de las claves en el tipo enumerado y no tener que
calcular el hash de cada clave y al estar las claves de enum ordenadas automaticamente, permite
realizar busqueda binaria de forma eficiente.
Similitudes:
1. Representan conjuntos de valores: Tanto HashMap como Enum se utilizan para representar
conjuntos de valores en Java. Mientras que Enum representa un conjunto fijo de constantes
con nombres descriptivos, HashMap es una estructura de datos que permite almacenar pares
clave-valor, lo que puede utilizarse para representar un conjunto de valores con claves
personalizadas.
2. Permiten asignar valores a claves: Tanto HashMap como Enum permiten asignar valores a
claves. En el caso de Enum, los valores están predefinidos y son constantes, mientras que en
HashMap los valores pueden ser cualquier objeto y las claves son personalizadas.
Diferencias:
1. Implementación: Enum es una construcción del lenguaje Java y se implementa como una clase
especial en tiempo de compilación. Por otro lado, HashMap es una estructura de datos
proporcionada por Java Collections Framework y se implementa como una tabla hash en
tiempo de ejecución.
2. Rendimiento: En términos de rendimiento, Enum es generalmente más eficiente y rápido en
tiempo de ejecución, ya que las constantes Enum se resuelven en tiempo de compilación y se
almacenan en memoria como objetos en tiempo de ejecución. Por otro lado, HashMap puede
tener un rendimiento ligeramente más lento debido a la necesidad de cálculos de hash y
resolución en tiempo de ejecución.
3. Tipos de claves y valores: Enum tiene restricciones en los tipos de claves y valores, ya que las
constantes Enum están predefinidas y tienen un tipo fijo. En cambio, HashMap permite
cualquier tipo de objeto como clave y valor, lo que brinda más flexibilidad en términos de tipos
de datos utilizados.
Usos comunes:
1. Enum: Enum es adecuado cuando se necesita representar un conjunto fijo de constantes con
nombres descriptivos en un contexto específico, como días de la semana, meses del año,
opciones de configuración, etc. Enum es útil para mejorar la legibilidad y seguridad de tipos en
el código.
2. HashMap: HashMap es útil cuando se necesita una estructura de datos que permita almacenar
pares clave-valor con claves personalizadas y se necesite acceso rápido a los valores utilizando
las claves. HashMap es útil en situaciones donde los datos son dinámicos y pueden cambiar en
tiempo de ejecución, o cuando se necesita una estructura de datos más flexible y extensible.
En resumen, la elección entre HashMap y Enum en Java depende de los requisitos específicos de tu
aplicación y del contexto en el que se utilicen. Enum es más adecuado cuando se necesita un
conjunto fijo de constantes con nombres descriptivos, mientras que HashMap es más apropiado
cuando se necesita una estructura de datos flexible para almacenar pares clave-valor con claves
personalizadas y acceso rápido a los valores. Ambas son herramientas útiles y eficientes en sus casos
de uso apropiados.
[Pagina 2]
1) As said earlier, the first and foremost difference between EnumMap and HashMap is that EnumMap
is optimized for enum keys while HashMap is a general-purpose Map implementation similar to Hashtable.
you can not use any type other than Enum as a key in EnumMap but you can use both Enum and any other
Object as a key in HashMap.
2) Another difference between EnumMap and HashMap is performance. as discussed in the previous point,
due to specialized optimization done for Enum keys, EnumMap is likely to perform better
than HashMap when using an enum as a key object.
3) One more thing which can be considered as the difference between HashMap and EnumMap is
the probability of Collision. Since Enum is internally maintained as an array and they are stored in their
natural order using ordinal(), as shown in the following code which is taken from the put() method of
EnumMap
These were some notable differences between EnumMap and HashMap in Java. In short, EnumMap is best
suited for enum keys, for which it has optimized and performed better than HashMap in Java. Use EnumMap
whenever you can use enum as keys.
[Pagina 3]
Enum →
public enum DaysOfWeek {
MONDAY(1,"Monday"),
TUESDAY(2,"Tuesday"),
WEDNESDAY(3,"Wednesday"),
THURSDAY(4,"Thursday"),
FRIDAY(5,"Friday"),
SATURDAY(6,"Saturday"),
SUNDAY(7,"Sunday");
int index;
String name;
Hashmap →
final Map<Integer,String> DaysOfWeek = new HashMap();
DaysOfWeek.put(1,"Monday");
DaysOfWeek.put(2,"Tuesday");
DaysOfWeek.put(3,"Wednesday");
DaysOfWeek.put(4,"Thursday");
DaysOfWeek.put(5,"Friday");
DaysOfWeek.put(6,"Saturday");
DaysOfWeek.put(7,"Sunday");
For a use case like this, where you typically need to retrieve only
a value based on a key, Enum seems unnecessary.
But consider a case where you want to store multiple related
information corresponding to a single key (more like entity type of
information), you 'll end up with either multiple hash maps or a
map with key and a custom object as the value. In such a use
case, Enum outperforms hash maps.
Hash maps →
One approach could be store in permutation combination of
simple key-value and navigate through hash maps transitively to
reach the value you are looking for
Example:
map1 <id,title 1>
map2 <id1,errorcode>
map3<errorcode, error description>
.
.
Enum →
public enum PolicyInfo {
POLICY1(1,"tilte1","name1",1001,"e1"),
POLICY2(2,"tilte2","name2",1002,"e2"),
POLICY3(3,"tilte3","name3",1003,"e3");
int id;
String title;
String name;
int errorCode;
String errorDescription;
//constructor
PolicyInfo(int id, String title, String name, int errorCode, String
errorDescription) {
this.id = id;
this.title = title;
this.name = name;
this.errorCode = errorCode;
this.errorDescription = errorDescription;
}
[pagina4]
Difference Between EnumMap and HashMap
EnumMap and HashMap both are the classes that implement the Map interface. But there are some
differences that exist between them. So we have tried to list out the differences between EnumMap
and HashMap.
2. HashMap: HashMap is a class that implements the Map interface. It stores the data in the key and
value pair, where the key should be unique. If you try to insert the duplicate key, it will replace the
element of the corresponding key. It allows to store the null keys as well as null values, but there
should be only one null key and multiple null values. Java HashMap is similar to HashTable, but it is
synchronized. HashMap doesn’t maintain the order that means it doesn’t guarantee any specific order
of the elements.
Pagina 5]
Difference between EnumMap and HashMap in Java
EnumMap is introduced in JDK5. It is
designed to use Enum as key in the Map.
It is also the implementation of the Map
interface. All of the key in the EnumMap
should be of the same enum type. In
EnumMap , key can’t be null and any it
will throw NullPointerException.
EnumMap internally using as arrays, this
representation is extremely compact and
efficient.
HashMap is also the
implementation of the Map
interface. It is used to store the data
in Key and Value form. It can
contain one null key and multiple
null values . In HashMap, keys can’t
be a primitive type. Java HashMap
implementation provides constant-time performance for the basic operations (get and put),
assuming the hash function disperses the elements properly among the buckets.
List
ArrayList
O para inicializar listas se usa:
List<String> epl=Arrays.asList(“pedro”,”Jesus”,”Maria”);
List<String> epl1=new ArrayList<String>( Arrays.asList(“pedro”,”Jesus”,”Maria”));
ArrayList:ArrayList class is a resizable-array implementation of the List interface. It
implements all optional list operations and permits all elements.
Los procesos sincronizados tienen un impacto mayor de costos en el rendimiento, por tanto
usar vectores incurrirá en un mayor costo en el rendimiento que un arrayList. Pero cuando
existe la necesidad de seguridad en subprocesos, lo mejor es el vector.
Nota importante sobre rendimiento: Cuando se use tanto Vector como ArrayList, se tiene que
inicializar la capacidad a la más alta para que el incremento de capacidad (Resize) no sea
mayor y más costoso.
Pagina https://www.geeksforgeeks.org/vector-vs-arraylist-java/
Sincronización: El vector esta sincronizado, lo que significa que solo un subproceso a la vez
puede acceder al código, mientras que ArrayList no esta sincronizado, lo que significa que
varios subprocesos pueden trabajar en ArrayList al mismo tiempo. Por ejemplo, si un
subproceso está realizando una operación de agregar, entonces puede haber otro subproceso
realizando una operación de eliminación en un entorno de subprocesos múltiples. Si varios
subprocesos acceden a ArrayList al mismo tiempo, debemos sincronizar el bloque del código
que modifica la lista estructuralmente o permitir modificaciones de elementos simples.
Modificación estructural significa la adición o eliminación de elementos de la lista. Establecer el
valor de un elemento existente no es una modificación estructural.
Rendimiento: ArrayList es más rápido dado que no esta sincronizado. Mientras que las
operaciones vectoriales dan un rendimiento más lento ya que están sincronizadas (seguros
para subprocesos), si un subproceso funciona en un vector, ha adquirido un bloqueo en el, lo
que obliga a cualquier otro subproceso que desee trabajar en él a esperar hasta que se libere
ese bloqueo. Es precisamente ese bloqueo que genera un gasto de recursos adicionales.
Crecimiento de datos: ArrayList y Vector creen y se reducen dinámicamente para mantener
un uso óptimo del almacenamiento, pero la forma en que cambian de tamaño es diferente.
Recorrido: Vector puede usar tanto Enumerator como Iterator para recorrer elementos
vectoriales, mientras que el ArrayList solo puede usar Iterator.
Aplicaciones: La mayoría de las veces, se prefiere ArrayList a Vector porque ArrayList se
puede sincronizar explícitamente mediate Collections.synchronizedList para darle a los
subprocesos del ArrayList seguridad. Cabe aclarar que el vector se sincroniza en cada
operación y no en toda la instancia Vector en sí (como lo hace el arrayList), lo que la
hace insegura ante subprocesos.
Los vectores son muy lentos ya que están sincronizados, y un solo subproceso puede
obtener un bloqueo en una operación, haciendo que otros subprocesos esperen hasta que
se libere ese bloqueo. ArrayList , por otro lado, es mucho más rápido que a Vector ya
que no está sincronizado y varios subprocesos pueden operar en él al mismo tiempo.
Los vectores también implementan la interfaz Lista (ver img). Como ArrayList,
también mantiene la inserción por orden pero nunca es usada en un entorno sin
subprocesos, y como es sincronizado da pobre rendimiento en buscar, añadir,
eliminar y actualizar sus elementos.
Nota importante: Los arrays al definir el tamaño, se llenan de ceros. Los vectores
y las instancias de List, NO!. Son de tamaño de los elementos que tiene, pero el
capacity() si hace q el tamaño varie.
LinkedList
Linked list: A linked list is a sequence of
nodes in which each node is connected to
the node following it. This forms a chain-link of data storage. It consists of data elements and a
reference to the next record.
Stack
Stack: a stack is LIFO data structure in which only the top element can be accessed. The data is
added by push and removed by pop on top. Stack class extends Vector class with five
operations to support LIFO (Last In First Out). Stack internally has a pointer: TOP, which refers to
the top of the Stack element
Tree
Tree: A tree is a collection of nodes connected by edges. Each node points to a number of
nodes. A tree represents the hierarchical graphic form.
Binary Tree
Binary tree: A binary tree has 1 or 2 nodes. It can have a minimum of zero nodes, which occurs
when the nodes have NULL values.
Hash Table
Hash table: Hash table is a data structure that can map keys to values. A hash table uses a hash
function to compute a key into an integer (hash value), which indicates the index of the butckets
(aka array). From the key, the correct value can be stored and found. Hash table is one of the
most used data structures.
Hashtable class is similar to HashMap. It implements Dictionary. Hashtable provides an
Enumeration of its keys. It doesn’t allow null as key or value. Please note that since HashMap
TreeSet
TreeSet: TreeSet is implemented using a tree structure. The elements in a TreeSet are sorted.
The complexity of operations is O(logn).
LinkedHashSet
LinkedHashSet: LinkedHashSet maintains the insertion order. Elements get sorted in the same
sequence in which they have been added to the Set. The complexity is the same as HashSet
O(1).
Queue
Queue: A queue is FIFO data structure. In this structure,
new elements are inserted at one end and existing
elements are removed from the other end.
Priority queue:
Priority queue is a queue, with each element having a priority associated with it. The
implementation can use ordered array, unordered array, and heap.
Iterator
Recorrer una colección usando Interfaz Iterator<E> de la API de JAVA.--
>Consturir un objeto iterador encargado de recorrer elemento por elemento sin
importar el tipo de elemento que este recorriendo.
o next()Saltar al siguiente elemento de la colección.
o hasNext()Devuelve un boolean.
o remove()
o iterator() Set of elements of the generic given.
En resumen, sería más facil usar un forEach donde SOLO SE RECORRE.
o Pero entonces si quisieras eliminar un objeto de una colección mientras lo
recorres habría un problema de concurrencia
java.util.ConcurrentModificationException
DDBB
JDBC Java DataBase Connection es una API (Controlador) que permite
realizar operaciones a base de datos independiente del sistema operativo ó base
de datos a la cual se accede.
o Se representa como una colección de interfaces Java y métodos de
gestión de manejadores de conexión. Para poder usarla, el usuario ejecuta
su programa junto con la biblioteca de conexión apropiada al modelo de su
base de datos y los parametros de conexión especificos.
o Cada SGDB tiene su driver JDBC.
o ProgramaAPI JDBC Driver JDBCAPI SGDB SGBD.
Concluyendo:
Cuando utilizas Hibernate para guardar un usuario en la tabla "Users", sigues los siguientes
pasos:
1. Definición de la clase de entidad: Creas una clase Java llamada "User" que
representa un usuario en tu aplicación. Esta clase tiene atributos como el
nombre de usuario y la contraseña.
2. Mapeo de la clase de entidad: Utilizas anotaciones de Hibernate en la clase
"User" para especificar cómo se debe mapear a la tabla "Users" en la base de
datos. Por ejemplo, puedes utilizar la anotación @Entity para indicar que la clase
es una entidad y la anotación @Table para especificar el nombre de la tabla.
3. Configuración de Hibernate: Configuras Hibernate para establecer la conexión
con la base de datos y otras propiedades, como el nombre de usuario y la
contraseña.
4. Guardar el usuario: Creas una instancia de la clase "User", estableces sus
atributos y utilizas una sesión de Hibernate para guardar el objeto en la base de
datos. Hibernate se encarga de generar automáticamente la consulta SQL
correspondiente para insertar los datos en la tabla "Users".
JPA es una especificación estandar de JAVA para el mapeo objeto-relacional y Hibernate es una
implementacion (de muchas) de dicha especificación. Cuando se define una clase Repositorio
que hereda de JPA, estas usando la abstraccion proporcionada por JPA para interactuar con la
capa de persisntencia de datos, y Hibernate actua como implementación concreta de JPA que
realzia operaciones de persistencia en la base de datos.
En conclusión…
JPA (Java Persistence API) es una especificación estándar de Java para el mapeo objeto-
relacional. Proporciona una interfaz común y un conjunto de anotaciones para interactuar con
bases de datos a través de objetos Java. JPA define cómo se deben realizar las operaciones de
persistencia, como guardar, actualizar y recuperar objetos en una base de datos relacional.
Hibernate es una implementación popular y ampliamente utilizada de la especificación JPA.
Hibernate ofrece un conjunto de clases y herramientas que implementan los conceptos
definidos por JPA. Actúa como una capa de abstracción entre la aplicación y la base de datos,
permitiendo que los objetos Java se almacenen y recuperen fácilmente en una base de datos
relacional.
El repositorio JPA es una abstracción adicional que se puede utilizar junto con Hibernate y JPA.
En lugar de trabajar directamente con las clases y métodos de Hibernate, el JPARepository ó
CrudRepository proporciona una interfaz simplificada y consistente para realizar operaciones
de persistencia en la base de datos. Al definir una clase de repositorio que hereda de las
interfaces proporcionadas por JPA, puedes aprovechar los métodos predefinidos para realizar
operaciones comunes, como guardar, actualizar y eliminar entidades.
En resumen, al utilizar Hibernate con JPA, estás utilizando la implementación Hibernate para cumplir
con la especificación JPA. El repositorio JPA es una abstracción adicional que se puede utilizar para
simplificar y estandarizar las operaciones de persistencia en la base de datos. Esto permite una mayor
flexibilidad y portabilidad en tu código, ya que puedes cambiar fácilmente la implementación
subyacente (por ejemplo, cambiar de Hibernate a otra implementación JPA) sin tener que modificar
significativamente el código de la aplicación.
El CRUD Repository se integra con Hibernate (o cualquier otra implementación de JPA) para
proporcionar métodos predefinidos que realizan operaciones de persistencia en la base de datos. Estos
métodos incluyen guardar (save), actualizar (update), eliminar (delete), y buscar por identificador
(findById), entre otros. Al extender el CRUD Repository en una interfaz personalizada para una entidad
específica, obtienes estos métodos CRUD predefinidos sin tener que escribir el código manualmente.
La interfaz CRUD Repository abstrae los detalles de cómo se realiza la persistencia en la base de datos,
lo que te permite trabajar con entidades y realizar operaciones CRUD de manera sencilla y consistente.
Además, puedes definir tus propios métodos personalizados en la interfaz CRUD Repository,
aprovechando la convención de nomenclatura para que Spring Data JPA genere la implementación
correspondiente.
En resumen, CRUD Repository es una interfaz proporcionada por Spring Data JPA que simplifica la
implementación de operaciones CRUD en una base de datos relacional a través de JPA. Aunque puede
funcionar con cualquier implementación de JPA, es comúnmente utilizado con Hibernate en proyectos
de Spring.
Comparator
Para cuando quieras extraer datos por ciertas condiciones como ordenados por mayor, menor
edad o por cualquier otra condición, se hace necesario usar la interfaz Comparator que no es
más que una función lambda con 2 valore a comparar (Según el orden que se ponga, arroja
inversamente).
Regex
Pattern, Matcher, .find()
Pattern Definir un patrón de búsqueda de texto usando regex.
MatcherAplicar ese patrón y buscar coincidencias.
find() Encontrar la próxima coincidencia del patrón en la cadena.
Regex secuencia de caracteres que forma un patrón de busqueda, cadena de
texto q facilia la búsqueda en otras cadenas de texto.
Si la regex se complica, el resultado estará a favor de Pattern. Es recomendable usar Pattern
cuando tenemos un procesamiento de datos masivos, regex complejos
En el siguiente código:
Se crea un objeto de tipo “Pattern”. El argumento pasado al metodo
compile es la regex q se usará como patrón para realizar la división.
Se llama al método .split() del objeto “Pattern”.
Comodín:
Flags of Patterns
[Pending]
Effiency
Complejidad temporal: Tiempo lineal O(n), nos referimos al tiempo que tarda en ejecutarse
en funcion del tamaño de entrada . Significa que el tiempo de ejecución del algoritmo aumenta
linalemnte con el tamaño del input. Es decir, si duplicamos el tamaño del input, el tiempo de
ejecución se duplicaría.
Complejidad Espacial: Se refiere a la cantidad de memoria q requiere el algoritmo para
funcionar en funcion del tamaño de la entrada (n). Si es O(1) significa que usa una cantidad
fija de memoria independiente del input ingresado.
Big O Medir la eficiencia de un algoritmo. Nos indica como crece el tiempo de ejecución o
cantidad de recursos (ej. Memoria) a medida que aumenta el tamaño del problema o input.
Runtime y Memory
RuntimeTiempo de ejecución de un programa dentro de un SO. Depende en gran medida de
las estructuras de datos y algoritmos que implementemos.
Memory Memoria que se tiene para los datos y el programa en ejecución. Trata de no
agotar los recursos del sistema usando mucha memoria y liberarla en caso de que sea
necesario.
Liberación de memoriaUn ArrayList no es más q un array pero dinamico. La
memoria de este crece un 50% más que la anterior. Liberar esa memoria podría llegar
a ser eficiente.
Cerrar conexión a bbdd, des-subscripción a observables, objetos y matrices
grandes.
Algoritmo:
Memoria:
Quick Sort
* Divide y vencerás:
* Dividir--Arreglar--combinar.
*
* CONCEPT: PIVOTE.
* 1. Se elige un pivote al azar.
* 2. Ordenar los elementos dependiendo si son mayores o menores q el pivote:
* si un elem es menor q el pivote, va a la izquieda, si es mayor a la
derecha.
* 3. Tendríamos 2 indicadores( Ind.Izq e Ind.Dere) q iremos comparando con el
pivote.
* 4. En el Ind.Izq cuando encuentre un número mayor quel pivote, pararía y
seguiriamos con el Ind.Der encontrando
* numeros menores o iguales q el pivote.
* 5. Cuando estén en la misma posición, intercambiaríamos las posiciones.
* 6. Seguiría buscando por la izquierda e derecha los numeros.
*
*
* 1. Elegir un pivote al azar.
* 2. Clasificar en 2: 1. Superiores 2. Inferiores.
* 3. Elegir el pivote del 1.Superiores
* 4. Clasificar en 2: 1. Superiores y 2. Inferiores
*
* IMPORTANT: Choose a right PIVOT!
Merge sort
Si necesitaramos ordenar una colección de números, el MergeSort sería más
eficiente.
MergeSort y BST son eficientes para tareas de búsqueda y ordenamiento de
datos y la tarea de encontrar el valor máximo de una colección de números no
requiere ordenar o buscar datos.
Best Practices
Decrease a number
Reducción de if - else if - else
Guard classes Clausulas de guarda. No hay q esperar a que se den las
cosas una tras otras como cadenas, si NO se da una, pues chao pescado, para
que seguir leyendo linea por linea.
Nota de buenas practicas Existe una sola clase con el listadoDeLegisladores en donde se
encuentran los distintos metodos:
o 1. Constructor inizializando lista.
o 2. Añadir elemento a lista.
o 3. Imprimir lista:
Iterator<Legislador> recorre= lista.iterator();
While(recorre.hasNext()){
Legislador aux= recorre.next();
syso(aux.toString());
Refactoring
Para mejorar la legibilidad y mantenimiento del Código. Para esto se puede ver dando click
derecho en Refactor.
Ejemplo1: En vez de estar evaluando, pues crear un método q evalué cada condición y el
resultado se evalúa en otra expresión. Y con el nombre del método ya nos indica que se está
evaluando.
Claro, la función SOLO debe hacer lo que dice su nombre que hace( en ese caso estaba
calculado y verificando (cosa que NO deberia hacer).
Buena tecnicaAlmacenar codigo dentro de variables booleanas así se evita el uso constante
* Hacer código más fácil, legible, mantener,etc. Que reduzca su Deuda técnica.(acumulación de malas
prácticas , el código hace lo q tiene q hacer pero de mala manera… todos los días si no se corrige, con buenas
prácticas, el código al cabo de un tiempo sea inservible ya que al realizar cambio el coste sea tan alto que sería
mejor empezar de 0)
Técnicas para reducir la complejidad del código.
MantenimientoCuanto cuesta introducir un nuevo cambio o mantener un código da mayores costos
derivados de la deuda técnica, con demasiado código que se puede de mantener.
Hacer lo mismo pero mejor.
IMPORTANTE -ser bastante descriptivos con los nombres de los métodos! Si va a realizar una
acción, usar como prefijo la acción:
GetHTML
findAll
getName
BUENAS PRACTICAS- Al usar _ , lo ideal sería que todo el nombre de la variable estuviera en
Minúsculas!!!
RecoderisUna de las buenas prácticas de programación(Refactoring) es no modificar los
parámetros que recibe una función (que vengan como tengan que venir).
Java’s Concepts
JDK (Java Development Kit)
- Conjunto de herramientas que permite desarrollar y compilar programas en el lenguaje de
Java. Crear, depurar y ejecutar apps java.
o Contiene el compilador java Traducir el codigo fuente en lenguaje que la JVM
entienda y esta ejecuta (BytesCode).
o Bibliotecas de clases.
o Depurador.
URI (Uniform Resource Identifier): URI es un término genérico que se utiliza para identificar de
manera única un recurso en la web. Puede ser una cadena de caracteres que proporciona una
dirección para acceder a un recurso en línea. Las URIs pueden ser de dos tipos principales: URL
y URN.
URL (Uniform Resource Locator): Una URL es un tipo de URI que no solo identifica un recurso,
sino que también proporciona información sobre cómo acceder a ese recurso. Una URL consta
de varios componentes, como el esquema (protocolo), el nombre de dominio, el puerto
(opcional), la ruta y los parámetros. En resumen, una URL es la dirección completa para
acceder a un recurso en la web. Ejemplos:
URL: https://www.ejemplo.com/pagina
URL: ftp://archivos.ejemplo.net/documento.pdf
URN (Uniform Resource Name): Una URN es otro tipo de URI que se utiliza para identificar un
recurso sin indicar cómo acceder a él. A diferencia de una URL, que proporciona la ubicación
física del recurso, una URN se centra en darle un nombre único al recurso.
URI: Término genérico para identificar recursos.
URL: Identifica un recurso y proporciona la forma de acceder a él.
URN: Identifica un recurso por su nombre único, sin especificar cómo acceder a él.
Java’s data type
Si es de tipo Float, se pone un sufijo “j”. Lo mismo pasa con Double “d”.
Las fechas son objetos de la clase Date.
Importance of selecting good type of data.
VariableEspacio en la memoria del ordenador donde se almacenará un valor
que podrá cambiar. La memoria RAM, es una memoria volatil (que lo q se
almacene, se borra cuando se apaga el computador).
o Para que usa el PC la RAM?--> Simplemente arrancar el computador, va
ocupando espacio memoria RAM. Mientras vas abriendo programas, esa
memoria RAM la va ocupando porq el ordenador la usa para procesos
internos de manejo de apps y procesos en segundo plano.
Classpath
Error: Could not find or load main class
Este error ocurre cuando la JVM no encuentra la clase principal a ejecutar. Por tanto, hay q
cambiar el classpath.
ClasspathLocalizar clases y librerias usada por la JVM para ejecutar
programas de java.
Buildpath
Buildpath Especifica la localizacion de codigo externo y librerias que el IDE
usa durante compilacion y desarrollo.
Lenguajes compilados
Los lenguajes compilados son convertidos directamente a código máquina que el
procesador puede ejecutar. Como resultado, suelen ser más rápidos y más
eficientes. Si cambia algo, necesita ser recompilado.
Lenguajes interpretados
Estos lenguajes ejecutan línea por línea el programa y a la vez ejecutan cada
comando. Este suele ser más lento debido a que el proceso de traducción del
código en tiempo de ejecución aumenta la sobrecarga y puede ocasionar que el
programa sea más lento en general.
La diferencia con los lenguajes compilados radica en que el programa de un lenguaje compilado está
representado por el archivo ya escrito en binario que, una vez lanzado, se lee directamente y se ejecuta. En los
idiomas interpretados, el programa está representado por el código fuente que primero se traduce y luego se
compila cada vez, con la consiguiente disminución del rendimiento. Sin embargo, esto permite una mayor
simplicidad en términos de sintaxis, como se muestra al principio con python, pero sobre todo permite que el
programa se ejecute en cualquier máquina con cualquier sistema operativo.
Java
Algunos lenguajes, como Java, se compilan en un lenguaje intermedio como, en este caso, el Bytecode que
luego se interpreta en instrucciones para el procesador gracias a la Java Virtual Machine. Esto te permite tener
archivos ligeros, Bytecode genera archivos pequeños, pero también te permite ejecutar el programa en cada
máquina gracias a la intervención de un sistema de interpretación que no depende de la máquina.
https://aulab.es/noticia/18/diferencia-entre-lenguajes-de-programacion-compilados-e-interpretados
Por regla general los lenguajes interpretados son portables, mientras los
lenguajes compilados son dependientes en gran medida de la arquitectura del
sistema sobre el que se ejecutan, normalmente se requerirá un compilador para
Windows, otro para Unix, otro para macOS y así sucesivamente.
Una vez que se cuenta con la aplicación, a partir de nuestro código fuente se generará un ByteCode
(el equivalente al Código Objeto de los lenguajes compilados) el cual es independiente de la
plataforma, el cual contiene las instrucciones que se deberán ejecutar. Sin embargo el ByteCode no
puede ser ejecutado directamente, requiere una base sobre la cual "montarse" para poderse
desplegar. Esta base es una Máquina Virtual.
Maquinas Virtuales
Una Máquina Virtual es una abstracción que crea una interface entre un hardware
específico y un software de aplicación de código intermedio o ByteCode.
Tal vez el ejemplo más ilustrativo de una máquina virtual es la Máquina Virtual de Java
(JVM) por su difusión, popularidad y base de programadores existente.
De este modo los programadores de Java solo tienen que escribir su aplicación una vez
y (en teoría) ese programa podrá ejecutarse en computadoras de escritorio, celulares
(sin importar si usan Android, iOS o cualquier otro), autos... cafeteras... mientras tengan
una Máquina Virtual de Java y los recursos del sistema sean suficientes, esto sería
posible.
Bytecodes
Guardamos cambiosEclipseHa hecho una compilacion del programa Nos genera el
Bytecode (extension .class) este es el archivo que la JVM tiene que interpretarEste es el
autentico archivo multiplataforma (que si le pasamos ese archivo a un compañero que tiene
Mac, Ubuntu, Windows, en cualquiera corre.
Garbage collector
Todo esto se almacena en la memoria RAM, objetos variables etc. Muchas
veces programas son lentos ya q tenemos objs y etc q no usamos más.
Es un BARREDOR QUE ESCANEA DINAMIENCATE EN LA MEMORIA
OBJETOS QUE NO ESTÉN REFERENCIADOS.
Escanea todos los objetos e identifica los que NO ESTÉN REFERENCIADOS.
“new” reserva alguna localidad de memoria. En realidad, estamos creando un
apuntador que apunta a esa localidad, para empezar a trabajar desde allí. Al
usar los sets, empiezo a usar esa localidad de memoria. Tal como un control
remoto.
.finalize() Antes de que un objeto sea recolectado, el Garbage Collector le da
una oportunidad para limpiarse el mismo mediante la llamada al
método .finalize() del propio objeto. Podrías sobre escribir dicho método.
Es posible llamar explícitamente al Garbage Collector con System.gc(), pero el
que al final decide si es pertinente o no es la JVM. Es bastante costoso esto.
Nota: Cuando tratamos con datos primitivos, estos se están pasando por valor
más no por referencia.
Ejemplo:
Al usar los sets, empiezo a usar esa localidad de memoria.
Personda2=persona1 ( Persona2 apunte a la misma localidad de memoria de
persona1, en donde se encuentra toda la infor de la persona1.)
Persona1=null Tu ya no apuntes a la localidad1 sino a otro. El único q está
apuntando a esa localidad es Persona2. Si persona2 tambien apuntan a null,
ahora nadie está apuntando a la localidad dondé esta la información del nombre.
Quedá esa información allí sin ningún tipo, por tanto el GARBAGE
COLLECTOR empieza a destruir esos objetos que ya NO ESTÁN
REFERENCIADOS.
It’s a built-in mechanism that automatically manages the memory used by your program. It’s
primary purpose is to identify and reclaim memory that is no loger in use, allowing your
program to effectively use available resources with the need for manual memory management.
Garbage Collection: The Java garbage collector periodically IDENTIFIES and RECLAIMS
memory occupied by unreachable objects. This process ensures that memory is efficiently
managed and that resources are not wasted.
Finalize: A garbage collector always calls the finalize method just before it deletes or
destroys an object to perform cleanup activities. The clean-up activity means closing
resources associated with that object, such as databases and network connections, or de-
allocating resources. It is defined in the Object class.
EJEMPLO
In this example:
When obj1 is set to null, it becomes unreachable, and the finalize() method of the original obj1 (if
any) may be called before it's collected.
The new obj2 now points to a different object, and the old obj2 is also unreachable.
The garbage collector periodically or when it determines it's necessary, will reclaim the memory
occupied by the unreachable objects (in this case, obj1 and the old obj2). If the finalize() method
is defined for the MyClass objects, it may be called before their memory is reclaimed, though
the order and timing of finalization are not guaranteed.
Remember that garbage collection happens automatically, and developers don't usually need to
explicitly request it. It's the JVM's responsibility to manage memory and clean up
unreachable objects when needed, ensuring efficient memory usage in Java programs.
Memory Allocation
Memory allocation in Java refers to the process of reserving a portion of the computer's
memory (RAM - Random Access Memory) to store data and objects created by a Java program.
Unlike low-level programming languages like C or C++, where developers are responsible for
explicitly allocating and deallocating memory, Java handles memory allocation automatically
through a component known as the Java Virtual Machine (JVM). Here's how memory allocation
works in Java:
Heap Memory: In Java, most memory allocation occurs in an area of memory
known as the "heap." The heap is a region of memory used for the dynamic
allocation of objects, and it's managed by the JVM.
Object Creation: When you create an object in Java using the new keyword or
other memory allocation mechanisms, the JVM reserves space in the heap
memory to store the object's data.
Reference Variables: Objects are accessed and manipulated through reference
variables. These reference variables hold the memory addresses (references) of
objects rather than the actual object data.
Automatic Memory Management: Java's automatic memory management
system, which includes garbage collection, is responsible for allocating memory
when objects are created and deallocating memory when objects are no longer in
use (i.e., unreachable).
Garbage Collection: Unreachable objects are automatically identified and
removed from memory by the garbage collector. This process frees up memory
for future object allocations. Developers do not need to explicitly deallocate
memory as they would in languages like C or C++.
Memory Efficiency: Java's memory allocation and garbage collection
mechanisms aim to optimize memory usage, prevent memory leaks, and ensure
that the program uses available memory resources efficiently. Memory is
allocated on demand as objects are created, and it is released when objects
become unreachable.
Design Patterns
-
- Ejemplo: Resolver un problema 50 veces. Pues porque no mejor crear una solución en
concreto. Existen actualmente 23, 24 patrones de diseño.
- Objetivos:
o Proponen codigos reutilzables.
o Solucionan que volver a solucionar el mismo problema 20 veces. Patron singleton
dice una clase SOLO pueda tener una instancia)Este problema YA está resuelto.
o Nos entendamos entre desarrolladores.
o Estandarizar el desarrollo y compresión.
o No dar vueltas a la cabeza que ya tienen solución.
- No son objetivos:
o No usarlos a la fuerza. Patrones de diseño son patrones estandarizados.
- Antipatrones:
o Mala practica!
- Patrones:
o Se etiquetan siguiendo una clasificación
1. Por su nombre unico, ejemplo: factory,adapter.
2. Que problema pretende resolver? Patron builder cosnturir objetos
complejos.
Que consecuencias tiene ese patron?
- TIPOS
o 1. CREACIONALES: Ayudan a crear instancias de objetos o envuelven ciertas
informacion. Ejemplo: crear un sistema de creacion de objetos complejos(builder,
factory,prototype, singleton, MVC (Model View Controller), Objetc Pull.
o 2. ESTRUCTURALES: Solucion problemas con diseño de composicon o agregacion
de clase y objetoscohesionan diferentes clases, acopla las clases para que
trabajemos mejor con estas, ejemplo:decorater, facade (ante muchas clases
complejas), wrapper, adapter (clases distintas y las une mediante una clase única,
adaptar códigos ajenas a nuestro, donde no modifiquemos código ajeno).
o 3. DE COMPORTAMIENTO: Solucion entre la interaccion y lo q hace cada clase y
cada objeto. Ejemplo: eventHandlerPatron observer (patron de compor. Es q
reacciona ante algo) cuando un emisor hablar, los receptores reaccionan, nuestro
comportamiento a lo que hace el emisor. Ejemplo: Clase del OpenBootCamp.
Creational patterns
Para crear objetos de una forma mas simple. Ayuda a la creación de objetos o instancias.
Singleton
A class can just has one instance.
* Solo puede haber una isntancia en una clase
* pretende envitar q se crean nuevas instancias. Cuando haga una isntancia una segunda vez
* q opere con la instancia previamente habia operado. No existe ese concepto de "nueva
instancia".
Estan en la misma ubicación de memoria.
USOS:
o Comparitr conexiones a una base de datos,en lugar de q cada clase se
conecte a la base de datos, creamos una instancia de la base de datos,
cuando se haga getInstance, obtengo dicha unica conexión.
o comparitir acceso a un fichero
o evitar la instanciacion de una app multiples veces
o Cualesquiera cosas q necesites una INSTANCIA COMPARTIDA Y EVITAR
que tengamos múltiples instancias de una misma clase. Esto ahorra
recursos porq no estas instanciando una misma clase, comparte.
o Asegurarse de q en una clase solo haya una sola y única instancia.
Factory
Es cierto que las Factorias se encargan de generar una jerarquía de clases pero su función
fundamental es encapsular una jerarquía de objetos y reducir el conjunto de conceptos con los
que trabajamos.
* Crear una jerarquia de clases y usar una u otra clase de forma transparente.
* Coeccionar una jerarquia de clases en una unica. Tengo las clases PrecioEUR y precioUSD en
una sola q es Precio
1.
UML’s Diagram
Builder
Builder patron nos ayuda Construir objetos complejos paso a paso usando el concepto de
Programación fluida.
2.
3.
4.
Prototype
Observer
- Tiene un emisor y múltiples receptores.
- AnalogíaMuchas personas pueden escuchar la radio
- oneToMany (Uno habla muchos escuchan y estos reaccionan)
- También llamado Public Subscriber.
* Se puede llamar como :public subscriber-->Uno emite, se suscriben para reaccionar a un
evento.
* Ejemplo: cuando se suscribe, para tener la ntoificacion de algo haya pasado.
* Se usa mucho y es muy util
* Habla y muchos escuchan-->oneToMany
* Los escuchadores de ese evento escuchan y obedecen. Analogo a una emisora.
[Explicación ChatGPT-3]
El patrón Observer es un patrón de diseño de software que se utiliza para manejar eventos y
cambios en un sistema. Este patrón se basa en la idea de que un objeto, llamado sujeto u
observable, mantiene una lista de sus dependientes, llamados observadores, y les notifica
automáticamente cada vez que se produce un cambio en su estado.
En este patrón, el sujeto u observable es la entidad que tiene el estado que puede cambiar. Los
observadores son las entidades que están interesadas en el estado del sujeto y que necesitan
ser notificados cada vez que se produce un cambio en su estado.
El sujeto u observable proporciona una interfaz para que los observadores se registren y
cancelen su registro. Los observadores implementan una interfaz común que permite al sujeto
notificar automáticamente a todos los observadores registrado cuando se produce un cambio
en su estado.
Este patrón es útil en situaciones en las que múltiples objetos necesitan estar informados de
los cambios en el estado de otro objeto. También permite que los objetos puedan comunicarse
sin conocer los detalles internos del otro.
Por ejemplo, en un sistema de comercio electrónico, el sujeto u observable puede ser una
tienda en línea que mantiene un registro de los productos en inventario. Los observadores
pueden ser varios clientes que están interesados en recibir notificaciones cada vez que se
agrega un nuevo producto al inventario o cuando se elimina un producto existente. De esta
manera, los clientes pueden ser notificados automáticamente cada vez que se produzca un
cambio en el inventario sin tener que realizar consultas repetitivas para ver si ha habido algún
cambio.
1 Step: Create the subscribers that implement a common interface with the
methods to execute.
2 step: Create the transmitter with 2 basic methos and just add subscribers:
Iterator
Mediator
Paso 1: Crear un mediador para todos que tenga 2 básicas funciones: Registrar
y enviar. Y crear un mediador concreto que implemente dichos métodos y pueda
registrar a los Speakers.
3 PASO: Crear una clase abstracta del tipo de entidad que quiero que se
comuniquen entre ellas, es este caso, COLEGA, en la que cada colega tiene un
mediador; es algo así como si cada colega tuviera su MEDIADOR con el que se
comunica. Análogo a una centralita.
UML’s Diagram:
State
* FLUJOS DE TRABAJO (Gestionar el Flow Work) Si no pasa una cosa que no pase la
* otra(un dispensador de cocacola si le doy al boton, primero tengo q insertar la moneda para
q asi si me pase la cocacola)
*
* Implementacions una clase abstracta con funciones q permiten cambiar los estados en
cadena. Ejemplo: en moviles se usa.
* Succesion de eventos. Primero hago esto, luego esto y luego esto. Ejemplo: No puedo tomar
foto si tengo el telefono bloqueado.
* Por cada estado heredo la clase base que es Estado. Y en cada estado invoco al constructor
del padre class Estado e implemento los metodos abstractos de dicha clase.
UML’s diagram
Strategy
* Crear un envoltorio sobre varias funciones de forma q un mismo codigo se pueda usar de
maneras diferentes.
* Ejemplo: metodo de pago-->Nos ofrece una serie de opciones. Pero la implementacion de
apgar ocn visa es distinto de pagar con paypal
* Es implmentar unas funciones ismilares(con el mismo nombre), estas actuen de una u otra
forma. Podremos crear metodo pagar en
* 2 clases diferentes dependiendo de por donde vamos a pagar, se ejecute uno o se ejecute
otro. Los metodos y sus nombres son los mismos.
* Teniendo diferetnes clases que implementen una misma interfaz, si creamos sobre ellos un
envoltorio, podemos utilizarlas indistintamente.
https://refactoring.guru/design-patterns/strategy
Chain of responsibility
Certainly! The Chain of Responsibility is like passing a request along a chain of people until someone can handle it.
Let's break it down in a simple way:
Imagine you work in an office, and you have a series of supervisors, each with a different level of authority. You have
a simple request, like getting approval for a day off. You first ask your immediate supervisor. If they can approve it,
great! If not, they pass it up the chain to their supervisor. This process continues until someone with the authority to
approve your request is found.
1. No one person is overloaded: If your immediate supervisor is busy or unavailable, the request
automatically goes to the next person in line. This ensures that the request doesn't get stuck, and it finds its
way to someone who can handle it.
2. Flexible and dynamic: The chain can be easily adjusted. If a supervisor is unavailable or if the organization
structure changes, you can still pass requests smoothly.
In programming, the Chain of Responsibility pattern is used similarly. You have a series of objects (like the
supervisors) that can process a request. The request is passed along the chain until one of the objects can handle it.
This makes your code more flexible, as you can add, remove, or rearrange these processing objects without
changing how requests are made. It promotes loose coupling and helps manage the flow of requests through your
software.
EXAMPLE: GUI
Sure, let's consider a real-world example of the Chain of Responsibility pattern in software development: event
handling in graphical user interfaces (GUIs).
Imagine you're building a graphical user interface for a computer program, and this GUI has various interactive
elements like buttons, text fields, and checkboxes. When a user interacts with the GUI, such as clicking a button, the
system needs to respond appropriately.
In this scenario:
1. Event Source: The user interacts with a GUI component, like clicking a button.
2. Event Object: An event object is generated, describing the user's action (e.g., a "Button Clicked" event).
3. Handlers in a Chain: Now, you have different objects or components in your GUI, like buttons, text fields,
and checkboxes. Each of these components can have an associated event handler.
4. Chain of Responsibility: When an event occurs, it is passed along a chain of these event handlers. The first
handler in the chain examines the event and decides if it should handle it. If it can handle the event (e.g., the
button's click event handler), it processes it and doesn't pass it along the chain. If it can't handle it (e.g., a
text field can't handle a button click), it passes the event to the next handler in the chain.
This way, you don't need to explicitly code which component should respond to which event in a centralized
manner. Each component knows how to handle its events, and if it can't, it passes them along to the
appropriate handler in the chain. This makes your GUI code more flexible and scalable because you can easily
add or remove components and handlers without having to modify the core event handling mechanism. It
also promotes the principle of single responsibility, as each component is responsible for handling its own
events.
Structural patterns
Decorator
Primer paso:
Segundo paso:
Quinto paso: Producimos el envoltorio de las clases: Es algo así como una
cadena de llamadas
UML’s Diagram:
Adapter
* Crea una clase que permite q clases con la misma y disitnta implementacion, funcionen
coherentemente
* Analogia-->Apatador frances vs adapatador colombiano.Se compa un adapatador. Entonces,
clase intermedia
* hace q multiples clases con distitnos metodos puede trabajar coherentemente.
* Usado en Legacy Coding.
* vamos a adapatar algo q no cumple con la interfaz a algo que si la cumple. Ejemplo: La clase
ligthub funcion igual
* que mi clase "Lampara".
* Usos-->Trabajar librerias nuevas a librerias viejas. CLAVE-->Adaptar unas funcones
aotras
* Un adapatador para cada cosa que quiera adaptar
Facade
Un envoltorio q simplifca alto complejo por detrás.
Esconder toda la logica en una llamada. Eso es una fachada. Ocultar la complejidad detrás de un codigo
sencillo.
Creamos una clase tipo fachada, y escondemos la complejidad de todo lo que hay por debajo.
Bridge
The Behavioral Design Pattern called the "Bridge" is like a way to separate an object's abstract structure from its
implementation. Let me explain this in a simple way:
Imagine you have a remote control for your TV. The remote control is like the "Abstraction," and the TV itself is the
"Implementation." Now, let's say you want to change your TV to a different brand or type, like switching from a
Samsung to an LG TV. You don't want to change the whole remote control, just because you changed the TV.
So, the "Bridge" pattern helps you do that. It separates the remote control (Abstraction) from the TV
(Implementation). When you want to use a different TV (Implementation), you don't need to change the remote
control (Abstraction) - you just "bridge" the two by connecting them in a flexible way.
This way, you can use different types of TVs with the same remote control without modifying the remote itself. It's
like having a bridge between different types of TVs and your remote control, allowing them to work together
without being tightly coupled.
In programming, this pattern is used to separate an abstraction (interface or abstract class) from its concrete
implementations. It makes your code more flexible because you can change the implementation without affecting
the abstraction, just like changing your TV without changing the remote control.
Interview’s Questions
1. JRE vs JDK
* JRE es el Java Runtime Environment y es el ambiente de ejecución de java que contiene la
JVM para ejecutar java en cualquier maquina.
* JDK es el Java Development Kit es el conjunto de herramientas para compilar y desarrollar
Java. Contiene las bibliotecas, compilador, etc.
2. Que versión de Java es la ultima?
La versión 20.
3. Que versión de Java usastes, que proyecto?
* Usé la versión 19 y he realizado una API REST para el manejo de citas de laboratorios usando
el Spring Framework la extensión springboot para no tener que configurar manualmente los
beans y por el servidor apache tomcat embebido.
* También participé en el desarrollo de una PoC en la que también usamos la tecnología
SpringBoot y realice unas funciones lambda que las desplegé en aws mediante el servicio
Lambda de AWS. También configuré la conexión con la bases de datos NoSQL en DynamoDB.
* He realizado un sistema para administración de estudiantes.
* Varios ejercicios de API REST.
* Usé JPA, Hibernate
4. ¿Qué es JPA y Hibernate?
* JPA Java Persistence API, es la API de java o conjunto de interfaces en donde
especificación (Es una especificacón) de como debe realizarse la persistencia de los datos en
cualquier base de datos.
* Hibernate Es una ORM (Object-Relational Modeling - herramienta que permite relacionar
los objetos de un lenguaje de POO a las entidades o tablas de las bbdd. Una de estas famosas
herramientas es Hibernate, q es la implementación del JPA de java.
Uso realmente no lo hago con las clases de Hibernate creado en entityManager, sino q uso una
capa mas abstracta q es la q proporiciona JpaRepository q usa una capa de abstracción para q
sea más facil (ya viene con un CRUD por defecto).
Querys
Querys con JPQL y Nativas.
Toda clase q es hija de otra clase, debe de usarse como si fuera el mismo
padre. No puede comportarse de manera diferente de sus desendientes.
Ejemplo: Tenemos una super clase llamada Duck y queremos un pato de goma DockerDuck .
Este hijo tiene todo lo que hace un Duck pero no Fly() . Aquí estaríamos violando este principio
puesto que la clase hija no se estaría comportando como la clase padre.
Solución Rediseñar el sistema con componentes individuales o interfaces.
Interface segregation Estableces que los clientes no deben de depender de
interfaces que no usan. En lugar de tener interfaces monoliticas y genéricas,
se deben dividir en itnerfaz mas peuqeñas para q el cliente use solo lo que
necesita. Reduce dependencias innecesarias y reduce el acoplamiento entre
componentes.
Software Arquitectures
1. Arquitectura Monolítica:
Todo se desplega y desarrolla en una sola unidad ( interfaz, logica empresarial y capa de
acceso de datos estan interconectados y se ejecutan en el mismo proceso. Util en:
Pequeñas aplicaciones internas o prototipos rápidos donde la escalabilidad no
es una preocupación principal.
Aplicaciones simples con una lógica empresarial limitada y pocos componentes.
Escenarios donde se requiere un despliegue sencillo y se gestionan todas las
partes de la aplicación en conjunto.
2. Arquitectura de Cliente-Servidor:
La app se divide en 2 componentes: Cliente y servidor, en donde el cliente es el responsble
de realizar la interfaz y el sevidor manejea la logica empresarial y gestión de datos.
Comunicación através de la red para solicitar y recibir información.
Util en:
Apps que requieren a una base de datos centralizada.
Tipos de API
API WebSocket:
WebSocket es un protocolo de comunicación bidireccional que permite la comunicación en
tiempo real entre un cliente y un servidor. Las APIs WebSocket permiten establecer una
conexión persistente entre el cliente y el servidor, lo que permite una comunicación eficiente y
de baja latencia. Esta API es especialmente útil para aplicaciones en tiempo real, como chats,
juegos en línea, actualizaciones en tiempo real y colaboración en tiempo real.
API GraphQL:
GraphQL es un lenguaje de consulta y manipulación de datos que permite a los clientes
solicitar y recibir solo los datos que necesitan. En lugar de recibir respuestas predefinidas, los
clientes pueden especificar los campos y la estructura de los datos que desean recibir. Las APIs
GraphQL proporcionan una capa de abstracción sobre los servicios y bases de datos
subyacentes, lo que permite una mayor flexibilidad y eficiencia en la recuperación de datos.
API SOAP (Simple Object Access Protocol):
SOAP es un protocolo de comunicación basado en XML que permite la comunicación entre
sistemas distribuidos. Las APIs SOAP definen una estructura y un formato estándar para el
intercambio de mensajes entre el cliente y el servidor. Utilizan el protocolo HTTP o protocolos
específicos como el Protocolo de Transferencia Simple (SMTP) para el transporte de los
mensajes SOAP.
Recursion
Una función se llame a si misma un número de veces.
TIENE que haber una condición para que sea acabe la iteración.
For vs recursividad?—Es según el caso.
BufferedInputStream no es abstracta, es una clase concreta, por tanto puedes crear instancias de esta clase. Su
método read devuelve un byte de a cada vez pero mantiene un buffer donde va acumulando los bytes
internamente.
La clave en las clases que comienzan con Buffered es que usan un buffer, digamos que una memoria interna
que normalmente hace que esas clases sean más eficientes, es decir, es esperable que BufferedInputStream sea
más rápida que las otras implementaciones de InputStream. La idea sería: un InputStream normal tiene que
estar llamando y accediendo al sistema operativo para cada byte que quiera devolver y esto consume cpu y es
ineficiente. En cambio un BufferedInputStream llama al sistema operativo una vez y recolecta un array de
bytes. Cuando se le pide read() ya no tiene que acceder al sistema operativo, sino que devuelve la información
de su buffer interno. En algún momento el buffer interno se agota, pero mientras esto ocurre se han ahorrado
un montón de procesos.
En conclusión:
InputStreamLee en un sitio..
PrintStreamImprimir en donde sea (pantalla, fichero, etc).
Servicios REST
App web q cumple una serie de patrones determinados.
Verbos HTTPTipo de peticion q enviamos al servidor usando el protocolo HTTP.
- GET: Obtiene recurso (imagen, video, html, etc) de un servidor
- POST: Envio datos al servidor (Ejemplo, en un formulario, se envia datos a un servidor).
- PUT: Actualice un usuario TODOS LOS datos del usuario
- PATCH: Cambiaria unicamente los datos que desea actualizar (Muchas no soportan el
PATCH)
- DELETE
- CRUD
GET https://www.dominio.tld/bootcampers
Bootcampers Recurso
Usuario 1
Usiaro 2 usuario 3
POST https://www.dominio.tld/bootcampers
“Por favor crea un nuevo usuaruio con nombre XXXX”
PUT https://www.dominio.tld/bootcampers/Usuario
Actualizar algun recurso
DELETE https://www.dominio.tld/bootcampers/Usuario1
NOTAS:
1. Los recursos son nombres no verbos:
https://www.dominio.tld/users
https://www.dominio.tld/api/v1/users
-POST “nombre”,”apellidos”
https://www.dominio.tld/api/v2/users
-POST “nombre completo”
* Muy importante para la migración
https://www.dominio.tld/users/parangos
https://www.dominio.tld/users/12
https://www.dominio.tld/users/subjects
https://www.dominio.tld/cats
https://www.dominio.tld/pets
Java web
DESARROLLO WEB 🌎
Conjunto de funcones metodos procedimientos. Ej: un app frontend y
backend y comunicarlas entre sí mediante las apis.
o APIS endpoint para q el frontend lo consuma.
Etiquetas
LeetCode
diagonalDifference
RECUERDA siempre encontrar patrones en el comportamiento:
#3 Opciones
1. for i in range(0,len(home_bets)):
2. for j in range(0,len(home_bets)):
3. for k in range(0,len(home_bets)):
4. if(i!=j or j!=k):
5. permutation=[home_bets[i][0],home_bets[j][1],home_bets[k][2]]
6. permutations.append(permutation)
Udemy
Refactoring code reusing validations methods for the following methods.