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

Si los lenguajes de programación fuesen personas

¿Qué pasa si los lenguajes de programación son personas reales como tú y yo? ¿Y si eran parte de las familias y tenía relaciones y los asuntos? ¿Alguna vez has pensado en ir a un supermercado y Visual Basic era la mujer joven que esperaba en la fila delante de usted?

Así lo hicieron los de jeez.eu con su articulo de If Programming Languages Were Real Persons, una traducción aproximada la podeis encontrar aquí.

Charlie C

CC is a 70 years old man that knows a lot. Perhaps too proud to reveal what he knows and sometimes too cryptic. He is a very strict person that follows his way of doing things and nothing seems possible to change his mind. In the past he was known as one of the strictest teachers in the Devel City university.

C can make you happy or disappoint you so much that, you want go for one of his sons or daughters. It depends on how much you try to learn his ways. The more you try the more he gives you.

C has been the main builder behind large projects like the Linuxious stadium and other large scaled buildings that we all use. He still works as a freelancer engineer and has involved in many other projects. Even at his age and with a lot of competition mainly from his son C++, C is still the choice of many companies to do things in Devel City.

C has 3 daughters :

  • Perl,
  • Java and
  • C#

and one son, C++.

Vin C++

KD-Scientist-GS72C++ is 45 years old teacher at the Devel City university, following his father’s steps to become as respected as he is. He loves his father so much that tried to continue his work and knowledge. Being a younger man than C though, made him a much more friendly guy, in the means of approach, than his father. He works as a teacher in the Devel City university and his students have a love and hate affair with him.

C++ often lets his students choose their way in the learning process since he follows a different way of teaching approach than his father used to. His students love him because he lets them work in their own way but sometimes they fear his inheritance of C.

Most of his followers admire his wide range of knowledge that mixes C’s knowledge with knowledge gained through his life.

There are also a lot of people that criticise him of being so wide. Most of the time they talk about him as a direct descendant of C that has adopted all of his fathers disadvantages and added some more to it.

C++ has spent many years to get rid some of his fathers bad habits and never does things not needed. He prefers to put as much effort as needed to do the job right and never bloats things. This is why his projects are much more targeted than his fathers.

Montana Perl

perlPerl is a 37 years old young woman and works as a data analyst at the department of linguistics in Devel City. As a sexy young woman, her colleagues just love to work with her.

She is extremely clever, very strict when it comes to how people treat to her but has added great value to her carrier with her regular way of expressing things and her unique way of finding needles in haystacks. Many of her colleagues depend on Perl to fix things and they call her a “Swiss knife”.

Her father was a source of inspiration for Perl. Many of her father’s principles was inherited and many more added to her philosophy of how things should be done and why. She is a rather laconic character that speaks less but means a lot.

Perl finds it easy to work on different environments and performs well with a little help from her beloved husband Cygwin who always supports her ambitions.

Perl loves to travel. Each summer she goes around the world, most of the time she will be riding a camel in Africa and many times you might find her playing Golf in the State of the union stadium.

She also loves poetry and runs her own amusement company named Acme which aids in teaching young kids the way to do things the funny way.

Bianca Java

javaJava is a 35 years old sexy young woman and a mother also. Being so young and mature, Java is one of the most popular women in Devel City. She is very adoptable and can work everywhere. Her name comes as a feature in many projects and a lot of companies want their projects to carry her “Java powered” signature of quality.

Being C++’s sister, does not stop Java to be one of the biggest competitors of her brother. As a woman, Java is clean and manages to keep garbage out of her place, clean and clear. She works at JVM, a company specialized in ports creation.

Java loves sun. Each summer is Java’s favorite season and she loves playing with Duke in the beach.

Java has created her own legacy, just like her father did and has 2 daughters that promise to be as competitive as she is. Her daughters also work at JVM and stand out from the crowd of talented persons in Devel City. Their names are:

  • Groovy and
  • Scala

Jessica Groovy

groovyGroovy is 21. Young but her impact in Devel City is bigger than just big. She was greatly inspired by her aunt Perl and her best friend Ruby.

Groovy is laconic and very expressive like her aunt, got any possible knowledge of her mother and added some cool ways to do her job in JVM. Most of the time she guides her colleagues in a rather strange way… by adding question marks (?) wherever she thinks something should be checked again.

Jane Scala

scalaScala is 22 years old.She is sweet and quite friendly but many of her friends in Devel City feel a little thread when it comes to job opportunities. The case of Twittorix, where the managers of the project asked Scala to do the job, made Ruby upset.

Scala like her little sister Groovy, got all of her mother’s knowledge and took it to a newer level. Not only Scala can work the same way as her mother does, she can also make new ways of working and doing things for a specific job which makes her a valuable part of JVM. Scala gets a lot of suggestions to work for NET (another ports creation company) but she is too busy with JVM at the moment that makes this a little hard to accomplish.

Pierson PHP

phpPHP is 29 years old and Java’s bitter friend. PHP runs her own company in Devel City called Zendix and has become one of the worlds well known ladies because of her easy way of doing things, her adoption of new technologies and a large fun club that make her desirable and efficient.

PHP was a student of C, Java’s father and used to work with Perl where she got her expressive character and power. Being a very beautiful woman, PHP has a lot of admirers that range from newcomers to Devel city, to old residents. She might seem easy but she needs a lot of attention to master her ways.

Sometimes her affairs are too strong and sometimes people seem to glance at Java and Ruby which makes her trying to add some of Java’s charm into her character. This, makes a lot of people say that PHP tries to become Java in some way.

Recently, PHP was voted as the 3rd most popular person in Devel’s city Object’s awards.

Mary JavaScript

javascriptJavaScript is often confused with Java in Devel City especially from newcomers… but you know what they say that: “where no smoke without fire”. Many rumors say that JavaScript is Java’s half sister but she denies it, so does Java.

JavaScript is 32 and her close friends call her “JS”. She is very strict but relaxed also. This, makes her a wonderful companion for most of Devel’s residents and she is very popular since a large part of the city has used her services at least once.

JS is one of the most successful women in Devel City. She runs a network of more than 20 companies some of which are unique.  jQuerysius, Mootool and Dojodic, to name a few are popping out each and every day.

She works silently and a lot of people think that she spents most of her time to make her job look glamourus. Most of her competitors say that she is good only for that but, to be honest, all of them know that there are some things that only she can accomplish.

She believes that to become successful, you have to keep your friends close and, your enemies closer. So, she tries to cooperate and coexist with all other businessman and businesswoman in Devel City. Everybody loves her even if she breaks things up sometimes.

Angelina Ruby

rubyRuby is a good friend of Groovy. She is 20 years old and she is one of the upcoming names in Devel City mainly because of her professional maturity and the way she manages to do a job cleanly and fast. Although Scala, Groovy’s sister, got a big job from Ruby’s hands (case of Twittorix), Ruby is still considered as one of the best professionals out there.

Ruby, became one of the most successful women in City of Devel, after the creation of her Rails company  and got a lot of fame. She also inspired many other famous women in Devel City to start their own Rails-like companies with PHP being one of them with Symfoniac LTD.

She is a very calm person and not fond of surprises. When she works, she wants to have everything there as helpful as it can be for her and her co-workers. Most of the time she applies the POLS principle to her job.

Some Devel City residents state that, if Perl goes away one day, Ruby will do the job as good as she does and with more freedom than with Perl.

Ruby believes in one principle: “Divide and Conquer”, this is why she has divided all of her company groups into Gems. Ruby just needs to use a gem to do a particular job.

Jack Python

pythonOne of the most known and respected persons in Devel City, is Python. A 54 years old construction builder. Some people believe that he can use the power of his brain to do magic. Python works in a rather modern way that his age implies and here is where he amazes Devel’s residents.

Python always finds new ways of doing things. If a tool is good to work with, Python will use it with no particular disadvantages. Python is one of the best man in Devel to work with since he allows anyone to work the way he thinks is better.

His favorite words are spam and eggs and his projects are named after his nickname. For example PyGameing station and PyS6000 which was a futuristic TV series.

Python as his name implies, is a snakes lover and has a lot of them as pets. His favorite pet is an Anaconda.

His work has been approved by some of the biggest companies in Devel City like 10^10, Yohaaa and DERN.

bre indica, es un gran amante de las serpientes. Su mascota preferida es una serpiente de nombre Anaconda.

Visto en | Jeez
Visto en | MundoGeek

, , , , , , , , , ,

No hay Comentarios

Manifiesto por la defensa de los derechos fundamentales en Internet

Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de Internet manifestamos nuestra firme oposición al proyecto, y declaramos que:

ley2500x61

1.- Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.

2.- La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.

3.- La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.

4.- La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.

5.- Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.

6.- Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.

7.- Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.

8.- Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.

9.- Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.

10.- En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.

NOTA: Este manifiesto fue redactado de forma conjunta por periodistas, bloggers e internautas, en una larga sesión de debates (on line, por supuesto) durante la tarde-noche de ayer. Si estás de acuerdo, difúndelo en tu blog, tu web, en redes sociales y por todas las vías que puedas. Para aquellos que estéis interesados, existen versiones en inglés, catalán y gallego.

, , , ,

No hay Comentarios

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