Java容器-集合框架

一、java集合框架体系图

Java 容器分为 Collection 和 Map 两大类,其下有很多子类如图:

二、Collection 和 Collections 有什么区别?

1. Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,实现该接口的类主要有List和Set。

2. Collections是一个集合框架的工具类,包含了很多静态方法,比如一些对集合的排序,搜索以及序列化等操作。(例:排序方法->Collections. sort(list))

三、HashMap和Hashtable有什么区别?

HashMap和Hashtable都是Java中用来实现映射关系的数据结构,它们之间的主要区别:

  1. 线程安全性:Hashtable是线程安全的,而HashMap是非线程安全的。

  1. 同步性: Hashtable是同步的,而HashMap是非同步的。这意味着在多线程环境下使用HashMap时要更加小心,因为它不能保证在并发环境下的安全性。

  1. null值: Hashtable不允许键值或值为null,而HashMap允许一个null键和任意数量的null值

  1. 性能: 由于Hashtable的同步特性,在单线程环境下使用HashMap比使用Hashtable要快。

  1. 另外jdk1.8之后,HashMap和Hashtable在实现方式上也有了区别。

  1. 在使用上也有区别,比如在jdk1.4以前使用Hashtable,jdk1.4以后使用HashMap会更好。

总结来说,HashMap适合单线程环境使用,而Hashtable适合多线程环境使用。

四、List接口中ArrayList的底层实现

1. 首先 我们先点进去看一下ArrayList的底层代码,如图:

2. 那我们就使用Object[]类型的数组和size属性实现ArrayList的增删改查方法


package com.bdqn.MyList.MyArrayList;

public class MyArrayList {

private Object[] array; //获取当前数组的引用

private int size; //获取当前数组的长度

/*

新增指定元素

*/

public void add(Object ob){

if (array==null){

array = new Object[1];

array[0] = ob;

}else {

Object newarray[] = new Object[array.length+1];

//先循环复制以前的内容到新数组

for (int i = 0; i < array.length; i++) {

newarray[i] = array[i];

}

//再把新元素放到最后一个位置即可

newarray[array.length] = ob;

//替换全局变量引用 保证array指向最新的

array = newarray;

}

}

/*

根据下标删除指定元素

*/

public void del(int index){

if (index<0 || index>=array.length){

System.err.println("下标超出范围");

}else {

Object newarray[] = new Object[array.length-1];

for (int i = 0; i < array.length; i++) {

if (i<index){

newarray[i]=array[i];

}else if (i>index){

newarray[i-1]=array[i];

}

}

array = newarray;

}

}

/*

根据传入的下标跟元素 修改

*/

public void update(int index,Object ob){

if (index<0 || index>=array.length){

System.out.println("下标越界");

return;

}

array[index] = ob;

}

/*

历遍展示整个集合

*/

public void show(){

for (Object ob:array) {

System.out.println("["+ob+"]");

}

}

/*

size生成的get、set方法

*/

public int getSize() {

size = array.length;

return size;

}

public void setSize(int size) {

this.size = size;

}

}


package com.bdqn.MyList.test;

/**

* 测试类

*/

import com.bdqn.MyList.MyArrayList.MyArrayList;

public class Test {

public static void main(String[] args) {

MyArrayList list=new MyArrayList();

list.add(3); //添加

list.add(2);

list.add(1);

list.del(1); //删除

list.update(0,4); //修改

list.show(); //查看

}

}

//结果输出为 [4] 换行 [1]

五、List接口中LinkedList的底层实现

1. Node.java


package com.bdqn.MyList.MyLinkedList;

/**

* 节点类

*/

public class Node {

public Object element; //本节点自身的内容

public Node next; //保存下一个节点的引用地址

public Object getElement() {

return element;

}

public void setElement(Object element) {

this.element = element;

}

}

2. MyLinkedList.java


package com.bdqn.MyList.MyLinkedList;

/**

* 链表类

*/

public class MyLinkedList {

private Node root; //头节点 一定要有 不能丢

/*

新增

*/

public void add(Object ob){

Node node = new Node();

node.element = ob;

if (root==null){

root = node; //如果是第一次新增

}else {

//传统的for循环搞不定 while

Node temp = root;

while(temp.next!=null){

temp = temp.next;

} //循环结束以后 那么此时temp自然就定位到了最后一个节点

temp.next = node; //尾巴后面加入新节点

}

}

/*

获取链表的实时长度

*/

public int getLength(){

Node temp = root;

int sum = 1;

while (temp!=null){

temp = temp.next;

sum++;

}

return sum;

}

/*

链表删除

*/

public void delete(int index){

if (index<0 || index>getLength()){

System.out.println("下标越界");

}else {

//假设index=3 要找到2元素(上一个)

if (index==0){

root = root.next; //删头

}else {

Node temp = root;

int a = 0;

while (temp!=null){

//此时 并未完成被删除节点的清空操作

if (a==index-1){

temp.next = temp.next.next;

break;

}

temp = temp.next;

a++;

}

}

}

}

/*

修改

*/

public void update(int Index, Object obj) {

// 判断位置下标是否合法

System.out.println("下标->"+Index);

if (Index < 0 || Index > getLength()) {

System.out.println("下标越界");

} else {

Node temp=root;

System.out.println(temp.next.element);

for (int i = 0; i < Index; i++) {

temp=temp.next;

}

temp.setElement(obj);

}

}

/*

遍历整个链表

*/

public void show(){

Node temp = root;

while (temp!=null){

System.out.println("["+temp.element+"]");

temp = temp.next;

}

}

}

3. Test.java


package com.bdqn.MyList.test;

/**

* 测试类

*/

import com.bdqn.MyList.MyLinkedList.MyLinkedList;

public class Test {

public static void main(String[] args) {

MyLinkedList list=new MyLinkedList();

list.add(1);

list.add(2);

list.add(3);

list.add(4);

list.delete(3);

list.update(1,5);

list.show();

}

}

//运行结果如图:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值