java的集合分為三大接口,分别是Collection,Map,Iterator,集合接口和類在java.util包中,此次主要介紹三大接口之一的Collection接口。
一些Collection允許有重複元素,而另一些則不允許,一些Collection是有序的,另一些則是無序的。Collection不提供接口的任何直接實作,它提供更加具體的子接口List和Set。
1.List接口
List是有序的集合,此接口的使用者隊清單的每一個元素的插入位置進行精确的控制,可以根據元素的整數索引通路元素,并搜尋清單中的元素。
List接口實作類主要有:ArrayList,Vector,LinkedList
1)ArrayList
1.預設的ArrayList的大小為10
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauITOhNWMkNjNzEWO5QzY1IWOiRDN0U2YzEmM2cDZmdjZvwFNwgDM2EDMy8CXkF2bsBXdvwlbj5yY0lmLw1mLn1Wavw1LcpDc0RHaiojIsJye.jpg)
2.ArrayList内部實作是使用動态數組
3.ArrayList是線程不安全的
4.如果數組滿了,需要動态擴充,擴充長度為原來數組長度的一半左右,擴充時需要建立一個數組,再把原先資料複制過來。
ArrayList使用示例:
Java代碼
public static void main(String[] args){
String okString=null;
List<String>lists=new ArrayList<String>();
lists.add("aa");
lists.add("aa");
lists.add(1,"bb");//指定位置插入
lists.add("cc");
lists.add(okString);
//檢查ArrayList是否為空
System.out.println(lists.isEmpty());
//查找指定元素的首次出現位置
System.out.println(lists.indexOf("aa"));
//檢視是否含有該元素
System.out.println(lists.contains("cc"));
//輸出list的長度
System.out.println(lists.size());
//輸出
for(int i=0;i<lists.size();i++)
System.out.println(lists.get(i));
//清除list
lists.clear();
}
總結:Arra能直接通過下标擷取資料,資料讀取非常友善;然而ArrayList的插入和删除,會導緻内部資料大量移位,會影響性能。如果我們已經知道需要的元素個數,我們可以初始化時指定ArrayList的容量,這樣可以有效的避免數組多次擴充,進而提高效率;但也不能初始化太大,浪費記憶體。
2)Vector
Vector類可以實作增長的對象數組,與數組一樣,可以使用下标直接進行資料通路。Vector的大小可以根據需要擴充或縮小。
1.Vector内部使用動态數組實作
2.預設構造大小為10,增量為0.可在構造方法指定大小和增量Vector(int size,int Increment)
3.擴充方式:如果有指定增量,則是目前容量+增量;如果增量等于0,則是目前容量*2;
4.Vector是線程安全的
Vector用法和ArrayList基本差不多,示例代碼
Java代碼
public static void main(String[] args){
String okString=null;
List<String>vectors=new Vector<String>();
vectors.add("aa");
vectors.add("aa");
vectors.add(1,"bb");//指定位置插入
vectors.add("cc");
vectors.add(okString);
//檢查ArrayList是否為空
System.out.println(vectors.isEmpty());
//查找指定元素的首次出現位置
System.out.println(vectors.indexOf("aa"));
//檢視是否含有該元素
System.out.println(vectors.contains("cc"));
//輸出list的長度
System.out.println(vectors.size());
//删除元素;
vectors.remove(0);
//輸出
for(int i=0;i<vectors.size();i++)
System.out.println(vectors.get(i));
//清除list
vectors.clear();
}
3)LinkedList
LInkedList是List接口的連結清單實作。實作所有可選的清單操作,并允許所有元素包括null。其基本用法與ArrayList差不多,如:
Java代碼
public static void main(String[] args){
String okString=null;
List<String>link=new LinkedList<String>();
link.add("aa");
link.add("aa");
link.add(1,"bb");//指定位置插入
link.add("cc");
link.add(okString);
//檢查ArrayList是否為空
System.out.println(link.isEmpty());
//查找指定元素的首次出現位置
System.out.println(link.indexOf("aa"));
//檢視是否含有該元素
System.out.println(link.contains("cc"));
//輸出list的長度
System.out.println(link.size());
//删除元素;
link.remove(0);
//輸出
for(int i=0;i<link.size();i++)
System.out.println(link.get(i));
//清除list
link.clear();
}
ArrayList和Vector是使用動态數組實作的,Vector相比ArrayList可以指定增量,而LinkedList是用連結清單實作的。他們的差別主要展現在數組和連結清單的差別
2.Set接口
一個不包含重複元素的colletion。即Set不包含滿足e1.equals(e2)的元素,Set最多包含一個null元素
Set的實作類主要有:HashSet,TreeSet,LinkedHashSet
1)HashSet
實作了Set接口,它不保證set的疊代順序,特别是它不保證該順序永恒不變,此類允許使用null元素。底層是使用HashMap實作的。
下面我們主要講解不能包含重複元素。
如:
定義Person類:
Java代碼
public class Person {
public String name;
public int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "person [name=" + name + ", age=" + age + "]";
}
}
set添加Person元素
Java代碼
public static void main(String[] args){
Set<Person>sets=new HashSet<Person>();
Person ok=new Person("小明", 18);
Person ok1=new Person("小紅", 16);
Person ok2=new Person("小白", 15);
sets.add(ok);
sets.add(ok1);
sets.add(ok2);
//添加不進去
sets.add(ok1);
//能添加進去
sets.add(new Person("小明", 18));//與ok資料一樣
System.out.println("size: "+sets.size());
}
發現同一個對象的ok1隻能添加一次,然而與ok相同資料的被多次添加。Set使用e1.equals(e2)來判斷的。
在java集合中,判斷兩個對象是否是同一個對象是:
1.先判斷兩個對象的hashCode值是否相等,如果不相等,就認為兩個對象不相等;若相等;判斷條件2
2.判斷兩個對象的equals運算是否相等,相等則認為兩個對象相等。
是以我們需要重寫Person的hashCode和equals方法
把Person類加上方法:
Java代碼
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
此時後面與ok資料相同的對象也不能添加進集合裡了。
2)TreeSet
TreeSet元素自然排序,底層是使用TreeMap實作的,自定義要顯示Comparable接口
定義Person類
Java代碼
public class Person implements Comparable<Person>{
public String name;
public int age;
public Person(String name,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Person o) {
if(o==null)
throw new NullPointerException();
if(this.age>o.age)
return 1;
if(this.age<o.age)
return -1;
return 0;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
TreeSet使用:
Java代碼
public static void main(String[] args){
Set<Person>sets=new TreeSet<Person>();
Person ok=new Person("小明", 18);
Person ok1=new Person("小紅", 16);
Person ok2=new Person("小白", 15);
sets.add(ok);
sets.add(ok1);
sets.add(ok2);
//添加不進去
sets.add(ok1);
//輸出
Iterator<Person> iterator=sets.iterator();
while(iterator.hasNext())
{
System.out.println(iterator.next());
}
}
運作結果:
技術分享:kaige123.com