Comparando Strings

Para comparar Strings, es recomendable usar (o más bien es lo que se debe usar) el método equals, pero es probable que nunca hayas usado una expresión como esta:



public static void main(String[] args) {
String a = "Hola";
if("".equals(a)) {
System.out.println("El String es vacío");
}
}


A decir verdad no tiene mucha gracia, sólo estamos llamando al método equals de la clase String, de un String que se encuentra entrecomillado pero esto tiene algunas ventajas, cómo por ejemplo crear un if para validar si una entrada del usuario es vacía, pero ¿Dónde está la ventaja?.

Bien si tuviesemos un String a y queremos ver que es vacío la comparación sería muy simple:




if(a.equals("") {
System.out.println("El String es vacio");
}

Pero también debemos validar que el String no sea null, ya que si por ejemplo lo estamos recuperando en un Servlet, si el parámetro no fue enviado, el String es null, entonces nuestra comparación debería quedar así:

if(a!=null && a.equals("")) {
System.out.println("El String es vacio");
}
Con está ultima modificación, asumiremos que el compilador es capaz de reconocer que si la primera condición se cumple, no ejecutará nada más y no arrojará un excepción, pero dado que eso sería asumir algo (que en realidad si lo hace así), la comparación deberá quedar algo así:

 public static void main(String[] args) {
String a = "Hola";
if(a!=null){
if(a.equals("") {
System.out.println("El String es vacío");
}
}

}
Sin embargo ese problema se puede resolver facilmente así:

public static void main(String[] args) {
String a = null;
if("".equals(a)) {
System.out.println("El String es vacío");
}
}

Copia de Arreglos

Los arreglos son una forma importante de salvar datos. En caso de que tengamos que realizar una copia de arreglos podemos realizarlo de esta manera.

public class Copy(){  
int[] array = new int[55555];
}

public int[] copyArray(){
int[] arrayCopy = new int[array.length];
for( int i = 0; i < array.length; i++ )
arrayCopy[i] = array[i];
return arrayCopy;
}


Para cada posición copiamos el valor de un arreglo al otro, esta es una manera pero existe una mejor y más sencilla. Para eso revisaremos la documentación ( API documentation ); Existe en la clase System un método llamado arraycopy.

public static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length)

Este método es nativo, por lo que la copia se hará en segmento de memoria haciendola más rápida. Este método nos da la posibilidad de copiar también segmentos del arreglo original.

System.arraycopy(array, 5, array, 0, array.length-5);

Copiando desde la posición 5 del arreglo

Bibliography:

Dactonta, Michael C; Monk, Eric; Keller Paul, Java Pitfalls, Wiley 2000;


Crear un cronómetro

Java es uno de los lenguajes de programación más utilizados o por lo menos de los mas famosos. Una de sus debilidades es la velocidad de ejecución (que ha ido mejorandose) y el consumo de memoria RAM,

Para poder realizar los famosos "benchmarks" lo que podemos medir es el tiempo de ejecución, esto lo podemos realizar a través de una clase que simulará un cronómetro.

public class Stopwatch {
private long startTime = -1;
private long stopTime = -1;
private boolean running = false;

public Stopwatch start(){
startTime = System.currentTimeMillis();
running = true;
return this;
}

public Stopwatch stop(){
stopTime = System.currentTimeMillis();
running = false;
return this;
}

public Stopwatch reset(){
startTime = -1;
stopTime = -1;
running = false;
return this;
}

public long getElapsedTime(){
if(startTime == -1)
return 0;
else if(running)
return System.currentTimeMillis() - startTime;
else
return stopTime - startTime;
}
}


Para poder utilizar esta clase sólo debemos crear una instancia, y llamar a los métodos necesarios.

Ejemplo:


public static void main(String[] args){
Stopwatch timer = new Stopwatch().start();
long total = 0;
for(int i = 0; i Integer.MAX_VALUE; i++){
total +=i;
}
System.out.println(timer.getElapsedTime());
}

Hola, Soy Zabdiel

Hola a todos, el motivo de este post es poder presentarme, soy Zabdiel estudiante de ITC (Ingeniería en Tecnologías Computacionales ) estudio mi 8vo semestre.

El objetivo de este blog es el poder poner tutoriales y tips que ayuden a allgunos problemas que nosotros mismos hemos tenido y que nos hubiera gustado tener un lugar donde buscar el cómo resolverlos. Así que esperamos sus comentarios y dudas.

Paso de Parámetros en java: Por Valor

Parámetros por Valor.

Se utiliza cuándo se requiere pasar el valor de una variable a una función y que está realize alguna operación sobre ese Valor, la función o método crea una Variable Local y trabaja sobre ella.

int a=5;
metodo(a):


void metodo(int c) {
 System.out.println(c);
}

La variable c, es una variable local y que recibe una copia del valor de la variable a, es decir se pasa el parámetro por valor.

Paso por Referencia.

El paso por referencia en vez de mandar el valor de la variable, se mánda la dirección de memoria en la que se encuentra almacenada, para de está manera modificar el contenido de la variable. Sin embargo este tipo de paso de parámetros en Java no existe pero si lo quisieramos hacer en C++ sería algo así:


include
using namespace std;

void funcion(int &a) {
 a = 10;
}


int main() {
 int var = 5;
 funcion(&var);
 cout <<>
}

El resultado de la ejecución sería, 10 ya que la variable 10 se pasa por referencia y la función modifica su valor.


Ahora regresando a lo importante ¿Cómo pasa los parámetros Java? En java sólo existe una forma de hacerlo y con el paso de parámetos por valor, aquí dejo un ejemplo de esto:

public class PasoPorValor {

 public static void main(String [] args) {
  int a = 20;
  metodo(a);
  System.out.println(a);

 }

 public static void metodo(int c) {
  c = 10;
 }

}

El valor de la variable a siempre es el mismo. Ahora veamos un ejemplo utilizando objetos, en este caso utilizaré un arreglo, ya que por definición los arreglos son objetos:

public class PasoPorValor {

 public static void main(String [] args) {
  int[] a = new int[1]; //declaramos un arreglo de una posición;
  metodo(a);
  System.out.println(a[0]);

 }

 public static void metodo(int[] c) {
  c[0] = 10;
 }


}

Pero que ocurrió!!! Por qué cambió el valor mi objeto? En realidad esto ocurre por la sencilla razón de que en Java las variables que apuntan a objetos, no son el objeto, sino una referencia al él, es decir en Java cuando hacemos esto:

int[] a = new int[1]; 

Estamos creando una referencia que tiene cómo identificador a y que el tipo de datos al que hace referencia es un arreglo de int y además ahí mismo con el operador new se crea el objeto, y por lo tanto la variable a, hará referencia a la locación de memoria de ese objeto.

Entonces cuándo el método recibe la referencia y lo modifica, estamos modificando el valor del objeto, pero ojo, esto no quiere decir que Java pase parámetros por referencia, sino que PASA EL VALOR DE LA REFERENCIA 

Si Java pasara valores por referencia cuándo hacemos esto:

public class PasoPorValor {

 public static void main(String [] args) {
  String a = "Hola";
  metodo(a);
  System.out.println(a);

 }

 public static void metodo(String c) {
  c = "Nuevo Objeto";
 }


}

El resultado debería ser "Nuevo Objeto" Sin embargo esto no sucede por la simple y sencilla razón de que Java sólo pasa parámetros por valor


Espero con esto quede un poco más claro cómo pasa los parámetros Java

Saludos

Hola, me llamo Gustavo!

Hola, me llamo Gustavo Villegas, tengo 19 años casi 20, Estudio la Carrera de Ingeniería en Tecnologías Computacionales en el Tec de Motnerrey acabo de terminar 5to semestre y pss yo creo que se puede decir que voy en 6to. Me gustan las computadoras, programar , creo que soy un poco Geek, pero leve no mucho jaja. Además a eso también me gustan mucho los coches, en particular los "american muscle". Antes solía ser un poco más fan de los videojuegos, pero pues la verdad es que ultimamente les he perdido el gusto y sobre todo el tiempo, además de no tener dinero para un PS 3 :(

Bueno pues aquí estaré posteando cada que se pueda, para dar uno que otro tip de software alguna noticia etc... y estar dando ese tipo de información, consejos o tutoriales que se suele dar en un Blog. En particular el que área que me interesa en la actualidad es la Programación en Web, aunque también me gustan otras cosas de la programación en general. Sé programar en Java (es lo que digamos que de alguna forma soy menos ignorante jaja) también tengo algunos otros pequeños conocimientos aunque muy poco en PHP, ASP.NET, ASP (El viejito) , C#, C++, C y "HASKELL". Y también sé algunas cosas de las estándar que se saben para web, HTML, JavaScript, XML, JSON etc...

Estaré escribiendo este Blog junto con mis compañeros de la escuela (hasta ahora) Zab (8vo) y Ger (6to, de mi generación) y pss espero te sea de ayuda. Si tienes alguna duda con todo gusto me puedes enviar un correo y si te puedo ayudar con todo gusto lo haré. Y pues a decir verdad, no creo que muchas personas lean esto, pero si algún día este blog crece y tiene más visitas espero lo leas jajajaja.

Saludos
Gus!!!