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));
}
}