Tipos primitivos en Java

Tipos primitivos

Los tipos primitivos se dividen en:

  • Caracteres
    • char
    • String
  • boolean
  • Numéricos
    • Enteros
      • byte
      • short
      • int
      • long
    • Reales
      • float
      • double
  • Arrays

Los tipos primitivos se caracterizan por tener definidos un mismo tamaño en todas las plataformas (a diferencia del C / C++)

Los literales reales son de tipo double a menos que se incluya el sufijo F

3.14 no es del mismo tipo que 3.14F, el primero será double y el segundo float

Cuando se desea provocar una conversión se utiliza el operador cast

Tiene la siguiente sintáxis:

Usando el cast se pueden realizar aquellas conversiones que el compilador no realiza por defecto

En el ejemplo se ha realizado un casting del double 5.4 a int para guardarlo en la variable i

El resultado de esa operación será que el compilador tomará sólo la parte entera del double, es decir, guardará en i el valor 5

En la segunda operación del ejemplo se divide 5 entre 2, dicha operación devolvería su resultado como un double, pero si el resultado no tendría decimales, se guardaría como un entero

Al hacer un casting en el denominador, forzamos al compilador a que guarde el resultado de la división como un double aunque no tenga decimales

Hay que tener en cuenta, que un casting no corrige el error de división por 0, debe controlarse mediante el uso de excepciones

Wrappers

Un wapper es una envoltura que se aplica a un tipo primitivo concreto

Hay una clase wrapper asociada a cada tipo primitivo

En el ejemplo se han redefinido los wrappers para int (es Integer) y para double (es Double) para poder añadir los datos primitivos int y double en la clase Vector

Las clases Wrapper tienen una segunda funcionalidad

Se utilizan para ubicar todos aquellos servicios propios de los tipos primitivos que representan

Algunos métodos de wrappers importantes:

Wrappers
Integer Character
MAX_VALUE chaValue()
MIN_VALUE equals(Object)
Integer(int) getType(char)
Integer(String) isDigit(char)
byteValue() isIdentifierIgnorable(char)
doubleValue() isJavaIdentifierPart(char)
equals(Object) isJavaIdentifierStart(char)
floatValue() isJavaLetterOrDigit(char)
intValue() isLetter()
longValue() isLetterOrDigit(char)
parseInt(String) isLowerCase(char)
parseInt(String, int) isUpperCase(char)
shortValue() isWhitespace(char)
toBinaryString(int) toLowerCase(char)
toHexString(int) toString()
toOctalString(int) toUpperCase(char)
toString(int, int) toString(int, int)

Caracteres

Un carácter es un símbolo que sigue el estándar ASCII y que nos sirve para generar los textos de nuestros programas

Una cadena de caracteres es un array de caracteres que permiten guardar textos o frases

char

Es una letra que sigue el estándar ASCII y es la unidad menor de cadena

Su tamaño es de 8 bits

Su valor se podría considerar un entero pequeño ya que su rango es -128 a 127

Los valores char tienen asociada la clase Character

Se inicializa con comillas simples

En el ejemplo se inicializado la variable cad como cadena y como puede apreciarse se ha guardado el símbolo ASCII que corresponde a la letra a mayúscula

String

Los cadenas de caracteres no son un tipo primitivo

Sin embargo Java le ofrece unas clases especiales para su tratamiento

Las cadenas son objetos que se manipulan mediante las clases String y StringBuffer

Se usa String cuando la cadena no va a ser modificada

Se usa StringBuffer cuando se desea manipular la cadena

Se recomienda usar habitualmente String (al ser constantes) por ser más eficientes

Inicialización de un String

Las cadenas van entre comillas dobles y los carácter con comillas simples

Cuando el compilador encuentre un literal de cadena, creará un objeto String con el texto de la misma

En el ejemplo se han inicializado dos variables que podrían ser equivalentes

s1 se ha inicializado usando sólo las comillas dobles

s2 se ha inicializando el constructor de objetos de la clase String pasándole como argumento el valor con comillas dobles

Ambas inicializaciones son válidas y el contenido de las variables s1 y s2 será en ambas Hola

La única diferencia es que al ser objetos distintos, su referencia en memoria será también distinta

Métodos básicos

length

El método length devuelve el número de caracteres de una cadena

En el ejemplo se han pedido a dos cadenas de caracteres su número de caracteres

En la primera se han usado comillas dobles y en la segunda el objeto String s1 del ejemplo anterior

Las dos expresiones anteriores serian equivalentes, devuelven un entero con el número de caracteres de la cadena

charAt

El método charAt devuelve el carácter de la posición especificada

Si el argumento de charAt no es un número entre 0 y length – 1 se producirá una excepción

En el ejemplo se ha creado una función que dados un String str y el char busca, se busca el carácter en esa cadena y si se encuentra, el valor de retorno será mayor que 0

Para lograrlo se ha usado el método charAt al que se le ha pasado el valor de i que representa la posición de carácter leído hasta el momento

Como devuelve el carácter leído en ese momento hemos podido compararlo con el carácter busca que nos pasaron como argumento

Métodos de búsqueda

Los métodos para realizar búsquedas en cadenas devuelven la posición del elemento buscado o -1 si no se ha encontrado:

  • indexOf(int ch)
  • indexOf(int ch, int start)
  • indexOf(String str)
  • indexOf(String, int start)
  • lastIndexOf(int ch)
  • lastIndexOf(int ch, int start)
  • lastIndexOf(String str)
  • lastIndexOf(String str, int start)

En el ejemplo se ha usado cada uno de los métodos y se ha comentado su valor devuelto para poder comprenderlos mejor

Comparación de cadenas

Para comparar cadenas no sirve el operador ==, ya que en realidad estamos comparando objetos

La clase String tiene varios métodos para comparar cadenas

Dos cadenas serán iguales si tienen la misma longitud y los mismos caracteres Unicode (a y á son distintos)

Los métodos más habituales son:

  • equals
  • equalsIgnoreCase

    distingue entre mayúsculas y minúsculas

  • compareTo

    además de permitir averiguar si dos cadenas son iguales, también nos dice cual es mayor de las dos:

    • Igual a 0

      Eran iguales

    • Mayor que 0

      El segundo valor era mayor

    • Menor que 0

      El segundo valor era menor

En el ejemplo se ha usado cada uno de los métodos y se ha comentado su valor devuelto para poder comprenderlos mejor

Métodos para comparar prefijos y sufijos

  • boolean starsWith(String)
  • boolean starsWith(String, int start)
  • boolean endsWith(String)

En el ejemplo se ha usado cada uno de los métodos y se ha comentado su valor devuelto para poder comprenderlos mejor

Extracción de cadenas

Hay una serie de métodos que devuelven una nueva cadena que resulta de manipular la cadena original

La cadena original no se modifica (se crea una nueva instancia de la cadena, es decir, se usa otra posición de memoria)

  • String concat(String)
  • String replace(char, char)
  • String replaceAll(String, String)
  • String substring(int start)
  • String substring(int start, int end)
  • String toLowerCase()
  • String toUpperCase()
  • String trim()

En el ejemplo se han usado algunos de los métodos y se ha comentado su valor devuelto para poder comprenderlos mejor

Conversiones de cadenas

Los tipos primitivos se pueden convertir automáticamente a cadenas

Para convertir las cadenas en tipos primitivos hay que utilizar alguna de las siguientes funciones:

  • boolean new Boolean(String).booleanValue()
  • int Integer.parseInt(String)
  • long Long.parseLong(String)
  • float Float.parseFloat(String)
  • double Double.parseDouble(String)

Otros métodos

  • char[] toCharArray()
  • void getChars(int srcBegin, int srcEnd, char[] dest, int destBegin)
  • int hashCode()
  • String valueOf(boolean)
  • String valueOf(int)
  • String valueOf(long)
  • String valueOf(float)
  • String valueOf(double)
  • String[] split(String)

Como puede verse en el ejemplo, usaremos split para trocear cadenas usando un token, en este caso hemos usado el espacio

Este método es bastante útil para trabajar con ficheros de texto en formato CSV, ya que se suele utilizar el símbolo ; (u otro símbolo de token) para separar las distintas columnas o celdas

StringBuffer

Aunque la clase String es la más habitual no es la adecuada para cadenas que deben modificarse frecuentemente

En el ejemplo se crean cuatro objetos String de los cuales sólo uno va a ser usado, admiracion1 o admiracion2

La clase StringBuffer permite modificar la cadena original sin necesidad de crear objetos intermedios como se hizo en el ejemplo

Inicialización de un StringBuffer

Admite los siguientes constructores:

  • StringBuffer()
  • StringBuffer(int i)
  • StringBuffer(String str)

Métodos de modificación

Admite los siguientes métodos de modificación:

  • append(Objetc obj)
  • append(String str)
  • append(char str[] )
  • append(boolean b)
  • append(int i)
  • append(long l)
  • append(float f)
  • append(double d)
  • append(char ch)
  • insert(int offset, Object obj)
  • insert(int offset, String str)
  • insert(int offset, char str[] )
  • insert(int offset, boolean b)
  • insert(int offset, int i)
  • insert(int offset, long l)
  • insert(int offset, float f)
  • insert(int offset, double d)
  • insert(int offset, char ch)
  • setCharAt(int index, char c)
  • setLength(int longitud)

En el ejemplo se han usado algunos de los métodos y se ha comentado su valor devuelto para poder comprenderlos mejor

Métodos básicos

length

Es similar al de String

charAt

Es similar al de String

toString

Realiza la conversión del BufferString a un String

Operador +

Java permite la concatenación de cadenas mediante el +

En el ejemplo, internamente el compilador utiliza un StringBuffer en vez de un String

Por lo que este ejemplo es totalmente compatible con el anterior

En el ejemplo hemos concatenado la cadena con otro tipo (entero), este último se convierte automáticamente a cadena (el compilador invoca implícitamente el método toString() de la clase StringBuffer)

boolean

Su tamaño es de 1 bit

Su valor se podría considerar un entero pequeño ya que su rango es 0 a 1

Siendo el valor 0 igual a FALSE y 1 igual a TRUE

Los valores boolean tienen asociada la clase Boolean

Métodos básicos

booleanValue

Devuelve el valor del booleano

toString

Convierte el tipo booleano a una cadena

Numéricos

Son todos los tipos que permiten trabajar con números y se pueden distinguir según si son enteros o decimales o según su precisión

Enteros

Son todos los tipos que permiten trabajar con números enteros, hay varios tipos según su precisión y el rango de números que pueden llegar a manejar

byte

Su tamaño es de 8 bits

Su valor se podría considerar un entero pequeño sin signo ya que su rango es 0 a 255

Los valores byte tienen asociada la clase Byte

short

Su tamaño es de 16 bits

Su valor se podría considerar un entero sin signo ya que su rango es 0 a 65535

Los valores short tienen asociada la clase Short

int

Su tamaño es de 16 bits

Su valor se podría considerar un entero con signo ya que su rango es -32768 a 32767

Los valores int tienen asociada la clase Integer

long

Su tamaño es de 32 bits

Su valor se podría considerar un entero grande ya que su rango es -2147483648 a 2147483647

Los valores long tienen asociada la clase Long

Reales

Son todos los tipos que permiten trabajar con números decimales, hay varios tipos según su precisión y el rango de números que pueden llegar a manejar

float

Su tamaño es de 32 bits

Su valor se podría considerar un decimal pequeño ya que su rango es 3,4E-38 a 3,4E+38

Los valores float tienen asociada la clase Float

double

Su tamaño es de 64 bits

Su valor se podría considerar un decimal grande ya que su rango es 1,7E-308 a 1,7E+308

Los valores double tienen asociada la clase Double

Arrays

Un array es una agrupación de elementos del mismo tipo

Los arrays en Java se caracterizan por ser objetos

Por tanto, se necesitará una referencia para manipularlos

En el ejemplo podemos ver que como cualquier otro objeto, se inicializa con new

Para acceder a los elementos del array se usa la notación clásica de arrays (usando un índice)

Si no se especifica el valor máximo del indice, el compilador lo tomará como un array dinámico

Se puede considerar que la notación es equivalente a enviar un mensaje al array para consultar un elemento o modificarlo

El rango de un array está entre 0 y N-1 (siendo N el tamaño del array)

Si se accede a una posición fuera de rango se producirá una excepción

En el ejemplo hemos inicializado el array a para luego poder visualizar todo su contenido por pantalla

Como puede verse, Java permite inicializar el array en su declaración

El operador length permite averiguar el tamaño de un array

En el ejemplo hemos inicializado un array de referencias en su declaración

Como puede verse, ambas declaraciones son equivalentes

Arrays bidimensionales

Un array bidimensional puede tener varias filas, y en cada fila no tiene por qué haber el mismo número de elementos o columnas

En el ejemplo hemos declarar e inicializado la matriz bidimensional de doubles matriz para luego recorrerla y visualizarla por pantalla

La primer fila tiene cuatro elementos {1,2,3,4}

La segunda fila tiene dos elementos {5,6}

La tercera fila tiene seis elementos {7,8,9,10,11,12}

La cuarta fila tiene un elemento {13}

matriz.length nos proporciona el número de filas que en este caso es

matriz[i].length nos proporciona el número de elementos en cada fila

Mostramos los elementos de una fila separados por un tabulador usando la función print

Una vez completada una fila se pasa a la siguiente mediante println

Ejemplo de matriz identidad

Para mostrar la potencia de una matriz bidimensional, en este ejemplo se va a construir una matriz identidad de dimensión 4

Una matriz identidad es aquella cuyos elementos son ceros excepto los de la diagonal principal, i = = j, que son unos

Mediante un doble bucle for recorremos los elementos de la matriz especificando su fila i y su columna j poblando la matriz con 1 o 0 en función de si coincide i y j

Mediante un doble bucle for recorremos los elementos de la matriz especificando su fila i y su columna j

Mostramos los elementos de una fila separados por un tabulador usando la función print

Una vez completada una fila se pasa a la siguiente mediante println