java學習之集合框架與泛型

java集合框架與泛型

5.1 java集合框架與泛型

5.1.1 java集合框架的主要接口在這裏插入圖片描述

tips:

  • 接口map與接口collection是相互獨立的
  • 所有集合類均直接或間接地實現了迭代接口interable

5.1.2 迭代接口Iterable與迭代器Iterator

Iterator用於遍歷集合中元素,定義了三種方法:

  • hasNext():判斷是否還有下一個元素。有元素可以迭代則返回true。
  • next() 返回下一個元素
  • remove() 刪除當前元素

5.1.3 泛型

java通過object的引用來實現參數類型的任意化,特點則是需要進行顯示的強制類型轉化,但編譯器有時發現不了強制類型轉化引起的異常,給系統帶來隱患。由此引入了泛型。

泛型的本質:參數化類型,操作的數據類型被指定爲一個參數。可以有泛型類,泛型接口,泛型方法。

5.2 Collection集合及其遍歷

5.2.1 List接口及其常用類

List的特徵:

  • 元素有序排列
  • 可以有重複元素
  • 可以隨機訪問,及通過索引快速訪問元素

List的實現類ArrayList

package 容器;
/**
 * 手工實現Arraylist
 * @author CR553
 */

public class TestArrayList01<E> {
	private Object[] elementDate;
	private int size;
	
	private static final int MAX=10;
	
	public TestArrayList01()//構造函數
	{
		elementDate =new Object[MAX];
	}
	
	public TestArrayList01(int index)//構造函數
	{
		elementDate =new Object[index];
		if(index<0)
		{
			throw new RuntimeException("容器大小不能爲負數!");
			
		}
		else if(index==0)
		{
			elementDate= new Object[MAX];
		}
		else
		{
			elementDate =new Object[index];
		}
	}
	
	public void add(E element)
	{
		if(size== elementDate.length)//擴容操作
		{
			Object[] newArray = new Object[elementDate.length+(elementDate.length>>1)];
			System.arraycopy(elementDate, 0, newArray, 0, elementDate.length);
			elementDate = newArray;
		}
		elementDate[size++]=element;
	}
	
	public void checkRange(int index)//越界判斷
	{
		if(index<0||index>=size)
		{
			throw new RuntimeException("索引不合法!:"+index);
			
		}
		
	}
	public void set(E element ,int index)//修改操作
	{
		checkRange(index);
		elementDate[index]=element;
		
	}
	public E get(int index)
	{
		checkRange(index);
		return (E)elementDate[index];
		
	}
	public void remove(int index)//移除操作
	{
		int numMoved=elementDate.length-index-1;
		System.arraycopy(elementDate, index+1, elementDate, index, numMoved);//自己複製自己實現刪除
	}
	public void remove(E element)
	{
		for(int i=0;i<size;i++)
		{
			if(element.equals(get(i)))
			{
				remove(i);
			}
		}
		elementDate[--size]=null;
	}
	
	public String toString() {//重寫toString方法
		StringBuilder sb =new StringBuilder();
		sb.append("[");
		for(int i=0;i<size;i++)
		{
			sb.append(elementDate[i]+",");
			
		}
		sb.setCharAt(sb.length()-1,']');
		return sb.toString();
	}
	public static void main(String[] args) {
		TestArrayList01<String> t1 =new TestArrayList01<String>(20);
		t1.add("*");
		t1.add("/");
		for(int i=0;i<50;i++)
		{
			t1.add("mm"+i);
		}
		t1.set("bb", 5);
		System.out.println(t1.get(5));
		t1.remove(4);
		t1.remove("bb");
		System.out.println(t1);
	}

}

List實現類:LinkLisst

package 容器;
/**
 * 自定義鏈表
 * @author asus
 *
 */
public class TestLinklist<E> {

	private Node first;
	private Node last;
	private int size;

	//a,b,c
	public void add(E element)//添加元素

	{
		Node node =new Node(element);
		if(first==null)
		{
			first=node;
			last=node;
			
		}
		else 
		{
			node.previous=last;
			node.next=null;
			
			last.next= node;
			last=node;

		}
		size++;
	}
	public void checkRange(int index)//判斷索引是否越界
	{
		if(index<0||index>size-1)
		{
			throw new RuntimeException("索引數字不合法:"+index);
		}
	}
	public Node getNode(int index)
	{
		checkRange(index);
		Node temp=null;
		if(index<(size>>1))//二分
		{
			temp=first;
			for(int i=0;i<index;i++)
			{
				temp=temp.next;
			}
		}
		else
		{
			temp=last;
			for(int i=size-1;i>index;i--)
			{
				temp=temp.previous;
			}
		}
		return temp;
	}
	public void remove(int index)//刪除
	{
		checkRange(index);
		Node temp=getNode(index);
		Node up=temp.previous;
		Node down = temp.next;
		
		if(up!=null)
		{
			down.previous=up;
		}
		if(down!=null)
		{
			up.next=down;
		}
		if(index==0)
		{
			first=down;
			
		}
		if(index==size-1)
		{
			last=up;
		}
		size--;
	}
	public Object get(int index)//獲得值
	{
		checkRange(index);
		Node temp = getNode(index);
		return temp==null?null:temp.element;
		
	}
	
	public String toString()//重寫

	{
		StringBuilder sb =new StringBuilder("[");
		Node temp =first;
		while(temp!=null)
		{
			sb.append(temp.element+",");
			temp=temp.next;
		}
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
		
	}
	public void add(int index,E element)
	{
		checkRange(index);
		Node newnode =new Node(element);
		Node temp=getNode(index);
		
		if(temp!=null)
		{
			Node up=temp.previous;
			
			up.next=newnode;
			newnode.previous=up;
			
			temp.previous=up;
			newnode.next=temp;
		}
		size++;
		
		
	}
	
	public static void main(String[] args) {
		TestLinklist<String> t2 =new TestLinklist<>();
		t2.add("aa");
		t2.add("ab");
		t2.add("as");
		t2.add("asaa");
		System.out.println(t2);
		System.out.println(t2.get(2));
		t2.remove(1);
		System.out.println(t2);
		t2.add(2,"梅海迪");
		System.out.println(t2);  
		
		
		
		
		
	}
}

HashSet

package 容器;

import java.util.HashMap;

public class TestHashSet {
	HashMap map;
	private static final Object PRESENT =new Object();
	
	public TestHashSet()
	{
		map=new HashMap();
	}
	public void add(Object o)
	{
		map.put(o, PRESENT);
	}
	public int size()
	{
		return map.size();
	}
	@Override
	public String toString() {
		StringBuilder sb =new StringBuilder("[");
		for(Object key:map.keySet())
		{
			sb.append(key+",");
		}
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
	}
	public static void main(String[] args) {
		TestHashSet m1= new TestHashSet();
		m1.add("aa");
		m1.add("bb");
		m1.add("aa");
		m1.add("cc");
		System.out.println(m1);
		
	}
	
}

Map集合及其遍歷

Map中存儲鍵值對,鍵名不能重複,鍵值可以重複。

map中常見函數

  • size()
  • isEmpty()
  • get(object)
  • put(k,v)
  • clear()
  • keySet()
  • entrySet()
  • remove(object)

手寫hashmap

package 容器;

public class TestHashMap<K,V> {
	Node2[] table;
	int size;
	
	public TestHashMap()
	{
		table =new Node2[16];
		
	}
	public String toString() {
		StringBuilder sb =new StringBuilder("{");
		
		for(int i=0;i<table.length;i++)
		{
			Node2 temp=table[i];
			while(temp!=null)
			{
				sb.append(temp.key+":"+temp.value+",");
				temp=temp.next;
			}
		}
		sb.setCharAt(table.length-1, '}');
		return sb.toString();
		
		
	}
	public V get(K key)
	{
		int hash=myhash(key.hashCode(), table.length);
		V value=null;
		
		if(table[hash]!=null)
		{
			Node2 temp=table[hash];
			while(temp!=null)
			{
				if(key.equals(temp.key))
				{
					value=(V)temp.value;
					break;
				}
				else
				{
					temp=temp.next;
				}
			}
		}
		return value;
		
		
	}
	public void put(K key,V value)
	{
		Node2 newNode =new Node2<>();
		newNode.hash=myhash(key.hashCode(), table.length);
		newNode.key=key;
		newNode.value=value;
		newNode.next=null;
		
		Node2  temp=table[newNode.hash];
		Node2  iterLast= null;
		boolean keyRepeat=false;
		
		if(temp==null)
		{
			table[newNode.hash]=newNode;
			size++;
		}
		else
		{
			while(temp!=null)
			{
				if(key.equals(temp.key))
				{
					keyRepeat=true;
					temp.value=value;
					
					break;
					
				}
				else
				{
					iterLast=temp;
					temp=temp.next;
					
				}
				
			}
			if(keyRepeat==false)
			{
				newNode=iterLast.next;
				size++;
			}
		}
		
	}
	public int myhash(int v,int length)
	{
		return v&(length-1);
	}
	
	public static void main(String[] args) {
		TestHashMap<Integer,String> m1=new TestHashMap<>();
		m1.put(10, "梅");
		m1.put(20,"海");
		m1.put(30,"迪");
		
		System.out.println(m1);
		System.out.println(m1.get(10));
		
	}
	
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章