Trapsy - rlip/java GitHub Wiki

Porównywanie stringów

    public static void main(String args[]){
        String s1 = "Ala";
        String s2 = "Ala";
        System.out.println(s1==s2); //wirtualna M.J. alokuje te same testy w tym samym miejscu pamięci, więc true
        System.out.println(s1.equals(s2)); //zwykłe porównanie wartości

        String s3 = s1;
        String s4 = new String("Ala");
        System.out.println(s3==s4); // false, bo new wymusza nowy obiekt, w innym miejscu pamięci
        System.out.println(s3.equals(s4)); //zwykłe porównanie wartości
    }

Przekazywanie obiektów

Pomimo tego że final, to coś w środku można zmienić! (-1 -1 -2 -2)

class Zmienna {
    Zmienna(int x) {
        this.x = x;
    }
    public int x;
}

public class Traps5 {
    static void metoda1(Zmienna z) {
        z.x = -1;  // z wskazuje na ten sam obiekt co ten wywołany więc może mu to zmienić
        z = null; // to nie zmieni obiektu a czy b, parametry są przekazywane przez wartość więc z to co innego
    }
    static void metoda2(final Zmienna z) {
        z.x = -2;
    }
    public static void main(String[] args) {
        Zmienna a = new Zmienna(1);
        final Zmienna b = new Zmienna(2);

        //instrukcja 1
        metoda1(a);
        System.out.print(a.x + " ");
        //instrukcja 2
        metoda1(b);
        System.out.print(b.x + " ");

        Zmienna c = new Zmienna(1);
        final Zmienna d = new Zmienna(2);

        //instrukcja 3
        metoda2(c);
        System.out.print(c.x + " ");
        //instrukcja 4
        metoda2(d);
        System.out.print(d.x + " ");
    }
}

Kopiowanie obiektów

        Punkt punkt1 = new Punkt(10, 10);
        Punkt punkt2 = punkt1;
        Punkt punkt3 = new Punkt(10, 10);
        boolean porownanie1 = punkt1==punkt2;
        boolean porownanie2 = punkt1==punkt3;

        System.out.println("Porownanie1: "+porownanie1); //true
        System.out.println("Porownanie2: "+porownanie2); //false

Można używać funkcji clone, ale tu trzeba uważać, że standardowo kopiuje ona tylko typy proste, a do pozostałych przepisuje referencje. Żeby wszystko skopiować trzeba w każdej klacie zawierającej jakieś obiekty nie proste nadpisać clonable i w niej skopiować te obiekty. Ale najlepiej nie używać clonable, tylko konstruktorów kopiących czy bardziej zaawansowanych klas.

Wyrażenia warunkowe

Wynikiem będzie 1.0 bo używając znaku zapytania jako porównania kompilator zmienia najpierw te liczby na typy proste, a potem zmienia na najogólniejszy dla obu czyli int na double

    public static void main(String args[]) {
        Random rand = new Random();
        boolean check = rand.nextBoolean();

        Number number = (check || !check)?
                new Integer(1) : new Double(2.0);

        System.out.println("Wynik: "+number);
    }

Zagadka operatora private

Wyświetli 2 razy true, bo w obrębie klasy możesz się odwoływać do pól prywatnych innej instancji tej samej klasy

public class Prywatka {
	private int x = 0;

	public Prywatka(int x) {
		this.x = x;
	}

	public boolean equal(Prywatka p) {
		return this.x == p.x;
	}

	public static void main(String[] args) {
		Prywatka a = new Prywatka(1);
		Prywatka b = new Prywatka(1);

		System.out.print(a.equal(b)+" ");
		System.out.print(a.x == b.x);
	}
}

double

Wynik to 0.8999999999999999, można zrobić System.out.printf("%.2f%n", x - y); lub użyć BigDecimal

public class JavaTraps004 {
	public static void main(String args[]) {
		double x = 2.0;
		double y = 1.1;
		System.out.println(x-y);
	}
}

URL -> URI

Tu wynik może być różny bo metoda URL.equals porównuje idiki, lepiej używać klasy URI

    public static void main(String args[]) throws MalformedURLException {
        Set set = new HashSet();
        set.add(new URL("http://wolnifarmerzy.com.pl"));
        set.add(new URL("http://zagubionawyspa.com.pl"));
        set.add(new URL("http://editor.javastart.pl"));
        set.add(new URL("http://google.pl"));

        System.out.println("Size: "+set.size());
    }