Java |
Операторы |
if( ... ) {}
else if( ... ) {}
else {}
while( true )
{
break;
continue;
}
do {} while( true );
for( int i=0; i < l; i++ ) {}
switch(i) {
case 1 : ...; break;
case 2 : ...; break;
case 3 : ...; break;
case 4 : ...; break;
default: ...;
}
|
Goto |
label1:
outer-iteration {
inner-iteration {
//...
break; // 1
//...
continue; // 2
//...
continue label1; // 3
//...
break label1; // 4
}
}
- 1, break прерывает внутреннюю итерацию и вы выходите во внешнюю итерацию.
- 2, continue перемещает к началу внутренней итерации.
- 3, continue label1 прерывает внутреннюю итерацию и внешнюю итерацию, все пути ведут к label1. Затем фактически продолжаются итерации, но начиная со внешней итерации.
- 4, break label1 также прерывает все пути к метке
label1, но не происходит повторного входа в итерацию. Реально происходит
прерывание обеих итераций.
|
Интерфейсы, классы, наследование |
interface I1 {
int i = 5; // static & final
void play();
}
abstract Class C2
{
private int m_var;
public C2()
{
m_var = 0;
}
public C2( int i )
{
m_var = i;
}
public void set(int v)
{
m_var = v;
}
// Абстрактный метод
abstract public void move();
}
public Class C1
extends C2
implements I1
{
private int m_t;
// Инициализация статических членов
private static IsaLocation log;
static
{
log = IsaLocation.getInstance( Z_Log.class.getName() );
}
// Вызов конструктора из конструктора
public C1()
{
this(10);
}
// Вызов конструктора базового класса
public C1( int i )
{
super(i);
m_t = i;
}
// Замещение метода C2
public void set(int v)
{
if( v > 5 ) super.set(v);
m_t= v;
}
// Реализация абстрактного метода C2
public void move()
{
m_t+=50;
}
// Реализация метода интерфейса I1
public void play()
{
System.out.println(m_t);
}
}
|
Определение типа объекта |
Статическое:
if(x instanceof Dog) ((Dog)x).bark();
Динамическое:
if(Dog.class.isInstance(x)) ((Dog)x).bark();
|
Создание класса по имени |
Создаеи массив классов и затем объектов этих классов:
try
{
Class[] petTypes = {
Class.forName("Dog"),
Class.forName("Pug"),
Class.forName("Cat"),
Class.forName("Rodent"),
Class.forName("Gerbil"),
Class.forName("Hamster"),
};
for(int i = 0; i < 15; i++)
pets.add(
petTypes[
(int)(Math.random()*petTypes.length)]
.newInstance());
}
catch(InstantiationException e) {
System.err.println("Cannot instantiate");
throw e;
} catch(IllegalAccessException e) {
System.err.println("Cannot access");
throw e;
} catch(ClassNotFoundException e) {
System.err.println("Cannot find class");
throw e;
}
Создаем класс и запрашивем его методы и конструкторы:
Class c = Class.forName(args[0]);
Method[] m = c.getMethods();
Constructor[] ctor = c.getConstructors();
|
Внутренние классы |
public interface Destination {
String readLabel();
}
public interface Contents {
int value();
}
Скрытие дополнительных методов класса:
public class Parcel3 {
private class PContents implements Contents {
private int i = 11;
public int value() { return i; }
}
protected class PDestination
implements Destination {
private String label;
private PDestination(String whereTo) {
label = whereTo;
}
public String readLabel() { return label; }
}
public Destination dest(String s) {
return new PDestination(s);
}
public Contents cont() {
return new PContents();
}
}
class Test {
public static void main(String[] args) {
Parcel3 p = new Parcel3();
Contents c = p.cont();
Destination d = p.dest("Tanzania");
// Незаконно - нельзя получить доступ к private классу:
//! Parcel3.PContents pc = p.new PContents();
}
}
Внутренние классы в методе и контексте:
public class Parcel4 {
public Destination dest(String s) {
class PDestination
implements Destination {
private String label;
private PDestination(String whereTo) {
label = whereTo;
}
public String readLabel() { return label; }
}
return new PDestination(s);
}
public static void main(String[] args) {
Parcel4 p = new Parcel4();
Destination d = p.dest("Tanzania");
}
}
Анонимный внутренний класс:
public class Parcel6 {
public Contents cont() {
return new Contents() {
private int i = 11;
public int value() { return i; }
}; // В этом случае требуется точка с запятой
}
public static void main(String[] args) {
Parcel6 p = new Parcel6();
Contents c = p.cont();
}
}
|
Константы |
Поскольку любое поле помещенное вами в интерфейс автоматически становится static и final,
то интерфейс, по сути, удобная штука для создания групп констант,
так же, как и enum в C или C++. К примеру:
public interface Months {
int
JANUARY = 1, FEBRUARY = 2, MARCH = 3,
APRIL = 4, MAY = 5, JUNE = 6, JULY = 7,
AUGUST = 8, SEPTEMBER = 9, OCTOBER = 10,
NOVEMBER = 11, DECEMBER = 12;
}
Иначе:
public class Z_Order
{
public static final int OL_OBJECT_ID = 0x0001;
public static final int OL_DISTRIB = 0x0002;
public static final int OL_DESCRIPTION_UC = 0x0004;
public static final String ATTR_DISTRIBUTORS = "distributors";
public static final String ATTR_DISTRIBUTOR_ID = "distributorId";
public static final String ATTR_ORDER_LIST = "ordercount";
}
|
Массивы |
class Weeble {}
public class IceCream {
// Массив констант
static String[] flav = {
"Chocolate", "Strawberry"
};
// Не инициализированный массив
Weeble[] b = new Weeble[5];
// Возвращаю массив
static String[] flavorSet(int n) {
String[] results = new String[n];
boolean[] picked =
new boolean[flav.length];
for (int i = 0; i < n; i++)
{
int t;
do
t = (int)(Math.random() * flav.length);
while (picked[t]);
results[i] = flav[t];
picked[t] = true;
}
return results;
}
}
Для манипуляции с массивом можно использовать класс java.util.Arrays:
int[] i = new int[25];
Arrays.fill(i, 47);
Для копирования массива метод System.arraycopy( ):
System.arraycopy(i, 0, j, 0, i.length);
Для поиска мотод Arrays.binarySearch( )
Arrays.sort(a);
int loc = Arrays.binarySearch(a, r);
Сортировка:
public class CompType implements Comparable {
int i; int j;
public CompType(int n1, int n2) {
i = n1; j = n2;
}
public int compareTo(Object rv) {
int rvi = ((CompType)rv).i;
return (i < rvi ? -1 : (i == rvi ? 0 : 1));
}
private static Random r = new Random();
private static int randInt() {
return Math.abs(r.nextInt()) % 100;
}
public static Generator generator() {
return new Generator() {
public Object next() {
return new CompType(randInt(),randInt());
}
};
}
public static void main(String[] args) {
CompType[] a = new CompType[10];
Arrays2.fill(a, generator());
Arrays.sort(a);
}
}
|
Сортировка |
public class Z_Dictionary
{
public String value;
public String text;
public Z_Dictionary(String v, String t)
{
value = v; text = t;
}
// Comparators
private static class TextComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
if(!(o1.getClass().equals(Z_Dictionary.class) &&
o2.getClass().equals(Z_Dictionary.class)))
{
return 0;
}
Z_Dictionary dic1 = (Z_Dictionary)o1;
Z_Dictionary dic2 = (Z_Dictionary)o2;
return dic1.text.compareToIgnoreCase(dic2.text);
}
}
public static Comparator getTextComparator()
{
return new Z_Dictionary.TextComparator();
}
}
Сортировка
:
java.util.ArrayList orders = new java.util.ArrayList();
orders.add(new Z_Dictionary("1","gf"));
orders.add(new Z_Dictionary("2","kk"));
Collections.sort(orders,Z_Dictionary.getTextComparator());
|
hashCode() |
public class CountedString {
private String s;
private int id = 0;
private static ArrayList created =
new ArrayList();
public CountedString(String str) {
s = str;
created.add(s);
Iterator it = created.iterator();
// Id - это полное число экземпляров
// строки, используемой CountedString:
while(it.hasNext())
if(it.next().equals(s))
id++;
}
public String toString() {
return "String: " + s + " id: " + id +
" hashCode(): " + hashCode() + "\n";
}
public int hashCode() {
return s.hashCode() * id;
}
public boolean equals(Object o) {
return (o instanceof CountedString)
&& s.equals(((CountedString)o).s)
&& id == ((CountedString)o).id;
}
public static void main(String[] args) {
HashMap m = new HashMap();
CountedString[] cs = new CountedString[10];
for(int i = 0; i < cs.length; i++) {
cs[i] = new CountedString("hi");
m.put(cs[i], new Integer(i));
}
System.out.println(m);
for(int i = 0; i < cs.length; i++) {
System.out.print("Looking up " + cs[i]);
System.out.println(m.get(cs[i]));
}
}
}
|
Контейнеры |
Создание типизированного контейнера
public class MouseList {
private ArrayList list = new ArrayList();
public void add(Mouse m) {
list.add(m);
}
public Mouse get(int index) {
return (Mouse)list.get(index);
}
public int size() { return list.size(); }
}
|
Collection
boolean add(Object) |
Гарантирует, что контейнер содержит аргумент.
Возвращает false, если не может добавить аргумент. (Это
“необязательный” метод описывается позже в этой главе.) |
boolean addAll(Collection) |
Добавляет все элементы аргумента. Возвращает
true, если любые элементы были добавлены.
(“Необязательно”) |
void clear( ) |
Удаляет все элементы контейнера.
(“Необязательно”) |
boolean contains(Object) |
true, если контейнер содержит
аргумент. |
boolean
containsAll(Collection) |
true, если контейнер содержит все
элементы аргумента. |
boolean isEmpty( ) |
true, если контейнер не имеет
элементов. |
Iterator iterator( ) |
Возвращает Iterator, который вы можете
использовать для обхода элементов контейнера. |
boolean remove(Object) |
Если аргумент присутствует в контейнере, один
экземпляр этого элемента будет удален. Возвращает true, если
произошло удаление. (“Необязательно”) |
boolean
removeAll(Collection) |
Удаляет все элементы, содержащиеся в
аргументе. Возвращает true, если произошло любое удаление.
(“Необязательно”) |
boolean
retainAll(Collection) |
Остаются только те элементы, которые
содержатся в аргументе (в теории множеств называется
“пересечением”). Возвращает true, если произошли любые
изменения. (“Необязательно”) |
int size( ) |
Возвращает число элементов контейнера. |
Object[] toArray( ) |
Возвращает массив, содержащий все элементы
контейнера. |
Object[] toArray(Object[] a) |
Возвращает массив, содержащий все элементы
контейнера, чей тип, скорее массив, а не простой Object (вы
должны привести массив к правильному
типу). |
|
List
List (интерфейс) |
Порядок - наиболее важная особенность для
List; он обещает, что элементы будут храниться в определенной
последовательности. List добавляет
несколько методов к набору Collection, которые позволяют
вставку и удаление элементов в середине списка List. (Это
рекомендуется только для LinkedList.) List производит
ListIterator, и, используя его, вы можете пройти весь
List в обоих направлениях, а также вставлять и извлекать
элементы из середины списка List. |
ArrayList* |
List реализуется массивом. Позволяет
быстрый доступ в случайном порядке к элементами, но медленный, когда
вставляются и удаляются элементы из середины списка.
ListIterator должен использоваться только для прямого и
обратного движения по ArrayList, но не для вставления и
удаления элементов, что является очень дорогим, по сравнению с
LinkedList. |
LinkedList |
Обеспечивает оптимальный доступ к
последовательности, который недорогой при вставках и удаленьях из
середины списка List. Относительно медленный при случайном
выборе элементов. (Используйте для этого ArrayList.) Также
имеются методы addFirst( ), addLast( ),
getFirst( ), getLast( ),
removeFirst( ) и removeLast( ) (которые не
определены во всех интерфейсах или базовых классах), позволяющие
использовать связанный список как стек, очередь и двойную
очередь. |
Type |
Get |
Iteration |
Insert |
Remove |
Массив |
1430 |
3850 |
нет |
нет |
ArrayList |
3070 |
12200 |
500 |
46850 |
LinkedList |
16320 |
9110 |
110 |
60 |
Vector |
4890 |
16250 |
550 |
46850 |
|
Set
Set (интерфейс) |
Каждый элемент, который вы добавляете в
Set, должен быть уникальным; в противном случае Set не
добавит дублирующий элемент. Object, добавляемый в
Set, должен определить equals( ) для установления
уникальности объектов. Set имеет точно такой же интерфейс,
что и Collection. Интерфейс Set не гарантирует
сохранение порядка следования элементов в определенной
последовательности. |
HashSet* |
Для Set, в которых важно время поиска.
Object должен определить
hashCode( ). |
TreeSet |
Упорядоченный Set поддерживаемый
деревом. Этим способом вы можете получить упорядоченную
последовательность из Set. |
Тип |
Тестовый размер |
Добавление |
Содержится |
Итерации |
|
10 |
138.0 |
115.0 |
187.0 |
TreeSet |
100 |
189.5 |
151.1 |
206.5 |
|
1000 |
150.6 |
177.4 |
40.04 |
|
10 |
55.0 |
82.0 |
192.0 |
HashSet |
100 |
45.6 |
90.0 |
202.2 |
|
1000 |
36.14 |
106.5 |
39.39 |
|
Map
Map (Интерфейс) |
Содержит ассоциированные пары ключ-значение,
так что вы можете производить поиск значения, используя
ключ. |
HashMap* |
Реализация, основывающая на хеш-таблице.
(Используйте это вместо Hashtable.) Обеспечивает постоянную
по времени производительность при вставлении и поиске пар.
Производительность может регулироваться конструктором, который
позволяет вам устанавливать емкость и коэффициент
загрузки хеш-таблицы. |
TreeMap
|
Реализация, основывающаяся на красно-черном
дереве. Когда вы просматриваете ключи или пары, они будут
упорядочены (определяется Comparable или Comparator,
будет обсуждаться позднее). Преимущество TreeMap в том, что
вы получаете результат отсортированным. TreeMap - это просто
Map с методом subMap( ), который позволяет вам
возвращать часть дерева. |
Тип |
Тестовый размер |
Put |
Get |
Iteration |
|
10 |
143.0 |
110.0 |
186.0 |
TreeMap |
100 |
201.1 |
188.4 |
280.1 |
|
1000 |
222.8 |
205.2 |
40.7 |
|
10 |
66.0 |
83.0 |
197.0 |
HashMap |
100 |
80.7 |
135.7 |
278.5 |
|
1000 |
48.2 |
105.7 |
41.4 |
|
10 |
61.0 |
93.0 |
302.0 |
Hashtable |
100 |
90.6 |
143.3 |
329.0 |
|
1000 |
54.1 |
110.95 |
47.3 |
|
Исключения |
Обработка исключений
Class Appl
{
public static void main(String[] s)
{
try{
}
catch( Exception e)
{
// выполняется при исклчении
}
finally
{
// выполняется всегда
}
}
Генерация исключений:
public String getLine(InputStreamReader isReader)
throws java.io.IOException,
java.text.ParseException
{
{
...
}
catch( java.io.EOFException eof )
{
break;
}
catch( Exception e )
{
throw new java.io.IOException("error",e);
}
}
Печать стека исключений:
public void Read()
{
try{
...
}
catch( Exception e )
{
Writer wr = new StringWriter();
PrintWriter str = new java.io.PrintWriter(wr);
e.printStackTrace(str);
str.flush();
log.error("Stack trace: " + wr.toString());
}
}
|
Хранение ссылок |
Библиотека java.lang.ref содержит множество классов, которые придают большую гибкость сборщику мусора, что особенно полезно, когда у вас есть огромные объекты, могущие стать причиной нехватки памяти. Есть три класса, наследованные от абстрактного класса Reference: SoftReference, WeakReference и PhantomReference. Каждый из них обеспечивает различный уровень обхода для сборщика мусора, если только рассматриваемый объект достижим через один из этих объектов Reference.
Вы используете объекты Reference когда хотите продолжить хранить в ссылке такой объект — вы хотите быть способны достигнуть объекта — но вы также хотите позволить сборщику мусора освободить такой объект. Таким образом, вы имеете способ перейти к использованию объекта, но если память истощится, это грозит вам тем, что объект будет освобожден.
public static void main(String[] args) {
int size =
10; //
или выберите размер через командную строку: if(args.length
> 0)
size = Integer.parseInt(args[0]);
SoftReference[] sa =
new SoftReference[size];
for(int i = 0; i < sa.length; i++) {
sa[i] = new SoftReference(
new VeryBig("Soft " + i), rq);
System.out.println("Just created: " +
(VeryBig)sa[i].get());
// вызов сборщика мусора
checkQueue();
}
|
Работа с файлами и потоками
|
Работа с архивами
|
Сериализация объектов |
Стандартная:
class Data implements Serializable {
private int i;
// запрет серилизации поля
private transient String password;
Data(int x) { i = x; }
public String toString() {
return Integer.toString(i);
}
}
public class Worm implements Serializable {
// Генерируется случайно значение типа int:
private static int r() {
return (int)(Math.random() * 10);
}
private Data[] d = {
new Data(r()), new Data(r()), new Data(r())
};
private Worm next;
private char c;
// Значение i == Номеру сегмента
Worm(int i, char x) {
System.out.println(" Worm constructor: " + i);
c = x;
if(--i > 0)
next = new Worm(i, (char)(x + 1));
}
Worm() {
System.out.println("Default constructor");
}
public String toString() {
String s = ":" + c + "(";
for(int i = 0; i < d.length; i++)
s += d[i].toString();
s += ")";
if(next != null)
s += next.toString();
return s;
}
// Исключение выбрасывается на консоль:
public static void main(String[] args)
throws ClassNotFoundException, IOException {
Worm w = new Worm(6, 'a');
System.out.println("w = " + w);
ObjectOutputStream out =
new ObjectOutputStream(
new FileOutputStream("worm.out"));
out.writeObject("Worm storage");
out.writeObject(w);
out.close(); // Также очищается вывод
ObjectInputStream in =
new ObjectInputStream(
new FileInputStream("worm.out"));
String s = (String)in.readObject();
Worm w2 = (Worm)in.readObject();
System.out.println(s + ", w2 = " + w2);
ByteArrayOutputStream bout =
new ByteArrayOutputStream();
ObjectOutputStream out2 =
new ObjectOutputStream(bout);
out2.writeObject("Worm storage");
out2.writeObject(w);
out2.flush();
ObjectInputStream in2 =
new ObjectInputStream(
new ByteArrayInputStream(
bout.toByteArray()));
s = (String)in2.readObject();
Worm w3 = (Worm)in2.readObject();
System.out.println(s + ", w3 = " + w3);
}
}
|
Собственная:
class Blip3 implements Externalizable {
int i;
String s; // Без инициализации
public Blip3() {
System.out.println("Blip3 Constructor");
// s, i не инициализируется
}
public Blip3(String x, int a) {
System.out.println("Blip3(String x, int a)");
s = x;
i = a;
// s & i инициализируются только в
// конструкторе не по умолчанию.
}
public String toString() { return s + i; }
public void writeExternal(ObjectOutput out)
throws IOException {
System.out.println("Blip3.writeExternal");
// Вы обязаны сделать это:
out.writeObject(s);
out.writeInt(i);
}
public void readExternal(ObjectInput in)
throws IOException, ClassNotFoundException {
System.out.println("Blip3.readExternal");
// Вы обязаны сделать это:
s = (String)in.readObject();
i =in.readInt();
}
public static void main(String[] args)
throws IOException, ClassNotFoundException {
System.out.println("Constructing objects:");
Blip3 b3 = new Blip3("A String ", 47);
System.out.println(b3);
ObjectOutputStream o =
new ObjectOutputStream(
new FileOutputStream("Blip3.out"));
System.out.println("Saving object:");
o.writeObject(b3);
o.close();
// Теперь получим обратно:
ObjectInputStream in =
new ObjectInputStream(
new FileInputStream("Blip3.out"));
System.out.println("Recovering b3:");
b3 = (Blip3)in.readObject();
System.out.println(b3);
}
}
|
Сериализация статических членов:
class Line extends Shape {
private static int color = RED;
public static void
serializeStaticState(ObjectOutputStream os)
throws IOException {
os.writeInt(color);
}
public static void
deserializeStaticState(ObjectInputStream os)
throws IOException {
color = os.readInt();
}
public Line(int xVal, int yVal, int dim) {
super(xVal, yVal, dim);
}
public void setColor(int newColor) {
color = newColor;
}
public int getColor() {
return color;
}
}
|
Сертификация кода
|
Установка Tomcat
|
Java Applet
|
RMI
|
JDBC
|
Thread
|
Ant
|