In search this blog

Loading

piątek, 23 września 2011

String, I/O, Serialization, formatowanie


String, StringBuffer, StringBuilder

  • Obiekt typu String jest obiektem niezmiennym, zaś zmienna referencyjna wskazująca na String jest zmienna
  • Jeżeli utworzysz nowy obiekt String'a bez przypisania do niego referencji, będzie on stracony dla naszego programu
  • Jeżeli zmienisz referencje na nowy obiekt String'a, ten stary może zostać stracony
  • Metody String'a używają indeksu bazującego na 0, z wyjątkiem 2 argumentu metody substring()
  • Klasa String jest final więc jej metody nie mogą być nadpisywane
  • Kiedy JVM znajdzie String'a, dodaje go do puli String'ów
  • String posiada metodę length(); tablice posiadają atrybut o nazwie length
  • API dla StringBuffer'a jest takie samo jak dla StringBuilder'a, z wyjątkiem że metody StringBuffer'a są synchronizowane, więc klasa jest bezpieczniejsza w użyciu z wątkami, ale za to wolniejsza
  • Metody StringBuilder'a powinny być szybsze niż metody StringBuffer'a
  • Niżej wymienione punkty tyczą się obydwu klas
    • Obiekty tych klas są zmienne, czyli mogą się zmieniać bez tworzenia nowego obiektu
    • Metody działają na obiekt na którym są wywoływane, i obiekt się zmienia bez konieczności przypisywania mu nowej wartości
    • metoda equals() nie jest nadpisywana, i nie porównuje wartości
      1. StringBuffer sbff = new StringBuffer("dupa");  
      2. StringBuffer sbff1 = new StringBuffer("dupa");  
      3. System.out.println(sbff.equals(sbff1)); // false  
      4. StringBuilder sb = new StringBuilder("dupa");  
      5. StringBuilder sb1 = new StringBuilder("dupa");  
      6. System.out.println(sb.equals(sb1)); // false  
      7. System.out.println(sb.equals(sbff)); // false  
  • Należy pamiętać, że metody połączone w łańcuch działają od lewej do prawej
  • Metody String'a jakie należy zapamiętać: charAt(), concat(), equalsIgnoreCase(), length(), replace(), substring(), toLowerCase(), trim()
  • Metody StringBuffer'a i StringBuilder'a do zapamiętania : append(), delete(), insert(), reverse(), toString()

File I/O

  • klasy które należy zrozumieć w pakiecie java.io to: File, FileReader, BufferedReader, FileWriter, BufferedWriter, PrintWriter, Console
  • Tworząc nowy obiekt klasy File nie oznacza że tworzy się nowy plik na HD
  • Obiekty klasy File reprezentować mogą zarówno plik jaki folder
  • Klasa File pozwala na zarządzanie plikami lub folderami (dodawać, zmieniać nazwę, kasować)
  • Metody craeteNewFile(), mkdir() dodają wpisy(plik, katalog) do twojego systemu
  • FileWriter, FileReader są klasami niskiego poziomu z pakietu klas I/O, można ich używać do czytania lub zapisywania do pliku, ale zazwyczaj powinny być one opakowywane
  • Klasy w pakiecie java.io są zaprojektowane tak aby mogły być łączone w łańcuchy lub opakowywane (jest to powszechnie używane przy stosowaniu wzorca dekoratora)
  • Zazwyczaj do opakowywania używa się klas BufferedReader do opakowywania FileReader lub BufferedWriter do opakowywania FileWriter aby uzyskać wyższy poziom i mieć dostęp do wygodniejszych metod
  • PrintWriter może być używane do opakowywania innych Writer, ale od Javy 5 mogą one być budowane bezpośrednio z File, String
  • Java 5 PeintWriter maja nowe metody append(), format(), printf()
  • Obiekt Console może czytać ciągi znaków zwane non-echoed i jest tworzony przy pomocy statycznej metody System.console()

Serialization

  • Wszystkie klasy które musimy zrozumieć znajdują się w pakiecie java.io wliczają się w to głównie ObjectOutputStream, ObjectInputStream i FileOutputStream, FileInputStream ponieważ będziemy ich używać do tworzenia niskiego poziomu strumieni zwłaszcza klasy ObjectXxxStream
  • Klasa musi implementować interfejs Serializable aby obiekty klasy mogły być serializowane
  • ObjectOutputStraem.writeObject() metoda serializuje obiekty, natomiast ObjectInputStream.readObject() metoda używana do deserializacji obiektów
  • Jeżeli oznaczymy zmienną klasową jako transient, zmienna ta nie będzie poddana serializacji nawet jeśli reszta tego obiektu będzie
  • Można uzupełnić automatyczny proces serializacji klasy poprzez implementacje metod writeObject(), readObject(). Jeśli to zrobimy, osadzone metody defaultWriteObject(), defaultReadObject(), odpowiednio będzie się odnosić do części serjalizacji która odbywa się w normalny sposób.
    1. private void writeObject(ObjectOutputStream os){  
    2.     throws IOException {  
    3.           try{  
    4.              os.defaultWriteObject();  
    5.              // code  
    6.           }catch(Exception e){  
    7.               e.printStackTrace();  
    8.           }  
    9.     }  
    10. }  
    11.   
    12. private void readObject(ObjectInputStream is){  
    13.     throws IOException, ClassNotFoundException {  
    14.           try{  
    15.              is.defaultReadObject();  
    16.              // code  
    17.           }catch(Exception e){  
    18.               e.printStackTrace();  
    19.           }  
    20.     }  
    21. }  
  • Jeżeli nad klasa implementuje interfejs Serializable, to jej podklasy automatycznie też
  • Jeśli nad klasa nie implementuje Serializable, i kiedy obiekt podklasy jest deserializowany, to konstruktor nad klasy będzie wywołany, wraz z jego konstruktorami
  • Zmienne statyczne nie są poddawane serializacji

Daty, Liczby, Waluta

  • Klasy które musimy zrozumieć to java.util.Date, java.util.Calendar, java.text.DateFormat, java.text.NumberFormat, java.util.Locate
  • Większość metod z klasy Date to metody już przestarzałe i nie zaleca się ich używania
  • Data jest przechowywana w type long, jest to liczba milisekund od 1-go stycznia, 1970
  • Obiekty klasy Date są łącznikiem pomiędzy klasami Calendar and Locate
  • Klasa Calendar zapewnia użyteczny zestaw metod do manipulowania datą, dostarczając takich usług między innymi jak pobieranie ilości dni tygodnia, lub też dodania jakiejś liczby miesięcy lub lat
  • Obiekt Calendar tworzymy przy użyciu wzorca static factory method (getInstance())
  • Metody z klasy Calendar, które powinno się rozumieć to add(), metoda ta pozwala dodać lub odejmować poszczególne elementy (min, dni, lata itp.) daty, roll(), który pracuje jak add() ale nie zwiększa większych części daty np. dodać 10 miesięcy do października zmienia miesiąc na sierpień, ale nie zwiększa roku
  • DateFormat instancje tej klasy są tworzone poprzez użycie wzorca static factory methods (getInstance() i getDateInstance())
  • Style formatowania klasy DateFormat mogą być stosowane wobec różnych Locales do utworzenia szerokiej gamy wyjść dla daty
  • W klasie DateFormat mamy dostępnych kilka stylów formatowania danych
  • DateFormat.format() metoda ta jest używana do tworzenia String'a który zawiera odpowiednio sformatowaną date
  • Locale klasa jest używana w połączeniu z klasami DateFormat, NumberFormat
  • Oba obiekty klas DateFormat, NumberFormat mogą być utworzone z określonym niezmiennym Locale
  • Na potzreby egzaminu powinieneś zrozumieć jak się tworzy Locales używając języków, lub kombinacji języka z krajem

Parsing, Tokenizing, and Formatting

  • regex to skrót dla wyrażeń regularnych, które są wzorcem używany w wyszukiwaniu danych w dużych źródłach
  • regex jest to pod język który istnieje w Javie i innych językach np. Perl
  • regex pozwala nam utworzyć wzorzec jaki będziemy poszukiwać używając w tym celu literałów lub meta-znaków. Meta-znaki pozwalają nam szukać nieco bardziej abstrakcyjnych danych jak np. liczby czy spacje.
  • Przestudiować należy takie znaki jak \d, \s, \w, . i meta-znaki
  • regex zapewnia kwantyfikatory które pozwalają nam sprecyzować nasze poszukiwania jak np. "szukaj więcej niż jedną liczbę w wierszu"
  • Przestudiuj działanie ?, *, + są to tak zwane "greedy quantifiers" (chciwe kwantyfikatory).
  • Pamiętać należy że meta-znaki nie współgrają za dobrze chyba że pamiętasz aby od nich uciec prawidłowo np. String s = "\\d";
  • Klasy Pattern, Matcher posiadają dobrze rozbudowane wyrażenia regularne
  • Powinno się rozumieć z klasy Pattern metodę compile() i z klasy Matcher metody matches(), pattern(), find(), start(), grup()
  • Nie musimy do egzaminu martwić się metodami z klasy Macher które odpowiadają za wymiane
  • Możemy używać java.util.Scanner do prostych wyrażeń regularnych, ale to jest przeznaczone przede wszystkim dla tokenizing
  • Tokenizing jest to proces do rozdzielania danych przez odpowiedni znak np. spację, na mniejsze porcje danych
  • W procesie tokenizing, dane które są przez nas pożądane nazywamy token, a ciąg znaków który będzie służył do rozdzielania nazywa się delimiters
  • Tokenizing może być wykonywany przez klasę Scanner lub też z String.split()
  • Delimeter jest pojedynczy znak jak np. kropka "." albo złożone wyrażenie regularne
  • Klasa Scanner pozwala nam rozdzielanie ciągu znaków w pętli, co pozwala nam zatrzymać się kiedykolwiek chcemy
  • klasa Scanner pozwala nam na rozdzielanie ciągów znaków, strumieni lub plików
  • Metoda String.split() rozdziela wszystkie dane na raz, więc duża porcja danych może być to dość dłuższy proces
  • W Javie 5 są dwie metody używane do formatowania danych dla wyjścia, są to printf(), format() znajdują się one w klasie PrintStream
  • Metody format() i printf() mają identyczną funkcjonalność
  • Formatowanie danych za pomocą printf() (lub format()) odbywa się za pomocą łańcuchów formatujących, które są związane z typami prymitywnymi lub z argumentami
  • Metoda format() pozwala ci na mieszanie literałów z twoją formą ciągów znaków
  • Formaty ciągów znaków które powinieneś znać:
    • Flagi: -,+, 0, ",", (
    • Konwersja: b, c, d, f, s
  • Jeżeli twoja konwersja nie pasuje do twojego typu argumentu, będzie zgłoszony wyjątek

stat4u stat4u

Brak komentarzy:

Prześlij komentarz

Powered By Blogger