Regular expression

import java.util.regex.*;
class RegTest{
public static void maint(String[]  args){
  Pattern p = new Pattern("ab");        // регулярное выражание
  Matcher m = p.matcher("abaaaba");  // текст
  while(m.find()){
    System.out.print(m.start() + " ");  // вывод: 0 4
  }
}
Примеры основных метасимволов:
  ^     - (крышка, цирркумфлекс) начало проверяемой строки
  $     - (доллар) конец проверяемой строки
  .     - (точка) представляет собой сокращенную форму записи для символьного класса, совпадающего с любым символом
  |     -  означает «или». Подвыражения, объединенные этим способом, называются альтернативами (alternatives)
  ?     - (знак вопроса) означает, что предшествующий ему символ является необязательным
  +     -  обозначает «один или несколько экземпляров непосредственно предшествующего элемента
  *     –  любое количество экземпляров элемента (в том числе и нулевое)
  \\d   –  цифровой символ
  \\D   –  не цифровой символ
  \\s   –  пробельный символ
  \\S   –  не пробельный символ
  \\w   –  буквенный или цифровой символ или знак подчёркивания
  \\W   –  любой символ, кроме буквенного или цифрового символа или знака подчёркивания

 Class Matcher
 boolean matches() просто указывает, соответствует ли вся входная последовательность шаблону.
 int start() указывает значение индекса в строке, где начинается соответствующая шаблону строка.
 int end() указывает значение индекса в строке, где заканчивается соответствующая шаблону строка плюс единица.
 String group() - возвращает найденную строку

 String group(int group) - если у Вас в регулярном выражении были группы, то можно вывести только кусочек строки соответствующей определенной группе.

Квантификаторы

+     - Одно или более (greed)
    - Ноль или более (greed)
?     - Ноль или одно (greed)
{n}   - Ровно n раз
{m,n} - От m до n включительно
{m,}  - Не менее m
{,n}  - Не более n

Теперь мы можем полностью понять регулярное выражение с самого первого примера: "^[a-z0-9_-]{3,15}$" .
Разберем её по кусочкам:
^ - начало строки
[a-z0-9_-] - символ который может быть маленькой латинской буквой или цифрой или символом подчеркивания.
{3,15} - предыдущий объект может повторяться от 3х до 15раз.

Serialization

class Cat implement Serializable {}
public class Test {
public static void main(String[] args){
   Cat cat = new Cat();
   try{
        FileOutputStream fos = new FileOutputStream("file1.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(cat);
        oos.close();

        FileInputStream fis = new FileInputStream("file2.ser");
        ObjectInputStream ois = new ObjectInoutStream(fis);
        cat = (Cat)  ois.readObject();
        ois.close();
        }
catch(Exception e) {}
       }
}
При десереализации конструктор не вызывается (но конструторы супер-классов вызываются если они не сереализированы). При сереализации коллекции или массива должны быть сереализованы все их элементы.
Static не сереализируется, всегда по дефолту.

Input / Output

File - абстракционное представление файла.
FileReader -класс, который используется для низкоуровневого (посимвольно) чтения с файла. Обычно обвертуется высокоуровневыми классами типа BufferedReader.
File f = new File("file.txt");
boolean newFile = f.createNewFile();
FileWriter - как FileReader, только для записи. Класс-обвертка - BufferdWriter.
try{
FileWriter fw = new FileWriter(f);
fs.write("abc");
fw.flush(); - гарантия что весь поток успел записатся в файл.
fs.close();
char[] charArray = new char[50];
FileReader fr = new FileReader(f);
int size = fr.read(charArray);
fr.close();
}
catch(IOException e) {
}
BufferedReader - на отмену от FileReader cчитывает сразу все данные с файла и хранит их в буфере. Есть дополнительніе методы, например, readLine.

BufferedReader br = new BufferedReader(fr);
String data = br.readLine();

BufferdWriter - на отмену от FileWriter записывает все данные при одном обращении к файлу.

String

String - immutable!!!!!!!!!!!!!!!!!!

String s =  "abc";  - помещает строку в пул. Можно применять оператор "==".

s = s.concat(" sda"); - помещает в пул еще две строки " sda" и "abc sda" (если s.concat(" sda")  s.replace('a', 'x') без присвоения, то новая строка потеряется в пуле).

String s = new String("abc"); - создает новую строку (обьект в не в пуле, а в обычном хипе. Но к этом еще появляется "abc" в пуле). Не использовать так как создается лишний обьект. Оператор "==" будет давать false.

StringBuilder - потоко незащищенный. (equals и hasCode не перезаписан)
StringBuffer - потоко защищенный. (equals и hasCode не перезаписан)
Используются, когда нужна делать много изменений в строке, чтобы не перегружать пул.

System.out.println(a + b + "sss" + a + b); // 10sss55
System.out.println((a + b) + "sss" + (a + b)); 10sss10/
public class Test138 
{ 
    public static void stringReplace (String text) 
    {
        text = text.replace ('j' , 'c'); /* Line 5 */
 //этот метод не сработает так String immutable ( "работает как примитив, а не по ссылке")   
} 
    public static void bufferReplace (StringBuffer text) 
    { 
        text = text.append ("c");  /* Line 9 */
    } 
    public static void main (String args[]) 
    { 
        String textString = new String ("java"); 
        StringBuffer textBuffer = new StringBuffer ("java"); /* Line 14 */
        stringReplace(textString); 
        bufferReplace(textBuffer); 
        System.out.println (textString + textBuffer);
//выведет javajavac 
    } 
}
String a = "newspaper";
a = a.substring(5,7);
char b = a.charAt(1);
a = a + b;
System.out.println(a); //app
public class Main {     
    public static void main(String[] args) { 
        String strA = "text"; 
        String strB = "text"; 
        strA += "1"; 
        strB += "1"; 
        System.out.println(strA == strB); 
        strA = "text1"; 
        strB = "text1"; 
        System.out.println(strA == strB); 
    } 
} //false true. При конкатенации строк создается strA = new StringBuilder().append(strA).append("1").toString(); Поэтому == никогда не будет работать! 

Assertion

Assertion применяется для отловки багов, можно включать или отключать. Не должно влиять на код.
assert true;  - ничего не выведет
assert false; - выведет assertion error
assert (x == 1);
assert (x == 1) : returnFunc(); - функция не может быть void.  Функция срабатывает в случае если первое выражение false. Используется для объяснения ошибки, обычно используется String. assert (x == 1) : "Not == 1"; Exception in thread "main" java.lang.AssertionError: Not ==1
Для включения: java –enableassertions MyClass или java –ea MyClass
Для выключения применяется da или -disableassertions.

public class Test 
{ 
    public void foo() 
    {
        assert false; /* Line 5 */
        assert false; /* Line 6 */
    } 
    public void bar()
    {
        while(true)
        {
            assert false; /* Line 12 */
        } 
        assert false;  /* Line 14 */
    } 
}
Будет compilation errror, из-за того что Line 14 unreachble. Должен быть break в while

Exception

Switch оператор

switch(ВыражениеДляСравнения) {
    case Совпадение1: 
     команда;
  break;
 case Совпадение2: 
     команда;
  break;
 case Совпадение3: 
     команда;
  break;
 default: 
     оператор;
     break;
}
  • Оператор switch отличается от оператора if тем, что может выполнять проверку только равенства, а оператор if может вычислять результат булева выражения любого типа.
  • Две константы case в одном и том же операторе switch не могут иметь одинаковые значения
  • Если не использовать break, тогда будет выводить все кейсы по порядку. В default break можно не писать.
  • В switch выражениях можно использовать только byte, char, short, int (обвертки также) или enum. Но в case можно использовать только примитивы byte, char, short, int, помечены как FINAL. В java 7, можно еще использовать STRING!!!
  • case аргумент должен быть final и инициализирован.

  • default (если нету совпадений) может находится где угодно.
 case 0, 1: j = 1; //ошибка компиляции. Case может иметь только один аргумент.