java 2

Von Oracle Certified Professional Java SE 8 Programmer 2 Study guide - Jeanne Boyarsky and Scott Selikoff

Von Oracle Certified Professional Java SE 8 Programmer 2 Study guide - Jeanne Boyarsky and Scott Selikoff


Set of flashcards Details

Flashcards 500
Language Deutsch
Category Computer Science
Level University
Created / Updated 03.03.2020 / 22.06.2022
Weblink
https://card2brain.ch/box/20200303_java_2
Embed
<iframe src="https://card2brain.ch/box/20200303_java_2/embed" width="780" height="150" scrolling="no" frameborder="0"></iframe>

Kann man instance of in verbindung mit generics verwenden?

Nein, dank der Typeerasure

Kann man einen primitiven Typen als Typeparameter für Generics verwenden?

Nein

Kann man generics bei methoden verwenden?

Ja, gerade bei statischen oft praktisch

Funktioniert das?:

public static T someMethod(T para) {return t;} 

Nein, das würde funktionieren:

public static <T> T someMethod(T par) {return par;}

Was passiert hier? 

class Dragon {}
class Unicorn { }
public class LegacyDragons {
public static void main(String[] args) {
List unicorns = new ArrayList();
unicorns.add(new Unicorn());
printDragons(unicorns);
}
private static void printDragons(List<Dragon> dragons) {
for (Dragon dragon: dragons) { // ClassCastException
System.out.println(dragon);
} } }

ClassCastException in der for-schleife

Compilerwarnung beim übersetzen: Line 9, unchecked call to add(e)...

Was passiert hier? 
1: public class LegacyAutoboxing {
2: public static void main(String[] args) {
3: java.util.List numbers = new java.util.ArrayList();
4: numbers.add(5);

5: int result = numbers.get(0);

6: }
7: }

Compiled nicht, java weiß nicht was in der Liste steckt (nur Object). Kein autounboxing von object in int möglich..

Was für Arten gibt es um generic wildcards zu nutzen?

  • unbounded wildcards  ->  ?
  • wildcards with upper bound  ->  ? extends type
  • wildcards with lower bound  -> ? super type

Funktioniert folgende Codezeile? Warum?

List<Object> l = new ArrayList<String>();

Nein, Java beschützt uns dabei vor runtimeexceptions (sonst könnten hier auch Strings o.Ä. hinzugefügt werden).

Bei Array geht das aber, die schmeißen dann zur Laufzeit eine ArrayStoreException! (Object[] o = new String[0];)

Compiled der code? Warum?

Integer[] numbers = { new Integer(42) } ;

Object[] objects = numbers;

objects[0] = "forty two";

Compiled, schmeißt aber ArrayStoreException zur Laufzeit.

Mit Listen würde er nicht compilen!  Bei Listen weiß Java den Type nicht zwingend (check generics), bei Arrays weiß Java den type

wie kann man folgenden Code umschreiben dass er compilied?:

public static void printList(List<Object> list) { 

  for(Object x : list) System.out.println(x);

}

public static void main(String[] args) {

  List<String> keywords = new ArrayList<>(); 

  keywords.add("java");

  printList(keywords);

}

public static void printList(List<?> list) {

  for (Object x: list) System.out.println(x);

}

Compiled das? Was wäre eine Alternative?

ArrayList<Number> list = new ArrayList<Integer>();

Nein, ein generischer Type kann nicht einfach eine Subklasse nutzen. Das compiled aber:

List<? extends Number> list = new ArrayList<Integer>(); 

Was bedeutet <? extends Number> ?

upper-bounded wildcard: Jede Klasse die Number extended or Number selber kann als Parametertype genutzt werden

Warum funktioniert der folgende code nicht?

static class Sparrow extends Bird {}

static class Bird {}

public static void main(String[] args) {

  List<? extends Bird> birds = new ArrayList<Bird>();

  birds.add(new Sparrow());

  birds.add(new Bird());

}

Java weiß nicht welcher Type List<? extends Bird> wirklich ist -> kann bspw. List<Bird> oder List<Sparrow> sein. Bird zu List<Sparrow> geht nicht und Sparrow zu List<Bird> nicht

interface Flyer { void fly(); }

class HangGlider implements Flyer { public void fly() {} }

class Goose implements Flyer { public void fly() {} }

Was kann den folgenden beiden Methoden als Parametertyp übergeben werden?

private void anyFlyer(List<Flyer> flyer) {}

private void groupOfFlyers(List<? extends Flyer> flyer) {}

List<Flyer> kann beiden Methoden übergeben. 

List<Goose> kann nur groupOfFlyers übergeben werden 

Funktioniert das? Warum?

List<String> strings = new ArrayList<String>();

strings.add("tweet");

List<Object> objects = new ArrayList<Object>(strings);

addSound(strings);

addSound(objects);

public static void addSound(List<?> list) { list.add("quack"); }

Nein, unbounded generics sind immutable

Funktioniert das? Warum?

List<String> strings = new ArrayList<String>();

strings.add("tweet");

List<Object> objects = new ArrayList<Object>(strings);

addSound(strings);

addSound(objects);

public static void addSound(List<? extends Object> list) { list.add("quack"); }

Nein, upperbounded generics sind immutable

Funktioniert das? Warum?

List<String> strings = new ArrayList<String>();

strings.add("tweet");

List<Object> objects = new ArrayList<Object>(strings);

addSound(strings);

addSound(objects);

public static void addSound(List<Object> list) { list.add("quack"); }

Nein, man kann kein List<String> übergeben weil generics nicht matchen

Funktioniert das? Warum?

List<String> strings = new ArrayList<String>();

strings.add("tweet");

List<Object> objects = new ArrayList<Object>(strings);

addSound(strings);

addSound(objects);

public static void addSound(List<? super String> list) { list.add("quack"); } 

Funktioniert, das was wir übergeben ist entweder String oder eine superklasse von string

Was hier compiliert, was nicht?:

1: List<? super IOException> exceptions = new ArrayList<Exception>();

2: exceptions.add(new Exception());

3: exceptions:add(new IOException());

4: exceptions.add(new FileNotFoundException());

2 compilet nicht, list könnte auch List<IOException> sein -> Exception würde hier nicht passen!

rest compiled, auch 4, hier sagt java: FileNotFoundException ist auch eine IOException also passt alles

Was davon compiled, was nicht?

class A {}

class B extends A {}

class C extends B {}

1: List<?> list1 = new ArrayList<A>();

2: List<? extends A> list2 = new ArrayList<A>();

3: List<? super A> list3 = new ArrayList<A>();

4: List<? extends B> list4 = new ArrayList<A>();

5: List<? super B> list5 = new ArrayList<A>();

6: List<?> list6 = new ArrayList<? extends A>();

list4 und list 6 compilen nicht. List6 weil bekannt sein mus welcher Typ von ArrayList insanziiert werden soll

Compiled der code? :

<T> <? extends T> method2(List<? extends T> list) {

   return list.get(0);

}

Nein, der returntype ist kein typ -> wildcard!

Compiled das?: 

<B extends A> B method3(List<B> list) {

  return new B();

}

Nein! <B extends A> sagt, dass man B als Typeparameter für diese Methode benutzen will. Allerdings ist B auch der name einer Klasse. Innerhalb der Methode kann B also verschiedene Klassen repräsentieren und deshalb kann man es nicht instanziieren

Compiled das?:

<X> void method123(List<X super B> list) {

}

Nein, versucht einen Methodenspezifischen type parameter mit einer wildcarde zu vermischen. Wildcards müssen ein ? beinhalten

Was sind die vier "Main"-Interfaces im Java collections framework?

  • List: ordered collections mit duplikaten
  • Set: collections ohne duplikate
  • Queue: Collection die elemente bpsw. in fifo anordnet
  • Map: key-value paare, keine duplicate key erlaubt (technisch keine Collection, wird aber dazugezählt) 

Was für Methoden gibt es in allen Collections?

  • add()
  • remove()
  • isEmpty()
  • size()
  • clear()
  • contains()

Wie ist die Signatur eine Collections-add() methode?

boolean add(E element)

Wie ist die signatur einer Collections-remove() methode?

boolean remove(Object object)

Wie ist die Signatur einer Collections.isEmpty() methode?

boolean isEmpty()

Wie ist die Signatur einer Collections.size() methode?

int size()

Wie ist die Signatur einer Collections.clear() methode?

void clear()

Wie ist die Signatur einer Collections.contains() methode?

boolean contains(Object object)

Was sind die Eigenschaften einer Collections.List ?

  • Duplicates Erlaubt
  • Geordnete Collection
  • Items können geholt/inserted an spezifischen positionen werden

Was ist der Vorteil einer ArrayList?

Elemente können in konstanter Zeit gesucht werden

Was ist bei einer Arraylist schneller: Adden/removen oder Accessing of an element?

Accessing ist schneller -> ArrayList top wenn man öfters list als schreibt

Was ist besonders an einer LinkedList?

Implementiert List und Queue -> zusätzliche Methoden um Elemente am Anfang/ende der liste hinzuzufügen/zu entfernen

Was sind die Hauptvorteile einer LinkedList?

Man kann accessen,adden, removen vom ende/anfang der liste in konstanter Zeit. 

Was sind die wichtigsten Methoden in Listen?

  • void add(E element)
  • void add(int index, E element)
  • E get(int index)
  • int indexOf(Object o)
  • int lastIndexOf(Object o)
  • int lastIndexOf(Object o)
  • void remove(int index)
  • E set(int index, E e)

Wann nutzt man das Set interface?

Wenn man keine duplicates möchte

Was ist der Vorteil einer HashSet? Wie funktioniert die?

Checking ob ein element in einem set ist und hinzufügen eines element zu einem set geht in konstanter Zeit. Funktioniert über die hashCode() methode

Was ist der Vorteil/Nachteil einer TreeSet?

Vorteil: immer sortiert. Nachteil: Hinzufügen/checken ob element da ist in O(log n)