日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA基础之自定义容器实现

發布時間:2025/3/11 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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];}/*** 增加元素** @param o*/public void add(Object o) {ensureCapacity();elements[size++] = o;}/*** 指定位置增加元素** @param index* @param 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;}}/*** 按照下標進行索引** @param index* @return*/public Object get(int index) throws Exception {indexCheck(index);return elements[index];}/*** 下標合法性檢測** @param index* @return* @throws Exception*/private boolean indexCheck(int index) throws Exception {if (index < 0 || index >= size) {throw new Exception("輸入不合法");}return true;}/*** 根據下標刪除元素** @param index* @throws Exception*/public void remove(int index) throws Exception {indexCheck(index);System.arraycopy(elements, index + 1, elements, index, size - index);--size;}/*** 根據對象刪除元素** @param o*/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;}}}}/*** 返回元素個數** @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;/*** 增加一個元素* @param o*/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;}/*** 在指定位置添加元素* @param index* @param o* @throws Exception*/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("輸入錯誤");}/*** 根據下標進行索引* @param index* @return* @throws 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;}/*** 返回尺寸* @return*/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];}/*** 增加一個鍵值對* @param key* @param value*/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){// key 唯一if (root.key.equals(key)){root.value = value;return;}root = root.next;}root.next = new Node(key, value);}++size;}/*** 確保容量* @param index*/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;}}/*** 計算下標* @param key* @return*/private int calculateIndex(Object key){int index = key.hashCode() % DEFAULT_CAPACITY;index = index > 0 ? index : -index;return index;}/*** 是否存在key* @param key* @return*/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;}/*** 通過key獲取鍵值對value* @param key* @return*/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;}/*** 是否為空* @return*/public boolean isEmpty(){return size == 0;}/*** 尺寸* @return*/public int size(){return size;}/*** 是否包含鍵* @param value* @return*/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;}/*** 刪除一個元素* @param key*/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基础之自定义容器实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。