1. 程式人生 > >Java學習lesson 14

Java學習lesson 14

list集合、泛型

*數據結構

*棧結構(先進後出,後進先出)

特點:進棧的方式叫壓棧

出棧的方式叫彈棧

*隊列(先進先出)

*數組(查詢快,增刪慢)

*鏈表結構

有很多鏈子將多個節點連接起來

每一個節點(數據):數據域(值)和指針域

對於列表來說都是從第一個元素對應的指針域依次進行查詢(從頭開始找)

*查詢慢,增刪快

*List集合的子實現類的一些特點

*ArrayList集合

*底層數據結構是數組;滿足查詢快,增刪慢的特點

*從線程考慮是線程不安全的,不同步,執行效率高

*由於ArrayList集合是List集合的子類那麽他的元素是可以重復的,並且存儲和取出是一致的

package arraylist;
//下面代碼會出現黃色警告,是由於沒有使用泛型
import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo {

	public static void main(String[] args) {
		//創建一個集合對象;註意導包
		ArrayList al=new ArrayList();
        al.add("hello");
		al.add("world");
		al.add("JavaSE");
		al.add("hello");//可以出現重復的元素
		//獲取叠代器對象,遍歷元素
		Iterator it=al.iterator();
		//判斷是否有下一個要遍歷的元素
		while(it.hasNext()){
			String str=(String)it.next();
			System.out.println(str);
		}
		
	}

}

技術分享

//沒有使用泛型:有可能會出現ClassCastException(類型轉換異常)


*Vector集合

*底層數據結構是數組形式可以實現可增長的對象數組,與數組一樣,包含可以用整形索引進行訪 問的組件

*線程安全,同步執行效率低

package vector;


import java.util.Enumeration;
import java.util.Vector;

public class VectorDemo {

	public static void main(String[] args) {
		//創建Vactor對象
		Vector v=new Vector();
		//public void addElements(E obj);向集合中添加元素
		v.addElement("hello");
		v.addElement("worlde");
		v.addElement("hello");
		v.addElement("Java");
		
		
		//獲取叠代器對象
		Enumeration en=v.elements();
		
		//遍歷輸出
		while(en.hasMoreElements()){
			String str=(String)en.nextElement();
			System.out.println(str);
		}
	}

}

技術分享


*LinkedList集合

*底層數據結構是鏈表;(增刪快,查詢慢)

*此實現類是不同步的:線程不安全

*如果使用多線程程序,一般要是安全的類:

StringBuffer,Vector<E>,hashtable<K,V>

synchronized(同步鎖對象){

代碼;

}

*特有功能:

*public void addElement(E obj)//相當於:add(Object e)

*public Enumeration<E> elements()//相當於:INterator iterator()

*Enumeration<E>

是一個接口:向量的組件枚舉

boolean hasMoreElements()://相當於獲取叠代器裏面的hasNext()方法

Object nextElement()://相當於next()方法

package vector;


import java.util.Enumeration;
import java.util.Vector;

public class VectorDemo {

	public static void main(String[] args) {
		//創建Vactor對象
		Vector v=new Vector();
		//public void addElements(E obj);向集合中添加元素
		v.addElement("hello");
		v.addElement("worlde");
		v.addElement("hello");
		v.addElement("Java");
		
		//獲取叠代器對象
		Enumeration en=v.elements();
		
		//遍歷輸出
		while(en.hasMoreElements()){
			String str=(String)en.nextElement();
			System.out.println(str);
		}
	}

}

技術分享

*如果在一般的需求中沒有指明采用是用什麽集合去完成,都默認采用ArrayList集合

如果需求中考慮線程安全,那麽使用Vector集合

*筆試中一般使用ArrayList集合,效率高,速度快

*LinkList集合

底層數據結構是鏈表,特點:查詢慢,增刪快;是一個線程不安全的類

*特有功能

*添加功能:

*public void addFirst(E e)//將指定的元素差插入此列表的開頭

*public void addLast(E e)//將制定元素添加到此列表的末尾

*獲取功能:

*public Object getFirst()//返回此列表的第一個元素

*public Object getLast();//返回此列表的最後一個元素

*刪除功能:

*public Object moveFirst()//刪除此列表第一個元素並返回

*public Object moveLast()//刪除並返回此列表最後一個元素並返回

package linkedlist;

import java.util.LinkedList;

public class LinkedListDemo {
	public static void main(String[] agrs){
		//創建集合對象
		LinkedList lk=new LinkedList();
		
		//向集合中添加元素
		lk.add("hello");
		lk.add("world");
		lk.add("Java");
		System.out.println("lk"+lk);
		
		//在開頭添加
		lk.addFirst("JavaSe");
		//在末尾添加
		lk.addLast("JavaWeb");
		System.out.println("lk:"+lk);
		System.out.println("----------------------------");
		
		//獲取第一個元素並返回
		Object obj=lk.getFirst();
		//獲取最後一個元素並返回
		Object obj1=lk.getLast();
		System.out.println("getFirst():"+obj+‘\n‘+"getLast():"+obj1);
		System.out.println("lk:"+lk);
		System.out.println("----------------------------");
		
		//移除此列表第一個元素並返回
		Object obj2=lk.removeFirst();
		//移除最後一個元素並返回
		Object obj3=lk.removeLast();
		System.out.println("removeFirst():"+obj2+‘\n‘+"removeLast():"+obj3);
		System.out.println("lk:"+lk);
	}

}

技術分享

//模擬棧結構

package linkedlist;

import java.util.LinkedList;
//自定義棧集合
public class Stack {
	private LinkedList link;

	//通過無參構造創建LinkedList集合對象
	public Stack() {
		link=new LinkedList();
	}
	//向集合的開頭添加元素;相當於壓棧
	public void add(Object obj){
	   link.addFirst(obj) ;
	}
	//獲取集合第一個元素;相當於彈棧
	public Object get(){
		//removeFirst():移除第一個元素並返回
		return link.removeFirst();
	}
	
	//判斷集合是否為空
	public boolean isEmpty(){
		return link.isEmpty();
	}
}

//測試類
package linkedlist;

public class StackDemo {
	public static void main(String[] args){
		Stack s=new Stack();
		s.add("hello");
		s.add("world");
		s.add("JavaSE");
		//這裏做一個非空判斷,否則會出錯
		while(!s.isEmpty()){
		    //獲取集合中的元素;底層調用removeFirst()  
			System.out.println(s.get());
		}
	}
}

//棧結構特點:先進後出

技術分享


*泛型

一般的類和方法,只能使用具體的類型:;JavaSE5之後引出了泛型的概念,使代碼可以應用多種類型

(只可以是引用類型,不可以是基本類型)

*好處:

*將運行時起一場提前到了編譯時期

*解決了黃色警告線的問題

*在獲取數據是不需要強制轉換類型

*提高代碼的安全性

泛型一般情況下可以應用在接口、類、方法上,主要在集合中應用

package generic;

public class ObjectTool {
	private Object obj;

	public Object getObj(){
		return obj;
	}
	
	public void setObj(Object obj){
		//Object obj = new Integer(27) ; //向上轉型
		this.obj = obj ;
	}
	

}

package generic;

public class GenericDemo3 {

	public static void main(String[] args) {
		ObjectTool1<String> ot=new ObjectTool1<String>();
		ot.setObj("卡卡西");
		//Integer i = ot.getObj(); 由於給類上加入了泛型,在實際測試中,給定了數據類型
		//獲取數據的時候就必須應該類型來接收,否則不匹配
		String name = ot.getObj() ;
		System.out.println("姓名是:" +name);
		
		//創建對象
		ObjectTool1<Integer> ot2 = new ObjectTool1<Integer>() ;
		//設置數據
		ot2.setObj(27) ;
		
		//獲取數據
        //String s = ot2.getObj() ;
		Integer ig= ot2.getObj() ;
		System.out.println("年齡是:"+ig);
			}
}

技術分享

//對於基本類型的泛型

package generic;

import java.util.ArrayList;
import java.util.Iterator;

public class GenericDemo {
	public static void main(String[] args) {
		//創建集合類;jsk 7.0泛型推斷!:建議:後面永遠給出類型
         ArrayList<String> al=new ArrayList<String>();
         //向集合中添加元素
         al.add("hello");
         al.add("world");
         al.add("JavaSE");
         //獲取叠代器對象;使用泛型
         Iterator<String> it=al.iterator();
         //遍歷集合,並打印
         while(it.hasNext()){
        	 //由於使用了泛型不需要強制轉型
        	 String str=it.next();
        	 System.out.println(str);
         }   
	}
}

技術分享

//應用泛型對ArrayList集合存儲自定義對象並遍歷

package generic;

public class Student{
	private String name;
	private int age;
	public Student() {
		super();
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
	
	

}

package generic;

import java.util.ArrayList;
import java.util.Iterator;

public class GenericDemo1 {

	public static void main(String[] args) {
		//創建ArrayList集合對象
		ArrayList<Student> al=new ArrayList<Student>();
		//創建Student類對象
		Student st1=new Student("卡卡西",24);
		Student st2=new Student("佐助",17);
		Student st3=new Student("鳴人",17);
		Student st4=new Student("小櫻",17);
		//向集合中添加元素
		al.add(st1);
		al.add(st2);
		al.add(st3);
		al.add(st4);
		//獲取遍歷器對象
		Iterator<Student> it=al.iterator();
		System.out.println("在Student中重寫toString方法:");
		while(it.hasNext()){
			//由於這裏是自定義類型Student,需要在Student裏重寫toString方法
			Student st=it.next();
			System.out.println(st);
		}
		
		System.out.println("用get方法:");
		Iterator<Student> it1=al.iterator();
		while(it1.hasNext()){
			//如果不重寫toString方法,就使用getXX()來獲取
			Student st6=it1.next();
			System.out.println(st6.getName()+"-------"+st6.getAge());
		}
	}
}

技術分享

*將泛型定義在方法上

package generic;

public class ObjectTool2 {
	//將泛型定義在方法上
		public <T> void show(T t){
			System.out.println(t);
		}
}

package generic;

public class GenericDemo4 {
	public static void main(String[] args){
		
		ObjectTool2 obj=new ObjectTool2();
		//在工具類中將泛型定義在了方法上
	    obj.show("hello");
	    obj.show("world");
	    obj.show("JavaSE");
	}

}

技術分享


*泛型接口

*接口的子實現類已經知道傳遞的是一個什麽類型的數據

package generic;
//將泛型定義在接口上
public interface Generic<T> {
	public abstract void show(T t);

}

package generic;
//子實現類
public class GenericImpl<String> implements Generic<String>{
	public void show(String str){
		System.out.println(str);
	}

}

package generic;
//測試類
public class GenericDemo5 {
	public static void main(String[] args){
		Generic<String> gl=new GenericImpl<String>();
		gl.show("弋痕夕");
		gl.show("天凈沙");
		gl.show("山鬼謠");
	}

}

技術分享


*接口的子實現類在實現接口時不知道傳遞的是什麽類型的數據類型,在測試類中才知道

package generic;
//在接口上定義泛型
public interface Generic1<T> {
	public abstract void show(T t);
}

package generic;

public class GenericImpl1<T> implements Generic1<T> {
	public void show(T t){
		System.out.println(t);
	}

}

package generic;

public class GenericDemo6{
	public static void main(String[] args){
		Generic1<Integer> gl=new GenericImpl1<Integer>();
		gl.show(17);
		gl.show(18);
		gl.show(20);
		
	}
}

技術分享


*泛型可以提供程序的安全性!

* 早期的時候,用Object類型代表任意的類型向上轉型是不會出現問題的,但是向下轉型的時候,由於隱 藏了類型轉換,導致出現錯誤!

* JDK5以後,提供了泛型可以解決程序的安全性




Java學習lesson 14