生活随笔
收集整理的這篇文章主要介紹了
JAVA基础之自定义容器实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
容器
容器主要是指Collection所包含的實現類,常用的有List、Map以及Set三種結構。本文主要介紹了幾種常見的集合實現類,對它們進行自定義實現。
- ArrayList:有序的容器列表,順序存儲著元素,可以使用下標進行索引,底層使用數組實現,使用數組拷貝實現擴容,下標索引快,插入效率低。
public class MyArrayList {private int size
;private int DEFAULT_CAPACITY
= 10;private Object
[] elements
;MyArrayList(int capacity
) {elements
= new Object
[capacity
];}MyArrayList() {elements
= new Object
[DEFAULT_CAPACITY
];}public void add(Object o
) {ensureCapacity();elements
[size
++] = o
;}public void add(int index
, Object o
) throws Exception
{indexCheck(index
);ensureCapacity();System
.arraycopy(elements
, index
, elements
, index
+ 1, size
- index
);elements
[index
] = o
;++size
;}private void ensureCapacity() {if (size
>= elements
.length
) {int oldSize
= elements
.length
;Object
[] newElements
= new Object
[oldSize
+ (oldSize
>> 1)];System
.arraycopy(elements
, 0, newElements
, 0, size
);elements
= newElements
;}}public Object
get(int index
) throws Exception
{indexCheck(index
);return elements
[index
];}private boolean
indexCheck(int index
) throws Exception
{if (index
< 0 || index
>= size
) {throw new Exception("輸入不合法");}return true;}public void remove(int index
) throws Exception
{indexCheck(index
);System
.arraycopy(elements
, index
+ 1, elements
, index
, size
- index
);--size
;}public void remove(Object o
) {if (o
== null
) {return;} else {for (int i
= 0; i
< size
; i
++) {if (elements
[i
].equals(o
)) {System
.arraycopy(elements
, i
+ 1, elements
, i
, size
- i
);--size
;return;}}}}public int size() {return size
;}public void clear() {for (int i
= 0; i
< size
; i
++) {elements
[i
] = null
;}size
= 0;}public static void main(String
[] args
) throws Exception
{MyArrayList myArrayList
= new MyArrayList();for (int i
= 1; i
<= 12; i
++){myArrayList
.add(i
+ "a");}myArrayList
.add(2, "cccc");for (int i
= 0; i
< myArrayList
.size(); i
++){System
.out
.println(myArrayList
.get(i
));}System
.out
.println(myArrayList
.size());myArrayList
.clear();System
.out
.println(myArrayList
.size());}
}
輸出:
1a
2a
cccc
3a
4a
5a
6a
7a
8a
9a
10a
11a
12a
13
0
- LinkedList:有序鏈表順序存儲,可以根據下標進行索引,底層采用雙向鏈表,插入速度快,根據下標索引慢。
public class MyLinkedList {private class Node{private Node per
;private Node next
;private Object val
;Node(Object o
){val
= o
;}}private int size
;private Node root
;private Node last
;public void add(Object o
){Node node
= new Node(o
);if(root
== null
){root
= node
;last
= node
;}else {last
.next
= node
;node
.per
= last
;last
= node
;}++size
;}public void add(int index
, Object o
) throws Exception
{indexCheck(index
);Node tmp
= root
;for (int i
= 0; i
< index
; i
++){tmp
= tmp
.next
;}Node node
= new Node(o
);node
.next
= tmp
;node
.per
= tmp
.per
;tmp
.per
.next
= node
;++size
;}private void indexCheck(int index
) throws Exception
{if (index
< 0 || index
> size
)throw new Exception("輸入錯誤");}public Object
get(int index
) throws Exception
{indexCheck(index
);Node tmp
= root
;for (int i
= 0; i
< index
; i
++){tmp
= tmp
.next
;}return tmp
.val
;}public int size(){return size
;}public void clear(){Node tmp
= last
;for (int i
= size
- 1; i
> 0; i
--){last
= last
.per
;tmp
= null
;}size
= 0;}public static void main(String
[] args
) throws Exception
{MyLinkedList myLinkedList
= new MyLinkedList();for (int i
= 1; i
<= 12; i
++){myLinkedList
.add(i
+ "a");}myLinkedList
.add(2, "cccc");for (int i
= 0; i
< myLinkedList
.size(); i
++){System
.out
.println(myLinkedList
.get(i
));}System
.out
.println(myLinkedList
.size());myLinkedList
.clear();System
.out
.println(myLinkedList
.size());}
}
結果:
1a
2a
cccc
3a
4a
5a
6a
7a
8a
9a
10a
11a
12a
13
0
- HashMap:鍵值對,要求key唯一,底層使用數組-鏈表實現,先用元素的Hash值找到對應數組位置,這時可能會出現Hash沖突,為了解決問題,每個數組指向一個鏈表,以解決Hash沖突問題。
public class MyHashMap {private class Node{private Node next
;private Object key
;private Object value
;Node(Object key
, Object value
){this.key
= key
;this.value
= value
;}}private int size
;private Node
[] elements
;private int DEFAULT_CAPACITY
= 100;MyHashMap(){elements
= new Node
[DEFAULT_CAPACITY
];}public void put(Object key
, Object value
){int index
= calculateIndex(key
);ensureCapacity(index
);if (elements
[index
] == null
){elements
[index
] = new Node(key
, value
);}else {Node root
= elements
[index
];while (root
.next
!= null
){if (root
.key
.equals(key
)){root
.value
= value
;return;}root
= root
.next
;}root
.next
= new Node(key
, value
);}++size
;}private void ensureCapacity(int index
){if (index
>= elements
.length
){Node
[] newElements
= new Node
[index
+ 1];System
.arraycopy(elements
, 0, newElements
, 0, elements
.length
);elements
= newElements
;}}private int calculateIndex(Object key
){int index
= key
.hashCode() % DEFAULT_CAPACITY
;index
= index
> 0 ? index
: -index
;return index
;}public boolean
containsKey(Object key
){int index
= calculateIndex(key
);Node root
= elements
[index
];while (root
!= null
){if (root
.key
.equals(key
))return true;root
= root
.next
;}return false;}public Object
get(Object key
){int index
= calculateIndex(key
);Node root
= elements
[index
];while (root
!= null
){if (root
.key
.equals(key
))return root
.value
;root
= root
.next
;}return null
;}public boolean
isEmpty(){return size
== 0;}public int size(){return size
;}public boolean
containsValue(Object value
){for (int i
= 0; i
< elements
.length
; i
++){if (elements
[i
] == null
)continue;Node root
= elements
[i
];while (root
!= null
){if (root
.value
.equals(value
))return true;root
= root
.next
;}}return false;}public void remove(Object key
){int index
= calculateIndex(key
);Node root
= elements
[index
];Node perNode
= null
;if (root
!= null
){while (root
!= null
){if (elements
[index
].key
.equals(key
)){elements
[index
] = root
.next
;--size
;return;}else if (root
.key
.equals(key
)){perNode
.next
= root
.next
;--size
;return;}perNode
= root
;root
= root
.next
;}}}public static void main(String
[] args
) {MyHashMap myHashMap
= new MyHashMap();myHashMap
.put("aaa", 1);myHashMap
.put("bbb", 2);myHashMap
.put("ccc", 3);System
.out
.println(myHashMap
.containsKey("aaa"));System
.out
.println(myHashMap
.containsKey("ddd"));System
.out
.println(myHashMap
.containsValue(1));System
.out
.println(myHashMap
.containsValue(4));System
.out
.println(myHashMap
.size());System
.out
.println(myHashMap
.isEmpty());System
.out
.println(myHashMap
.get("aaa"));System
.out
.println(myHashMap
.get("bbb"));System
.out
.println(myHashMap
.get("ccc"));myHashMap
.remove("aaa");System
.out
.println(myHashMap
.size());}
}
結果:
true
false
true
false
3
false
1
2
3
2
- HashSet:集合,沒有重復的元素,底層使用Map實現。在這里使用jdk自帶的HashMap類進行實現。
public class MyHashSet {public HashMap
<Object
, Object
> hashMap
;private int size
;private Object DEFAULT_OBJECT
= new Object();MyHashSet(){hashMap
= new HashMap
<>();}public void add(Object o
){if (!contains(o
)){hashMap
.put(o
, DEFAULT_OBJECT
);++size
;}}public boolean
contains(Object o
){return hashMap
.containsKey(o
);}public int size(){return size
;}public boolean
isEmpty(){return size
== 0;}public void clear(){hashMap
.clear();size
= 0;}public void remove(Object o
){hashMap
.remove(o
);}public static void main(String
[] args
) {MyHashSet myHashSet
= new MyHashSet();myHashSet
.add("aaa");myHashSet
.add("bbb");myHashSet
.add("aaa");System
.out
.println(myHashSet
.contains("bbb"));System
.out
.println(myHashSet
.size());System
.out
.println(myHashSet
.isEmpty());myHashSet
.remove("aaa");myHashSet
.clear();System
.out
.println(myHashSet
.size());}
}
結果:
true
2
false
0
總結
以上是生活随笔為你收集整理的JAVA基础之自定义容器实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。