-
Массивті ArrayList түріне түрлендіру .
Массивті ArrayList түріне түрлендіру үшін әзірлеушілер осы әдісті жиі пайдаланады:
List<String> list = Arrays.asList(arr);
Arrays.asList()
сыныптыңArrayList
ішкі жеке статикалық класы болып табылатын сынып нысанын қайтарады және бұл сынып емес Сыныпта , , әдістері бар , бірақ элементтерді қосу әдістері жоқ, оның өлшемі бекітілген . Нақтысын жасау үшін мына әрекетті орындаңыз:(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(); } }
Әдіс
Цикл стиліндеnext()
алдынан шақырылуы керекremove()
.for-each
компилятор әдісті шақырадыremove()
, содан кейін ғанаnext()
қатені тудырадыConcurrentModificationException
. Сіз codeты көре аласызArrayList.iterator()
. -
Hashtable
қарсыHashMap
.Сәйкес іске асыруға байланысты Hashtable деректер құрылымының атауы болып табылады.
Бірақ Java -да деректер құрылымының атауы
HashMap
.Hashtable
және арасындағы негізгі айырмашылықтардың біріHashMap
синхрондалған.Сондықтан оны қайдаHashtable
қолданбау керек .Hashtable
HashMap
HashMap қарсы TreeMap қарсы Хэштабельге қарсы LinkedHashMap .
-
Жинақтарды мазмұнды шектеусіз пайдаланыңыз
В 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