-
Массивди ArrayListке айландыруу .
Массивди ArrayListке айландыруу үчүн , иштеп чыгуучулар көбүнчө бул ыкманы колдонушат:
List<String> list = Arrays.asList(arr);
Arrays.asList()
класстынArrayList
ички жеке статикалык классы болгон класс an objectисин кайтарат жана бул класс эмес Класста , , ыкмалары бар , бирок элементтерди кошуу үчүн эч кандай методдор жок, анын өлчөмү белгиленген . Чыныгы түзүү үчүн , муну жасаңыз:(private static class)
Arrays
java.util.ArrayList.
java.util.Arrays.ArrayList
set()
get()
contains()
java.util.ArrayList
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
Класстын конструктору
java.util.ArrayList
интерфейсти ишке ашыруучу бардык an objectтерди параметр катары ала алатCollection
, анын ишке ашырылышы класс тарабынан мураска алынганjava.util.Arrays.ArrayList
(жеке статикалык класс ArrayList<E> AbstractList кеңейтет<E> RandomAccess, java.io.Serializable ишке ашырат).
-
Белгилүү бир маани үчүн массивди текшерүү.
Иштеп чыгуучулар көбүнчө муну жасашат:
Set<String> set = new HashSet<String>(Arrays.asList(arr)); return set.contains(targetValue);
Код иштейт , бирок аны
List
.Set
АйландырууSet
кошумча убакытты талап кылат. Чынында, баары жөнөкөй:Arrays.asList(arr).contains(targetValue);
же
for(String s: arr){ if(s.equals(targetValue)) return true; } return false;
Биринчи ыкма алда канча кыска.
-
List
Циклдеги элементти алып салууЦиклдеги элементтерди жок кылган төмөнкү codeду карап көрөлү:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (int i = 0; i < list.size(); i++) { list.remove(i); } System.out.println(list);
Жыйынтык:
[b, d]
Бул олуттуу ката болуп чыгат. Элемент алынып салынганда өлчөмү
List
кичирейет жана элементтин индекстери өзгөрөт.Демек, индексти колдонуп циклде бир нече элементтерди алып салгыңыз келсе, бул ыкмадан качыңыз.
Сиз итераторду колдонуу циклдеги элементтерди алып салуу үчүн туура чечим экенин билесиз жана стиль цикли
for-each
итератор сыяктуу иштээрин билесиз, бирок андай эмес.Төмөнкү codeду карап көрүңүз:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (String s : list) { if (s.equals("a")) list.remove(s); }
Биз ConcurrentModificationException алабыз .
Туура кылуу керек:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); Iterator<String> iter = list.iterator(); while (iter.hasNext()) { String s = iter.next(); if (s.equals("a")) { iter.remove(); } }
Метод
Цикл стorндеnext()
алдынан чакырылышы керекremove()
.for-each
компилятор методду чакыратremove()
, андан кийин ганаnext()
ката кетиретConcurrentModificationException
. Сиз codeду карасаңыз болотArrayList.iterator()
. -
Hashtable
каршыHashMap
.Тиешелүү ишке ашыруудан улам, Hashtable маалымат структурасынын аталышы.
Бирок Javaда маалымат структурасынын аталышы
HashMap
.Hashtable
жана ортосундагы негизги айырмачылыктардын бири синхрондоштурууHashMap
болуп саналат . Ошондуктан аны кайдаHashtable
колдонбоо керек .Hashtable
HashMap
-
Коллекцияларды мазмунга чектөөсүз колдонуңуз
В Java часто путают коллекции без ограничений по содержимому, и коллекции с маской по типу содержимого. К примеру, для множеств -
Set
это коллекция без ограничений по содержимому, аSet<?>
— коллекция у которой все-таки есть ограничения, но эти ограничения ничего на самом деле не ограничивают. Рассмотрим следующий code, гдеList
без ограничений используется в качестве параметра метода:public static void add(List list, Object o){ list.add(o); } public static void main(String[] args){ List<String> list = new ArrayList<String>(); add(list, 10); String s = list.get(0); }
Данный code выбросит исключение:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at …
Использование коллекций без ограничений по содержимому очень опасно, потому что вы не можете быть уверенными в том что там лежит внутри. А для того чтобы понять всю глубину разницы между
Set
,Set<?>
иSet<Object>
— почитайте вот эту и эту ссылки. -
Уровень доступа
Очень часто для полей класса разработчики используют модификатор доступа
public
. Так проще получить meaning поля напрямую. Правильнее использовать How можно более ограниченный доступ к членам класса. ArrayList
противLinkedList
Когда разработчики не знают чем отличается
ArrayList
отLinkedList
, они используют первый в силу его большей известности. Однако, есть огромная разница в производительности между ними. На самом деле, выбор между ними должен быть продиктован их внутренними особенностями —ArrayList
позволяет быстро производить доступ к произвольному элементу массива, аLinkedList
— быстро добавлять/удалять элементы в массиве. Почитайте статью по ссылке ArrayList vs. LinkedList чтобы понять причины их разной производительности.Mutable
(Изменяемый) противImmutable
(Неизменяемый)Неизменяемый an object имеет много преимуществ: простота, безопасность и т.д. Но он требует отдельного an object для каждого нового значения, и за слишком большое количество an objectов придется заплатить понижением производительности. Должен быть баланс при выборе между изменяемым и неизменяемым обьектом.
В основном чтобы избежать подготовки промежуточных an objectов используется изменяемый an object. Один из классических примеров это конкатенация большого количества строк. Если вы используете неизменяемый an object типа
String
, то вы создаете много an objectов, которые сразу попадут в сборщик мусора. Это тратит время и энергию процессора, поэтому правильное решение это использование изменяемых обьектов (напримерStringBuilder
).String result=""; for(String s: arr){ result = result + s; }
Еще один пример использования изменяемых an objectов — передача такого an object в метод. Это позволит вернуть результат в нем же, без создания лишних an objectов. При работе с an objectми большого размера, к примеру коллекциями, передача коллекции в метод для сортировки и возвращение результата в другой коллекции приводит к совершенно излишнему расходу ресурсов. (Ответ пользователя dasblinkenlight на Stack Overflow).
-
Конструкторы классов
Super
иSub
Бул компиляция катасы ата-баба классында аныкталган демейки конструктордун жоктугунан келип чыгат. Javaда класстын конструкторун өзүңүз көрсөтпөсөңүз, компилятор аргументтерди талап кылбаган демейки конструкторду түзөт . Эгерде конструктор класста
Super
катары сүрөттөлсөSuper(String s){}
, компилятордун өзү эч нерсе кошпойт. Бул биздин мисалдан көрүп турган нерсе.Класстын конструктору
Sub
, кайсынысы болбосун, класстын демейки конструкторун чакыратSuper
, анткени башка эч нерсе көрсөтүлгөн эмес. Класста демейки конструктор жок болгондуктанSuper
, бул компиляция катасына алып келет.Бул маселенин биринчи чечими класска демейки конструкторду кошуу болуп саналат
Super
public Super(){ System.out.println("Super"); }
Экинчи вариант - биз сүрөттөгөн конструкторду класстан алып салуу
Super
, андыктан компилятор демейки конструкторду түзөт.super(value)
Жана акыркы вариант - класстын конструкторлоруна чакыруу кошуу,Sub
андыктан демейки конструктордун ордуна учурдагы класс конструктору чакырылат.Super
-
" " же конструкторбу?
Сапты түзүүнүн эки жолу бар:
//1. использовать двойные кавычки String x = "abc";
//2. использовать конструктор String y = new String("abc");
Алардын ортосунда кандай айырма бар?
Муну төмөнкү мисалдардан түшүнүүгө болот:
String a = "abcd"; String b = "abcd"; System.out.println(a == b); // True System.out.println(a.equals(b)); // True String c = new String("abcd"); String d = new String("abcd"); System.out.println(c == d); // False System.out.println(c.equals(d)); // True
Саптар эстутумда кантип сакталаары жөнүндө көбүрөөк билүү үчүн "" же Конструкторду колдонуп Java саптарын түзүү дегенди окугула. .
GO TO FULL VERSION