I / O
Потоки
new File(parent, child)
- if child = null => NullPointerException
- if parent = null => new File(child)
Текущая папка С:\parent\child
File file = new File("../file.txt");
file.getPath()
|
..\file.txt | то, что передали в метод |
file.getAbsolutePath() | C:\parent\child\..\file.txt | текущая папка+аргумент метода |
file.getCanonicalPath() | C:\parent\file.txt | нормальный логический путь |
Потоки
Thread.yield() - вызывает приостановку текущего потока, позволяя какому-то другому потоку начать выполнение. Yield переводится как уступить, выйти, передать выполнение.
threadObj.join() - текущий поток приостанавливается и ждет, пока threadObj не закончит выполнение. Выполнение текущего потока "присоединяется" к концу выполнения другого потока.
Основные методы класса Thread
Class c = new ArrayList<Integer>().getClass(); // yes
Class c = ArrayList<Integer>.class; // no
Создание объектов с '?' иногда возможно!
new TreeMap<String, ? super Integer>(); // no
class Test1 extends ArrayList<? extends Number> {} // no
class Test1 extends ArrayList<Set<? extends Number>> {} // YES !
new ArrayList<Set<?>>(); // YES !
class Test <T> {
T[] array = new T[7]; // no
T value = new T(); // no
List<T> list = new ArrayList<T>(); // yes
}
public class MyClass<T> // класс
public <T> void myMethod(T t) // метод
1) Класс не обязательно должен быть дженериком, чтобы в нем создать дженерик-метод.
2) Если класс объявлен как дженерик, то в объявлении метода можно опустить <T>.
Основные методы класса Thread
- public void run()
- public void start()
- public final void join() throws InterruptedException (3 overloaded methods)
- public static void sleep(long millis) throws InterruptedException (2 overloaded methods)
- public static void yield()
- public static Thread currentThread()
3 статичных метода, 2 бросают проверяемые исключения!
Некоторые методы класса Object
- public final void wait() throws InterruptedException (3 overloaded methods)
- public final void notify()
- public final void notifyAll()
Все методы не статические. Только 1 метод бросает проверяемое исключение!
Generics
List<? extends Number> - List<Integer>, List<Double> ...
List<? super Integer> - List<Integer>, List<Number>, List<Object>
List<? extends Number> - коллекция с extends доступна только для чтения! В такую коллекцию нельзя добавлять элементы, при попытке вызова метода add код даже не скомпилируется.
List<? super Number> - в коллекцию c super можно добавлять элементы.
List<? extends Integer> list = new ArrayList<Integer>(); for (Integer element : list) { System.out.println(element); } Integer first = list.get(0);
Для коллекции с extends в цикле for используется тип коллекции. Метод get также вернет объект типа коллекции.
List<? super Integer> list = new ArrayList<Integer>(); for (Object element : list) { System.out.println(element); } Object first = list.get(0);
Внимательно, так как для коллекции с super в цикле for используется не тип коллекции, а Object. Метод get также вернет Object.
Object set = new TreeSet<Integer>();
boolean flag = set instanceof NavigableSet<Integer>; // неправильно. в instanseof нельзя использовать параметризированный тип. Generic type information does not exist at runtime - it is for compile-time safety only.
boolean flag = set instanceof NavigableSet<?>; // верно!
List<? extends Number> - коллекция с extends доступна только для чтения! В такую коллекцию нельзя добавлять элементы, при попытке вызова метода add код даже не скомпилируется.
List<? super Number> - в коллекцию c super можно добавлять элементы.
List<? extends Integer> list = new ArrayList<Integer>(); for (Integer element : list) { System.out.println(element); } Integer first = list.get(0);
Для коллекции с extends в цикле for используется тип коллекции. Метод get также вернет объект типа коллекции.
List<? super Integer> list = new ArrayList<Integer>(); for (Object element : list) { System.out.println(element); } Object first = list.get(0);
Внимательно, так как для коллекции с super в цикле for используется не тип коллекции, а Object. Метод get также вернет Object.
Object set = new TreeSet<Integer>();
boolean flag = set instanceof NavigableSet<Integer>; // неправильно. в instanseof нельзя использовать параметризированный тип. Generic type information does not exist at runtime - it is for compile-time safety only.
boolean flag = set instanceof NavigableSet<?>; // верно!
Class c = new ArrayList<Integer>().getClass(); // yes
Class c = ArrayList<Integer>.class; // no
Создание объектов с '?' иногда возможно!
new TreeMap<String, ? super Integer>(); // no
class Test1 extends ArrayList<? extends Number> {} // no
class Test1 extends ArrayList<Set<? extends Number>> {} // YES !
new ArrayList<Set<?>>(); // YES !
class Test <T> {
T[] array = new T[7]; // no
T value = new T(); // no
List<T> list = new ArrayList<T>(); // yes
}
Различие List<?> и List<Object>
List<?> | List<Object> |
список элементов любого типа,
в таком списке нельзы вызывать add.
абсолютно идентично List<? extends Object>
|
только список Object,
в список можно добавлять
|
Wildcard ? means "many possibilities". If you do NOT see the question mark, then it means the <type> in the brackets, and absolutely NOTHING ELSE.
public class MyClass<T> // класс
public <T> void myMethod(T t) // метод
1) Класс не обязательно должен быть дженериком, чтобы в нем создать дженерик-метод.
2) Если класс объявлен как дженерик, то в объявлении метода можно опустить <T>.
Ссылки
https://nikojava.wordpress.com/2008/10/10/free-scjp-mock-exams/ - Хорошие тематические тесты. Понравились.