Archivo categoría java

Tipos de variables en Java

Concepto de variable

Una variable es un contenedor de bits que representan a un valor. Se emplean para almacenar datos que pueden cambiar durante la ejecución de un programa. En función de los datos que almacenan se clasifican en:

  • Variables primitivas: almacenan datos numéricos, valores lógicos o caracteres.
  • Variables referenciadas: asociadas a objetos o instancias de una clase. Por ejemplo, para almacenar cadenas de caracteres se empleará una variable referenciada asociada a la clase String, para almacenar información sobre la fecha actual, otra asociada a la clase Date, etc. Se estudiarán más adelante.

Además de estos dos tipos de variables se estudiarán los arrays de variables primitivas y de variables referenciadas. Un array, como se verá en el tema correspondiente, es una variable referenciada asociada a la clase Object (clase madre de todos los objetos Java).

Se va a profundizar un poco más en el concepto de variable: como se ha comentado anteriormente, no es nada más que un contenedor de bits que representan a un valor. Ocurre lo siguiente:

  • En el caso de variables primitivas, los bits representan un número entero que coincide con el valor de la variable, con lo que se va a trabajar a lo largo del programa. Por ejemplo, se tienen variables de tipo byte (utilizan 8 bits en memoria) que pueden almacenar números enteros comprendidos entre -128 y 127, de tipo int (utilizan 32 bits en memoria) para almacenar enteros entre, aproximadamente, -2150 millones y 2150 millones, de tipo float para números decimales, etc.

  • En el caso de variables referenciadas o asociadas a objetos, los bits representan un numerajo que permite acceder al valor de la variable, es decir, al objeto, pero no es el valor u objeto en sí.

Todos los nombres empleados para hacer referencia a variables deben cumplir lo siguiente:

  • Su primer carácter debe ser una letra, el símbolo del subrayado o el carácter dólar $.
  • No son válidos las palabras reservadas de Java.
  • No se admiten espacios en blanco.
  • Son case-sensitive (sensibles a mayúsculas).

Aparte de estas normas conviene que los nombres de las variables indiquen qué dato almacenan con el fin de facilitar la lectura del programa y, por otra parte, si un nombre tiene más de dos palabras la primera letra de la primera palabra irá en minúscula, la primera letra de la segunda palabra en mayúscula, ídem con la tercera y así sucesivamente.

Ejemplo:

int miVariableEntera=100;

Variables primitivas

  • De tipo entero:

Son variables que almacenan números enteros. Se pueden dividir en los siguientes tipos:

NOTA: el tipo de variable en que se almacena por defecto un numero entero es int. El valor por defecto asociado a cualquier variable entera no inicializada es 0.
  • De tipo real o de coma flotante:

Son variables que almacenan datos numéricos con decimales. Se pueden dividir en los siguientes tipos:

NOTA: el tipo de variable en que se almacena por defecto un numero decimal es double. El valor por defecto asociado a cualquier variable real no inicializada es 0.0.
  • De tipo lógico o booleanas:

Son variables que almacenan dos posibles valores: true o false. No se corresponden con ningún valor numérico.

Ejemplo:

boolean tienesCalor=true;

NOTA: el valor por defecto asociado a cualquier variable booleana no inicializada es false.
  • De tipo char o de carácter:

Son variables que almacenan caracteres individuales (letra, numero, signo ?, etc…). El carácter que se inicializa debe ir entre apóstrofes o comillas simples ‘a’.

El código de caracteres empleado por Java es Unicode y recoge los caracteres de prácticamente todos los idiomas importantes del mundo (son unos 65.536). Los caracteres Unicode del alfabeto occidental corresponden a los primeros 256 enteros; es decir van desde [0, 255].

A cada carácter le corresponde unívocamente un número entero perteneciente al intervalo [0, 65536] o a [0, 255] si se trabaja sólo con el alfabeto occidental. Por ejemplo, la letra ñ es el entero 164. Más adelante se verá que el casting entre variables primitivas enteras y la variable char está permitido.

Ejemplo:

char miCaracter=’n';
char miCaracter1=110;    (ídem antes, pero mediante el entero que le corresponde según Unicode)
char miCaracter2=’\u006E’; (ídem antes, pero según notación Unicode. La notación Unicode, en general, es así: \uXXXX siendo X un dígito o cifra fundamental del sistema de numeración hexadecimal (0,1,2,…,9,A,B,…,F))

Asociado a este tipo de variable se tienen las secuencias de escape. Se emplean para representar caracteres especiales (por ejemplo, unas comillas dentro de una instrucción que exige una cadena entrecomillada) y caracteres no imprimibles como el tabulador, salto de línea, etc. Van precedidos de la contrabarra. Algunos de ellos se detallan en la tabla siguiente:

NOTA: el valor por defecto asociado a cualquier variable char no inicializada es ‘\u0000′

Ejemplo: todos los códigos de este tema se guardarán en c:\cursojava\tema2

Código fuente

Por consola:

Comienza programa
El valor de tengoCalor es true
El valor        de letra es n
El valor        de letra1 es n
El valor        de letra2 es n
Eso es
un mensaje
de tres lineas
Me llamo “Jesus”
Me llamo \Jesus\

Variables referenciadas

Asociadas a objetos o instancias de una clase. Se irán estudiando durante el curso.

Casting o transformaciones de tipo

El casting es un procedimiento para transformar una variable primitiva de un tipo a otro, o transformar un objeto de una clase a otra clase siempre y cuando haya una relación de herencia entre ambas (este último casting es el más importante y se verá más adelante).

Dentro del casting de variables primitivas se distinguen dos clases:

  • Implícito: no se necesita escribir código para que se lleve a cabo. Ocurre cuando se realiza una conversión ancha (widening casting), es decir, cuando se coloca un valor pequeño en un contenedor grande.

Ejemplo 1:

Ejemplo 2: similar al anterior.

En cambio,

  • Explícito: sí es necesario escribir código. Ocurre cuando se realiza una conversión estrecha (narrowing casting), es decir, cuando se coloca un valor grande en un contenedor pequeño. Son susceptibles de pérdida de datos.

Ejemplo 1:

NOTA: si se sustituyera la primera línea int num1=100 por int num1=1000000, el código compilaría bien, pero habría pérdida de datos, pues el 1000000 se sale del rango de short [-32768, 32767]. Al mostrar por consola el valor se obtendría un resultado incongruente.

Ejemplo 2:

Ejemplo 3: continuación del Ejemplo 2 del casting implícito

Para que la línea

compile debe hacerse un casting explícito a long

pero no

porque, en la línea anterior, 10000000000 es considerado int, mientras que en las de arriba, double.

Dicho esto, se va a analizar un ejemplo un tanto extraño.

  • Ejemplo extraño:

Dado que cualquier entero, por defecto, se almacena en un int (4 bytes), con la línea anterior se pretende colocar un valor grande (el int 10) en un contenedor pequeño (una primitiva de tipo byte con capacidad para 1 byte). Esto, según lo expuesto anteriormente, precisa de casting explícito.

Pero, resulta que no hace falta, ya que el compilador, cuando se trabaja con enteros, digamos que, provoca un “casting implícito contranatura” y transforma automáticamente a byte el int 10. Ocurriría lo mismo si se trabajara con short y char.

Lo que pasa (y esto es lo que resulta un tanto extraño) es que no ocurre lo anterior con los decimales: por eso, una línea como

provoca error de compilación. Recordar que cualquier decimal, por defecto, se almacena en un double (8 bytes) y que un tipo float tiene capacidad para 4 bytes. En los decimales, el compilador no fuerza el casting implícito contranatura. De ahí que sea necesario un casting explícito a float para evitar el fallo de compilación.

NOTA: quizá se evitarían estas situaciones, si el compilador no forzara el casting implícito contranatura a byte, short o char de un int y provocara error de compilación, del mismo modo que cuando se declara un float y no se castea explícitamente. Pero, de momento, esto es lo que hay.
  • Código de partida para explicar el casting entre variables primitivas que almacenan datos numéricos:

Las líneas 3 y 4 almacenan al número 10 mediante una variable primitiva de tipo byte vía “casting implícito contranatura”, el 3000 mediante una de tipo short, también vía “casting implícito contranatura”. Lo más intuitivo es definirlas mediante un casting explícito, pero tal y como están también se puede.

Supuestamente, la línea 5, almacena el 3000000000 mediante una variable de tipo long, vía casting implícito, pero es falso. Ocurre lo que se ha comentado en el Ejemplo 2 del casting implícito: 3000000000 no es considerado como long sino como int y 3000 millones no pertenece al rango asociado a int (aprox. [-2150 millones, 2150 millones]). Si se intenta compilar, se produciría error.

Supuestamente, la línea 6, almacena el 256.5 mediante una variable de tipo float (ocupa 4 bytes en memoria), vía “casting implícito contranatura”, pero, como se ha comentado en el Ejemplo extraño, es falso, ya que en decimales nunca se produce. Debe castearse explícitamente a float.

El código correcto sería:

Código fuente

  • Una cuestión a tener en cuenta relacionada con el casting entre variables primitivas es la siguiente:

En Java se realizan automáticamente conversiones de una variable primitiva de un tipo a otra de otro de igual o mayor precisión.

La precisión depende del número de bytes ocupados en memoria y del rango de valores asociado: a mayor número de bytes ocupados, mayor precisión y mayor rango asociado. Así, pasar de byte a short, de short a int, de byte a int, . es automático; en definitiva: pasar de una variable primitiva de un tipo de la cadena de la siguiente línea a otra que se encuentre a su derecha es automático.

byte–>short–>int–>long–>float–>double

Así, por ejemplo, si un método necesita un long como argumento y se le pasa un entero perteneciente al rango de int, promociona automáticamente a long y no es necesario casting.

En cambio, si se le pasa un entero que se sale fuera del rango de int, es necesario realizar un casting para que la llamada al método no provoque error al compilar.

Un ejemplo de esto ocurre con el método estático de java.lang.Thread “void sleep(long retardo)” que introduce un retardo en la ejecución del código, coincidente con el entero, en milisegundos, que se le pasa al argumento. Este método se estudiará más adelante.

Por consola:

Hola
– Después de tres segundos –
Adios

En cambio, si se sustituye

Thread.sleep(3000) por Thread.sleep(3000000000)

no compila ya que el entero que se le pasa no pertenece al rango de int y no puede promocionar a long automáticamente.

Para que compile es necesario hacer un casting explícito:

Thread.sleep(3000000000L)

  • Para finalizar con el casting entre primitivas, conviene tener en cuenta lo siguiente:

No es posible realizar casting entre una variable primitiva  booleana y cualquier otra variable primitiva.

Sí es posible realizar casting entre una variable primitiva char y una variable primitiva que almacene enteros.

Ejemplo:

Código fuente

Por consola:

ñ
ñ

, , , ,

1 Comentario

Los mejores libros para aprender Java

Buscando libros de java me he encontrado con una lista con los mejores libros para aprender este lenguaje de programación:

Objects First With Java: A Practical Introduction Using BlueJ (2nd Edition)

1. Objects First With Java: A Practical Introduction Using BlueJ (2nd Edition)

Autor: Michael Kölling

Descripción:

Start by learning about objects, first; what a great idea! This book begins with the direct manipulation of objects. No public static void main until the 4th chapter.

Head First Java

2.  Head First Java

Autor: Kathy Sierra

Descripción:

Left brain + right brain + humor = comprehension. Written by the founder of Javaranch.com, herself.

Java in a Nutshell, Fourth Edition

3.  Java in a Nutshell, Fourth Edition

Autor:
David Flanagan

Descripción:

The only paper reference book you will need.

The Java(TM) Developer's Guide to Eclipse

4.  The Java(TM) Developer’s Guide to Eclipse

Autor: Sherry Shavor

Descripción:

You need to learn a powerful IDE, and this is one of the best. The first half deals with learning to use the IDE and the second half shows you how to write plugins for Eclipse.

Sun Certified Programmer & Developer for Java 2 Study Guide (Exam 310-035 & 310-027)

5.  Sun Certified Programmer & Developer for Java 2 Study Guide (Exam 310-035 & 310-027)

Autor: Kathy Sierra

Descripción:

Only if you want to be certifiable! This is a great companion book to Head First Java.

, , , , , ,

1 Comentario

Comparación entre algoritmos de ordenación

Los algoritmos de ordenación son funciones o métodos que se encargan de ordenar un “array” de datos. Existen varios tipos de métodos de ordenación, pero hoy solo vamos a comentar algunos de los más potentes:

  • QuickSort
  • MergeSort
  • SelectionSort
  • BubbleSort

QuickSort

El ordenamiento rápido (quicksort en inglés) es un algoritmo basado en la técnica de “divide y vencerás”, que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n.

Quizás este sea el algoritmo de ordenación más rápido que existe.

Representación del algoritmo en pseudo-código:

 function quicksort(array)
     var list less, greater
     if length(array) ≤ 1
         return array
     select and remove a pivot value pivot from array
     for each x in array
         if x ≤ pivot then append x to less
         else append x to greater
     return concatenate(quicksort(less), pivot, quicksort(greater))

Representación del algoritmo en Java:

private static void quickSort(int[] x, int a, int b) {
	int i = a, j = b;
	int p = x[(a+b)/2];
	int v;
	do{
		while(x[i] < p) i++;
		while(x[j] > p) j--;
		if( i <= j ){
			v = x[j];
			x[j] = x[i];
			x[i] = v;
			i++;
			j--;
		}
	} while (i <= j);
	if( a < j ) quickSort(x,a, j);
	if( b > i ) quickSort(x,i, b);
}

Representación del algoritmo gráficamente:

MergeSort

El algoritmo de MergeSort se basa en la misma técnica que QuickSort de “divide y vencerás”, y su tiempo de ordenación es proporcional a n log n.

Representación del algoritmo en pseudo-código:

function mergesort(array A[x..y])
begin
  if (x-y > 1)):
    array A1 := mergesort(A[x..(int( x+y / 2))])
    array A2 := mergesort(A[int(1+(x+y / 2))..y])
    return merge(A1, A2)
  else:
    return A
end

function merge(array A1[0..n1], array A2[0..n2])
begin
  integer p1 := 0
  integer p2 := 0
  array R[0..(n1 + n2 + 1)]
  while (p1 <= n1 or p2 <= n2):
    if (p1 <= n1 and A1[p1] <= A2[p2]):
      R[p1 + p2] := A1[p1]
      p1 := p1 + 1
    if (p2 <= n2 and A1[p1] > A2[p2]):
      R[p1 + p2] := A2[p2]
      p2 := p2 + 1
  return R
end

Representación del algoritmo en Java:

private static void mergeSort( int[ ] x, int[ ] tmpArray, int left, int right ) {
	if( left < right ) {
		int center = ( left + right ) / 2;
		mergeSort( x, tmpArray, left, center );
		mergeSort( x, tmpArray, center + 1, right );
		merge( x, tmpArray, left, center + 1, right );
	}
}

private static void merge( int[ ] x, int[ ] tmpArray, int leftPos, int rightPos, int rightEnd ) {
	int leftEnd = rightPos - 1;
	int tmpPos = leftPos;
	int numElements = rightEnd - leftPos + 1;
	while( leftPos <= leftEnd && rightPos <= rightEnd )
		if( x[ leftPos ] <= x[ rightPos ] )
			tmpArray[ tmpPos++ ] = x[ leftPos++ ];
		else
			tmpArray[ tmpPos++ ] = x[ rightPos++ ];
	while( leftPos <= leftEnd )
		tmpArray[ tmpPos++ ] = x[ leftPos++ ];
	while( rightPos <= rightEnd )
		tmpArray[ tmpPos++ ] = x[ rightPos++ ];
	for( int i = 0; i < numElements; i++, rightEnd-- )
		x[ rightEnd ] = tmpArray[ rightEnd ];
}

Representación del algoritmo gráficamente:

SelectionSort:

El ordenamiento por selección (Selection Sort en inglés) es un algoritmo de ordenamiento que requiere O(n2) operaciones para ordenar una lista de n elementos.

Su funcionamiento es el siguiente:

  • Buscar el mínimo elemento de la lísta
  • Intercambiarlo con el primero
  • Buscar el mínimo en el resto de la lista
  • Intercambiarlo con el segundo

Representación del algoritmo en pseudo-código:

para i=1 hasta n-1
    minimo = i;
    para j=i+1 hasta n
        si lista[j] < lista[minimo] entonces
            minimo = j /* (!) */
        fin si
    fin para
    intercambiar(lista[i], lista[minimo])
fin para

Representación del algoritmo en Java:

public static void selectionSort(int[] x) {
	int n = x.length;
	for (int i=0; i<n-1; i++) {
		for (int j=i+1; j<n; j++) {
			if (x[i] > x[j]) {
				int temp = x[i];
				x[i] = x[j];
				x[j] = temp;
			}
		}
	}
}

Representación del algoritmo gráficamente:

BubbleSort

El Ordenamiento de Burbuja (Bubble Sort en inglés) es un sencillo algoritmo de ordenamiento. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos de posición si están en el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten más intercambios, lo cual significa que la lista está ordenada. Este algoritmo obtiene su nombre de la forma con la que suben por la lista los elementos durante los intercambios, como si fueran pequeñas “burbujas”. También es conocido como el método del intercambio directo. Dado que solo usa comparaciones para operar elementos, se lo considera un algoritmo de comparación, siendo el más sencillo de implementar.

Representación del algoritmo en pseudo-código:

procedure bubbleSort( A : list of sortable items ) defined as:
  do
    swapped := false
    for each i in 0 to length(A) - 2 inclusive do:
      if A[i] > A[i+1] then
        swap( A[i], A[i+1] )
        swapped := true
      end if
    end for
  while swapped
end procedure

Representación del algoritmo en Java:

public static void bubbleSort(int[] x) {
	int n = x.length;
	for (int pass=1; pass < n; pass++) {
		for (int i=0; i < n-pass; i++) {
			if (x[i] > x[i+1]) {
				int temp = x[i];  x[i] = x[i+1];  x[i+1] = temp;
			}
		}
	}
}

Representación del algoritmo gráficamente:

Comparación de los Algoritmos

Después de explicar los algoritmos, he procedido a cronometrarlos uno a uno ordenando una lista de 10.000 elementos mediante una maquina de Java.

Los resultados fueron los siguientes:

  1. QuickSort: 1.29 ms de media.
  2. MergeSort: 1.57 ms de media.
  3. BubbleSort: 49.08 ms de media.
  4. SelectionSort: 103.77 ms de media.

Los archivos utilizados para este procedimiento están aquí.

Enlaces | Wikipedia

Los resultados fueron los siguientes:

, , , , , , , , , ,

No hay Comentarios

Algo de historia de Java…

Prehistoria

En Diciembre de 1990 un ingeniero de Sun Microsystems llamado Patrick Naughton enviaba un correo electrónico a Scott McNealy, CEO de Sun Microsystems, explicándole las razones de su marcha para trabajar en NeXT, una empresa fundada por Steve Jobs después de “renunciar” en Apple, cuyo objetivo era crear el computador perfecto, y que mas tarde sería comprada por Apple junto con el sistema operativo desarrollado, NeXT Step, para crear su nuevo sistema operativo.

Naughton era jefe de proyecto de la sección gráfica en un grupo dedicado a unir NeWS (Networked/extensible Window System), un sistema de ventanas de Sun inventado por James Gosling y basado en PostScript, con X11 (X window System versión 11), lo cual significaba que tenían que soportar “tres toolkits, tres sistemas de ventanas, tres arquitecturas hardware diferentes, dos interfaces de usuario y dos versiones de sistemas operativos diferentes”.

Como respuesta, Bill Joy le ofrece continuar en Sun trabajando en algo nuevo, uniéndose a un nuevo grupo para desarrollar una nueva tecnología. Un grupo con total autonomía respecto de la línea directiva de Sun y completamente secreto. Así nace el llamado Proyecto Stealth.

El 15 de Enero de 1991 Bill Joy, Andy Bechtolsheim, Wayne Rosing, Mike Sheridan, James Gosling y Patrick Naughton se reunen en Aspen, Colorado. El grupo quiere anticipar hacia donde se dirijirá la computación. Discuten sobre que les gusta y que no les gusta de varias tecnologias y al final llegan a la conclusión de que al menos una de las tendencias futuras será el acercamiento de sistemas digitales y electrónica de consumo. Se marcan como objetivo desarrollar un entorno único que pudiera ser utilizado por todos los dispositivos de electrónica de consumo.

Con el objetivo marcado, los miembros del Proyecto Stealth, que mas tarde se pasaría a llamar Proyecto Green, comienzan a trabajar el 1 de Febrero de 1991 en una pequeña oficina de Sand Hill Road en Menlo Park. Se divide el trabajo con Naughton dedicado al sistema gráfico “Aspen”, Gosling dedicado a identificar el lenguaje de programación a utilizar en el proyecto y Sheridan dedicado al desarrollo de negocio.

En un principio se considera C++ como lenguaje a utilizar, pero tanto Gosling como Bill Joy lo encontraron inadecuado. Gosling intentó primero extender y modificar C++ resultando el lenguaje C++ ++ — (++ — porque se añadían y eliminaban características a C++), pero lo abandonó para crear un nuevo lenguaje desde cero al que llamo Oak (Roble), según la versión mas aceptada, por el roble que veía através de la ventana de su despacho.

Oak debía ser independiente de la plataforma, dado el gran número de modelos en el mercado, por lo cual se optó por un lenguaje interpretado. Además el nuevo lenguaje debía ser robusto y a la vez sencillo para evitar errores por parte del programador que pudieran llevar al cuelgue del sistema. Esto motivó que se eliminaran las características que hacían el código mas propenso a errores, como la herencia múltiple.

El resultado fue un lenguaje que tenía similitudes con C, C++ y Objective C y que no estaba ligado a un tipo de CPU concreta. Mas tarde se le cambiaría el nombre de Oak a Java, por cuestiones de propiedad intelectual, al existir ya un lenguaje con el nombre Oak. Se supone que le pusieron ese nombre mientras tomaban café (Java es también el nombre de un tipo de café, originario del este de Asia, de la isla del mismo nombre), aunque hay algunos que afirman que el nombre deriva de las siglas de James Gosling, Arthur Van Hoff, y Andy Bechtolsheim.

FirstPerson

En Agosto del 91 Oak ya corría sus primeros programas. El equipo trabajaba en un prototipo llamado Star7 (*7), un dispositivo parecido a una PDA, cuyo nombre venía de la combinación de teclas del teléfono de la oficina del Proyecto Green que permitía a los usuarios responder al teléfono desde cualquier lugar.

Después de mostrar a Scott McNealy y Bill Joy los prototipos de bajo nivel del sistema, continúan con el desarrollo, incluyendo su sistema operativo, Green OS; el lenguaje Oak, las librerias, alguna aplicación básica y el hardware, hasta que el 3 de Septiembre de 1992 se termina el desarrollo y con ello el Proyecto Green.

En la demostración para McNealy y Joy, aparecía un personaje creado por Joe Palrang que terminaría por convertirse en la mascota de Java, Duke.

Después de la demostración se decide crear una nueva empresa filial de Sun, FirstPerson, con sede en Palo Alto, para comercializar la nueva tecnología. Wayne Rosing, ex-jefe de Naughton en el grupo de trabajo de NeWs se une al proyecto desde SunLabs, asumiendo la dirección del equipo y de la nueva empresa.

Ahora que ya habían creado *7, quedaba la cuestión de qué hacer con él. El que había sido el mercado objetivo durante la concepción de *7, la electrónica de consumo, resultó no querer saber nada del nuevo producto porque disparaba los precios de los nuevos dispositivos. FirstPerson pasa de un desastre a otro sin encontrar un verdadero plan de negocio. El 15 de Marzo de 1993 Time Warner lanza un RFP (Request for Proposal) buscando una tecnologia para televisión por cable interactiva. FirstPerson se fija como nuevo objetivo el desarrollo de un sistema operativo para Time-Warner, pero cuando llega la hora de la verdad Time-Warner se decantanta por GDI, aún reconociendo que la tecnología de Sun era superior.

Tras el varapalo de Time-Warner se intenta vender *7 a 3DO pero después de meses de reuniones las negociaciones no llegan a buen puerto al exigir 3DO los derechos exclusivos de la tecnología. Como último recurso se presenta como alternativa a los ejecutivos de Sun el desarrollo de una plataforma de CD-ROMs multimedia basada en Oak pero la respuesta de estos no es favorable y se desmantela FirstPerson.

El nacimiento de Java

Mientras tanto, NCSA (National Center for Supercomputing Applications) liberaba Mosaic, una aplicación que permitía a los usuarios acceder a Internet de forma gráfica, pudiendo acceder a cientos de sitios de Internet en la World Wide Web. El número de sitios web crecía día a día e Internet comenzaba a convertirse en un fenómeno.

En Junio de 94 Joy comienza el proyecto “Live Oak” con el objetivo de usar Oak para construir un “pequeño gran sistema operativo” y estudiar las posibilidades de negocio de Internet. Mientras Arthur van Hoff implementa el compilador de Oak en lenguaje Oak, reemplazando la versión de Gosling que se había escrito en C, Naughton y Jonathon Payne comienzan a escribir un navegador web similar a Mosaic escrito en Java, “WebRunner” (por la película Blade Runner) al que después se llamaría “HotJava”.

El 29 de Septiembre de 1994 se termina el desarrollo del prototipo de HotJava. Cuando se hace la demostración a los ejecutivos de Sun, esta vez, se reconoce el potencial de Java y se acepta el proyecto.

El 23 Mayo de 1995, en la conferencia SunWorld ‘95, John Gage, de Sun Microsystems, y Marc Andreessen, cofundador y vicepresidente de Netscape, anunciaban la versión alpha de Java, que en ese momento solo corría en Solaris, y el hecho de que Java iba a ser incorporado en Netscape Navigator, el navegador mas utilizado de Internet.

Con la segunda alpha de Java en Julio, se añade el soporte para Windows NT y en la tercera, en Agosto, para Windows 95. En Enero de 1996, Sun crea JavaSoft para desarrollar la nueva tecnología y ese mismo mes aparece la versión 1.0 del JDK.

El resto, es historia.

Versiones de Java

  • Java 1
    • Java 1.0 (Enero 1996) – 8 paquetes, 212 clases – Primera versión pública. La presión hizo que se hiciera pública demasiado pronto, lo cual significa que el diseño del lenguaje no es demasiado bueno y hay montones de errores. Respecto a seguridad, es restrictivo por defecto, no dejando hacer demasiado al código no fiable.
    • Java 1.1 (Marzo 1997) – 23 paquetes, 504 clases – mejoras de rendimiento en la JVM, nuevo modelo de eventos en AWT, clases anidadas, serialización de objetos, API de JavaBeans, archivos jar, internacionalización, API Reflection (Reflexión), JDBC (Java Data base Connectivity), RMI (Remote Method Invocation). Se añade la firma del código y la autentificación. Es la primera versión lo suficientemente estable y robusta.
  • Java 2
    • Java 1.2 (Diciembre 1998 ) – 59 paquetes, 1520 clases – JFC (Swing), Drag and Drop, Java2D, Corba, API Collections. Se producen notables mejoras a todos los niveles. Para enfatizar esto Sun lo renombra como “Java 2″. El JDK (Java Development Kit) se renombra como SDK (Software Development Kit). Se divide en J2SE, J2EE y J2ME.
    • Java 1.3 (Abril 2000) – 77 paquetes, 1595 clases – Orientada sobre todo a la resolución de errores y a la mejora del rendimiento; se producen algunos cambios menores como la inclusión de JNDI (Java Naming and Directory Interface) y la API Java Sound. También incluye un nuevo compilador de alto rendimiento JIT (Just In Time).
    • Java 1.4 (2002) – 103 paquetes, 2175 clases – También conocido como Merlin, es la versión actual. Mejora notablemente el rendimiento y añade entre otros soporte de expresiones regulares, una nueva API de entrada/salida de bajo nivel (NIO, New I/O), clases para el trabajo con Collections, procesado de XML; y mejoras de seguridad como el soporte para la criptografía mediante las Java Cryptography Extension (JCE), la inclusión de la Java Secure Socket Extension (JSSE) y el Java Authentication and Authorization Service (JAAS).
    • Java 1.5 (Octubre 2004) – 131 paquetes, 2656 clases – También conocido como Tiger, renombrado por motivos de marketing como Java 5.0. Incluye como principales novedades:
      • tipos genéricos (generics)
      • autoboxing/unboxing conversiones impliticas entre tipos primitivos y los wrappers correspondientes.
      • Enumerados
      • Bucles simplificados
      • printf
      • Funciones con número de parámetros variable
      • Metadatos en clases y métodos.

Para saber mas sobre las novedades de Java 5.0 se puede consultar las release notes o el documento J2SE 5.0 in a Nutshell.

Visto en | MundoGeek

, , , , , , , , , , , ,

1 Comentario