摘要:JAVA 集合(1) List
集合類
物件導向對事物都是以物件的形式,所以為了方便對多個物件的操作,就對物件進行存儲,集合就是存儲物件最常用的一 種方式
陣列和集合類同是容器,有何不同?
陣列雖然也可以存儲物件,但長度是固定的
集合長度是可變的。 陣列中可以存儲基底資料型別,集合只能存儲物件,集合可以存儲不同類型的物件。
集合框架中的常用介面
Collection介面有兩個子介面:
List(列表),Set(集)
List:可存放重複元素,元素存取是有序
Set:不可以存放重複元素,元素存取是無序
基本方法使用:
class Hello{
public static void main(String[] args){
//創建一個容器 使用Collection介面的子類
ArrayList a = new ArrayList();
a.add("x");
a.add("y");
a.add("z");
sop(a.contains("x")); //T
sop(a.isEmpty()); //F
sop(a); //[x, y]
a.remove("y");
sop(a); //[x]
sop(a.clear());//[]
}
class Hello{
public static void main(String[] args){
//創建一個容器 使用Collection介面的子類
ArrayList a = new ArrayList();
a.add("x");
a.add("y");
a.add("z");
ArrayList b = new ArrayList();
b.add("x");
sop(a); //[x, y, z]
a.retainAll(b); //保留交集
sop(a); //[x]
}
public static void sop(Object obj){
System.out.println(obj);
}
}
Iterator
class Hello{
public static void main(String[] args){
ArrayList a = new ArrayList();
a.add("x");
a.add("y");
a.add("z");
Iterator it = a.iterator();//返回一個Iterator介面的子類物件
sop(it.next()); //x
sop(it.next()); //y
sop(it.next()); //z
}
public static void sop(Object obj){
System.out.println(obj);
}
}
class Hello{
public static void main(String[] args){
ArrayList a = new ArrayList();
a.add("x");
a.add("y");
a.add("z");
//返回一個Iterator介面的子類物件
//用於取出集合中的元素
Iterator it = a.iterator();
while(it.hasNext()){
sop(it.next()); //x y z
}
it.remove();//移除最後一個元素
sop(a);
}
public static void sop(Object obj){
System.out.println(obj);
}
}
Collection(介面)
-
List(介面)
- 有序(依存入的順序),可重複,有索引
-
Set(介面)
- 無序,不可重複
List介面中常用類
- Vector:執行緒安全(同步),但速度慢,已被 ArrayList替代
- ArrayList:執行緒不安全(不同步),查詢速度快,但增加刪除慢,使用陣列
- LinkedList:增刪速度快,查詢慢,使用鏈結串列
Set介面中常用類
- HashSet:底層數據結構是hash table,而hashSet是如何保證元素唯一性,是通過元素的兩個方法,hashCode和equals方法來完成,如果元素的HashCode值相同,才會判斷equals是否為true,如果元素的hashCode值不同,不會調用equals
-
TreeSet:可以對Set集合中的元素進行排序,底層數據結構是二元樹,保證元素唯一性的依據,compareTo方法return 0
- TreeSet排序的第一種方式,讓元素自身具備比較性,元素需要實現比較性,元素需要實現Comparable介面,覆寫compareTo方法,這種方法也成為元素的自然順序,或者叫作默認順序
- TreeSet的第二種排序方式: 當元素本身不具備比較性,或者具備的比較性不是所需要的,這時就需要讓集合自身具備比較性。在集合初始化時,就有了比較方式,定義一個類別,實現Comparator介面,覆寫compare方法
- 當兩種排序都存在時,以比較器為主
class Hello{
public static void main(String[] args){
ArrayList a = new ArrayList();
a.add("x");
a.add("y");
a.add("z");
sop(a); //[x, y, z]
a.add(1, "w");
sop(a); //[x, w, y, z]
a.remove(2); //移除索引2元素
sop(a);//[x, w, z]
a.set(2, "xyz");
sop(a);//[x, w, xyz]
sop(a.get(1));//w
for(int x = 0; x
}
List方法
-
增
- add(index, element);
- addAll(index, Collection);
-
刪
- remove(index);
-
改
- set(index, element);
-
查
- get(index);
- subList(from, to);
- listIterator();
class Hello{
public static void main(String[] args){
ArrayList a = new ArrayList();
a.add("x");
a.add("y");
a.add("z");
sop(a);//[x, y, z]
Iterator it = a.iterator();
while(it.hasNext()){
Object obj = it.next();
if(obj.equals("x")){
//a.add("w"); 發生異常 不可這樣用
it.remove();//移除 x (it移除, a也移除)
sop(obj);//x
}
}
sop(a);//[y, z]
}
List集合特有的迭代器,ListIterator是Iterator的子介面
在迭代時,不可以通過集合物件的方法操作集合中的元素,會發生ConcurrentModificationException異,所以在迭代器時,只能用迭代器的方法操作元素,但其方法只有判斷、取出、移除等操作,如果想做其他操做,就需要使用其子介面,即ListIterator
該介面只通過List集合的ListIterator方法取得
ListIterator的hasNext及hasPrevious方法
集合一開始指向null位置,所以hasNext為true,而hasPrevious為flase!!
如下:
class Hello{
public static void main(String[] args){
ArrayList a = new ArrayList();
a.add("x");
a.add("y");
a.add("z");
sop(a);//[x, y, z]
Iterator it = a.iterator();
while(it.hasNext()){
Object obj = it.next();
if(obj.equals("x")){
//a.add("w"); 發生異常 不可這樣用
it.remove();//移除 x (it移除, a也移除)
sop(obj);//x
}
}
sop(a);//[y, z]
ListIterator li = a.listIterator();
while(li.hasNext()){
Object obj = li.next();
if(obj.equals("y")){
li.set("y1");//修改元素
li.add("x");//增加元素 x
}
}
sop(a);//[y, x, z]
}
public static void sop(Object obj){
System.out.println(obj);
}
}
Vector
class Hello{
public static void main(String[] args){
Vector v = new Vector();
v.add("a");
v.add("b");
v.add("c");
v.add("d");
Enumeration en = v.elements();//vector的迭代器以被Iterator取代
while(en.hasMoreElements()){
sop(en.nextElement());
}
}
public static void sop(Object obj){
System.out.println(obj);
}
}
LinkList
/*LinkedList方法
* addFirst()
* addList()
* getFirst() 取得元素但不移除 如果集合中沒有元素 會出現NoSuchElementException
* getLast()
* removeFirst() 取得元素並移除 如果集合中沒有元素 會出現NoSuchElementException
* removeLast()
*
* JDK1.6的替代方法 解決集合空異常
* offerFirst()
* offerLast()
* peekFirst() 取得元素但不移除 集合為空返回null
* peekLast()
* pollFirst() 取得元素並移除 集合為空返回null
* pollLast()
* */
class Hello{
public static void main(String[] args){
LinkedList link = new LinkedList();
link.addFirst("a");
link.addFirst("b");
link.addFirst("c");
link.addFirst("d");
sop(link);//[d, c, b, a]
sop(link.getFirst());//d
sop(link.getLast());//a
link.removeFirst();
link.removeLast();
sop(link);//[c, b]
sop(link.size());//2
while(!(link.isEmpty())){
sop(link.removeFirst());//c, b
}
}
public static void sop(Object obj){
System.out.println(obj);
}
}
使用LinkList模擬stack
class StackTest{
private LinkedList link;
public StackTest() {
link = new LinkedList();
}
public void add(Object obj){
link.addFirst(obj);
}
public Object get(){
return link.removeFirst();
}
public boolean isNull(){
return link.isEmpty();
}
}
class Hello{
public static void main(String[] args){
StackTest link = new StackTest();
link.add("a");
link.add("b");
link.add("c");
while(!(link.isNull())){
System.out.println(link.get()); //c, b, a
}
}
}
ArrayList去除重複元素
class Hello{
public static void main(String[] args){
ArrayList array = new ArrayList();
array.add("a");
array.add("a");
array.add("a");
array.add("b");
array.add("b");
array.add("c");
sop(array); //[a, a, a, b, b, c]
array = singleElement(array);
sop(array); //[a, b, c]
}
public static ArrayList singleElement(ArrayList tempArray){
ArrayList newArray = new ArrayList();
Iterator it = tempArray.iterator();
while(it.hasNext()){
Object obj = it.next();
if(!(newArray.contains(obj))){
newArray.add(obj);
}
}
return newArray;
}
public static void sop(Object obj){
System.out.println(obj);
}
}
List集合判斷元素是否相同,依據是元素的equals方法!!
將自定義物件存到ArrayList中,並去除重覆
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
//object類的equals為位址比較 需自定義equals方法 才能夠判斷出相等物件
public boolean equals(Object obj){
if(!(obj instanceof Person)){
return false;
}else{
Person p = (Person)obj;
//使用string類的equals比較
return this.name.equals(p.name) && this.age == p.age;
}
}
}
class Hello{
public static void main(String[] args){
ArrayList array = new ArrayList();
array.add(new Person("kent", 20));
array.add(new Person("hardy", 25));
array.add(new Person("kemp", 22));
array.add(new Person("kemp", 22));
array.add(new Person("hardy", 25));
array = singleElement(array);
Iterator it = array.iterator();
while(it.hasNext()){
//Object obj = it.next();
//Person p = (Person)obj;
Person p = (Person)it.next();
sop(p.getName() + ":: " + p.getAge());
}
}
public static ArrayList singleElement(ArrayList a){
ArrayList newA = new ArrayList();
Iterator it = a.iterator();
while(it.hasNext()){
Object obj = it.next();
if(!(newA.contains(obj))){//contain會調用Person類中的equals方法
newA.add(obj);
}
}
return newA;
}
public static void sop(Object obj){
System.out.println(obj);
}
}