public class Vertex1D {
private int x;
public Vertex1D(int x) {
this.x = x;
}
public int getX() {
return x;
}
}
...
Vertex1D v = new Vertex1D(1);
// x of value 1 cannot be changed anymore
public class Vertex1D {
private int x;
public Vertex1D(int x) {
this.x = x;
}
public int getX() {
return x;
}
}
...
Vertex1D v = new Vertex1D(1);
// x of value 1 cannot be changed anymore
Neměnný objekt vs. konstanta
Neměnný objekt vs. final
final
prakticky zakáže změnu odkazufinal
final Person p = new Person("Marek");
// p = new Person("Jan"); // cannot be done
p.setName("Haha I changed it"); // this works!
String
.String s = "Hello " + "World";
"Hello "
, "World"
a "Hello World"
.String
použít StringBuilder
, který je modifikovatelný (mutable), viz dále
Podívejme se na rozdíl "Hello"
a new String("Hello")
.
new String("Hello")
vytvoří pokaždé nový objekt
"Hello"
funguje na principu: jestli taký objekt zatím neexistuje, tak ho vytvořím, jinak vrátím odkaz na již existující objekt (uložen v paměti String constant pool)
String s1 = "Hello";
String s2 = "Hello";
boolean bTrue = (s1 == s2); // true, identical objects
s1 = new String("Hello");
s2 = new String("Hello");
boolean bFalse = (s1 == s2); // false, different objects though with same value
String
char charAt(int index)
— vráti prvek na daném indexustatic String format(String format, Object… args)
— stejné jako printf
v Cboolean isEmpty()
— vráti true
jestli je prázdnýint length()
— velikost řetězcematches
, split
, indexOf
, startsWith
…Více metod najdete v dokumentaci třídy String. |
StringBuilder
StringBuilder builder = new StringBuilder("Hello ");
builder.append("cruel ").append("world"); // method chain
builder.append("!");
String result = builder.toString();
StringBuilder
se průběžně modifikuje, přidáváme do něj další znakyStringBuilder
není thread safe, proto existuje její varianta StringBuffer
.int
, char
, double
, …Integer
, Character
, Double
, …
Při vytváření takových objektů není nutné používat new
,
Integer five = 5;
int alsoFive = five;
Integer objectInt = new Integer(42);
Integer objectInt2 = 42;
Wrappers (např. Double
) mají různé konstanty:
MIN_VALUE
je minimální hodnota jakou může double
obsahovatPOSITIVE_INFINITY
reprezentuje konstantu kladné nekonečnoNaN
je zkratkou Not-a-Number — dostaneme ji např. dělením nulydouble d = Double.MIN_VALUE;
d = Double.NEGATIVE_INFINITY;
Double
existuje static double parseDouble(String s)
— udělá ze String
číslo, z "1.0"
, vytvoří číslo 1.0
Integer
a další číselné typyint intValue()
převod double
do typu int
boolean isNaN()
— test, jestli není hodnotou čísloVíce konstant a metod popisuje javadoc. |
Integer
) mají od primitivních (int
) jednu hodnotu navíc — uhádněte jakou!null
Integer
je objektový typ, proměnná je odkaz na objektProč tedy vůbec používat primitivní typy, když máme typy objektové?
int i = 1
i
Integer i = 1
1
i
je pouze odkaz, je to (nepatrně) pomalejšíInteger
namísto int
může mít dopad na výkon
a zcela jistě zabere dost paměti, asi zbytečněint primitiveInt = 42;
Integer objectInt = primitiveInt;
primitiveInt = new Integer(43);
Integer i1 = 100; // between -127 and 128
Integer i2 = 100;
boolean referencesAreEqual = (i1 == i2); // true
i1 = 300;
i2 = 300;
boolean referencesNotEqual = (i1 == i2); // false
==
obvykle neporovnáváme (budeme se učit o equals
)./