-
Табдил додани массив ба ArrayList .
Барои табдил додани массив ба ArrayList , таҳиягарон аксар вақт ин усулро истифода мебаранд:
List<String> list = Arrays.asList(arr);
Arrays.asList()
an objectи синфро бармегардонадArrayList
, ки синфи статикии дохorи(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
давраРамзи зеринро дида бароед, ки элементҳоро дар давра хориҷ мекунад:
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
мисли итератор кор мекунад, аммо ин тавр нест.Рамзи зеринро баррасӣ кунед:
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
. -
Использование коллекций без ограничений по содержимому
В 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ҳои калон, аз қабor коллексияҳо, ба усули ба навъҳо ҷудо кардан ва баргардонидани натиҷа ба коллексияи дигар сарфи тамоман нодаркори захираҳо мебошад. ( Ҷавоб аз 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