В программировании Java некоторые знания не могут быть изучены только с помощью языковых спецификаций или стандартных документов API. Эта статья перечисляет это для вас.
1. Реализация
1. Теперь равны ()
класс Человек {Строка Имя; int birthyyear; байт [] сырой; public boolean equals (Object obj) {if (! obj exanceOf person) вернуть false; Человек другой = (человек) obj; return name.equals (shrel.name) && birthdayyear == Другое. Birthyear && arrays.equals (raw, orheme.raw); } public int hashcode () {...}} 2. Hashcode ()
класс человека {строка a; Объект B; байт C; int [] d; public int hashcode () {return a.hashcode () + b.hashcode () + c + arrays.hashcode (d); } public boolean equals (Object o) {...}}3. Реализовать сравнение ()
Класс Человек реализует сопоставимый <derss> {string firstname; String Lastname; int день рождения; // Сравнение FirstName, Break Skies By Lastname, наконец -то нарушайте связи с помощью даты рождения public int compareto (человек другой) {if (firstname.compareto (shrel.firstname)! = 0) вернуть FirstName.comPareto (ore.firstName); else if (lastname.compareto (shrel.lastname)! = 0) return lastname.compareto (shrel.lastname); иначе, если (дата рождения <Другое. BirthDate) возврат -1; иначе, если (дата рождения> Другое. Бартхдат) возврат 1; иначе вернуть 0; }} Всегда реализуйте общую версию, сопоставимую вместо примитивного типа, сопоставимого. Потому что это может сохранить объем кода и уменьшить ненужные хлопоты.
Просто заботитесь о знаках (отрицательных/нулевых/положительных), которые возвращают результат, их размер не имеет значения.
Реализация Comporator.comPare () аналогична этой.
4. Реализовать клон ()
Значения класса реализуют клонируемые {String abc; двойной foo; int [] bars; Дата нанята; public values clone () {try {values result = (values) super.clone (); result.bars = result.bars.clone (); result.hied = result.hired.clone (); результат возврата; } catch (clonenotsupportedException e) {// Невозможно бросить новое утверждение иррор (e); }}}2. Профилактическое тестирование
1. Значительная стоимость защиты
int informorial (int n) {if (n <0) бросить новый allosalargumentException ("undefined"); иначе if (n> = 13) бросить новое арифметикексапс ("переполнение результата"); иначе if (n == 0) вернуть 1; else return n * факториал (n - 1);} 2. Объекты профилактического тестирования
int findIndex (list <string> list, string target) {if (list == null || target == null) бросить новый NullPointerException (); ...}3. Индекс массива профилактического обнаружения
void frob (byte [] b, int index) {if (b == null) бросить новый NullPointerException (); if (index <0 || index> = b.length) бросить новый indexoutofboundsexception (); ...}Не думайте, что указанный индекс массива не будет пересекать границы. Чтобы обнаружить это явно.
4. Интервал профилактического обнаружения
void frob (byte [] b, int off, int len) {if (b == null) бросить новый nullpointerexception (); if (off <0 || off> b.length || len <0 || b.length - off <len) бросить новый indexoutofboundsexception (); ...}Не думайте, что заданный интервал массива (например, начиная от выхода, чтение элементов LEN) не выходит за рамки границ. Чтобы обнаружить это явно.
3. Массив
1. Заполнить элементы массива
Используя петли:
// заполнить каждый элемент массива 'a' с 123byte [] a = (...); для (int i = 0; i <a.length; i ++) a [i] = 123; (ПРЕДОСТАВЛЕНИЕ) Методы использования стандартной библиотеки: Arrays.fill (a, (Byte) 123);
2. Скопируйте элемент массива в диапазоне
Используя петли:
// копирование 8 элементов из массива 'a', начиная с смещения 3 // до массива 'b', начиная с смещения 6, // Предполагая, что 'a' и 'b' являются отдельными arrysbybe [] a = (...); byte [] b = (...); для (int i = 0; i <8; i ++) b [6 + i] = a [3 + i]; (ПРЕДОСТАВЛЕНИЕ) Методы использования стандартной библиотеки: System.Arraycopy (A, 3, B, 6, 8);
3. Отрегулируйте размер массива
Используйте петли (масштабирование):
// Сделать массив 'A' больше до Newlenbyte [] a = (...); byte [] b = new Byte [newlen]; for (int i = 0; i <a.length; i ++) // поднимается до длины a b [i] = a [i]; a = b;
Используйте петли (уменьшите размер):
// Сделать массив 'A' меньше до Newlenbyte [] a = (...); Byte [] b = новый байт [newlen]; для (int i = 0; i <b.length; i ++) // поднимается до длины b b [i] = a [i]; a = b;
(Преимущественные) методы использования стандартной библиотеки:
1a = arrays.copyof (a, newlen);
4. упаковка 4 байта в Int
int packbigendian (byte [] b) {return (b [0] & 0xff) << 24 | (B [1] & 0xff) << 16 | (B [2] & 0xff) << 8 | (b [3] & 0xff) << 0;} int packlittleendian (byte [] b) {return (b [0] & 0xff) << 0 | (B [1] & 0xff) << 8 | (B [2] & 0xff) << 16 | (B [3] & 0xff) << 24;}5. разложить Int на 4 байта
byte [] unpackbigendian (int x) {return new byte [] {(byte) (x >>> 24), (byte) (x >>> 16), (byte) (x >>> 8), (байт) (x >>> 0)};} byte [] unpacklitleendian (int x) {return new byte [] {(byte) (>> x) {(>> x) {(>> (>> (>> (>> (>> (>> (>> (>> (>> (>> (>> (>> (>> (>> (>> x) (x >> x). (байт) (x >>> 8), (байт) (x >>> 16), (byte) (x >>> 24)};}Всегда используйте оператор правого смены без знака (>>>), чтобы обернуть биты, не используйте арифметический оператор правого сдвига (>>).
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.