`
kazhi
  • 浏览: 2530 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

JAVA数据结构之实现简易ArrayList,LinkedList,HashTable

    博客分类:
  • JAVA
 
阅读更多

ArrayList,LinkedList,HashTable三者是JAVA中的三种常见的数据结构,当然它们的性能有不同的差异,比如数据查找速度,增加或删除数据的速度,内存空间占用等等,这将在下篇博客中体现,这篇博客只是大致应用数据结构知识来自己实现三种数据结构的基本功能,包含一些简单的增查改删功能。

ArrayList:

public  class ArrayList {


	private int counts;  				//数组实际填充大小
	private int stepcount;				//数组将溢出时的扩充步长
	Object[] data =new Object[10];   	//默认数组长度为10
	
//无参的构造方法,默认扩充步长为100
	public ArrayList(){
		stepcount=100;
	}

//带初始数组长度与扩充步长的构造方法
	public ArrayList(int initlen,int stepcount){
		 data=new Object[initlen];
		this.stepcount=stepcount;
		
	}
		
	
//给数组添加新数据
	public void add(Object obj){
		
		if(counts>=data.length){          	 //判断有无溢出,溢出则增加数组长度stepcount,并将原数组数据放入新数组
				Object[] data2=new Object[data.length+stepcount];
				for(int i=0;i<data.length;i++){
						data2[i]=data[i];
			}
			data=data2;
		}
		data[counts++]=obj;
	}
	
//获得指定数组位置的内容
	public Object get(int index){
		if(index<0||index>data.length){
			System.out.println("超出数组限定范围");
			return null;
		}
		return data[index];
	};
//删除指定位置的元素
	public void remove(int index){
		Object[] data2 = new Object[data.length-1];
		for (int i=0;i<index;i++){
			data2[i]=data[i];
		}
		for (int i=index+1;i<data.length;i++){
			
			data2[i-1]=data[i];
		}
		data=data2;
		Object obj =data[index];
		
		
	}
//获得数组大小
	public int size(){
		return counts;
		
	}
//在指定位置插入元素
	public void insert(Object obj,int index){
		Object[] data2 =new Object[data.length+1];  //新建一数组才可从数组中间插入,此时新数组长度需至少加一
		for(int i=0;i<index;i++){
			data2[i]=data[i];
		}
		data2[index]=obj;
		for(int i=index+1;i<data2.length;i++){
			data2[i]=data[i-1];
		}
			
		data=data2;
		
	}
	
}

LinkedList:

 

public class MyLinkList implements List {
	//声明根节点
	private Node root=null
	private Node tail,tempt;
	private int total;
	
	//给链表添加元素
	public void add(Object obj) {
		
		Node newnode =new Node();
		if (root==null){
			newnode.data=obj;
			root=newnode;
			tail=newnode;
		}
		else{
			tail.next=newnode;
			newnode.data=obj;
			tail=newnode;
		}
		total++;
		
	}
	//获取链表指定位置元素(为便于习惯,默认从一开始)
         public Object  get(int index) {
		if(index==0){
			return null;
		}
		if(index-1==0){
			return root.data;
		}
		else {
			tempt=root;
			for(int i=1;i<index;i++){
				 tempt=tempt.next;
			}
			return tempt.data;
		}
		
	}
	//删除某指定链表元素
	public void remove(int index) {
		
		if(index-1==0){
			root=root.next;
		}
		else {
				tempt=root;
			for(int i=1;i<index-1;i++){
				 tempt=tempt.next;
			}
			tempt.next=tempt.next.next;
		}
		total--;
		
	}
        //获得链表的大小
	public int size() {
		return total;
	}
        //给链表指定位置插入某元素
	public void insert(Object obj, int index) {

		Node insertNode =new Node();
		insertNode.data=obj;
		if(index-1==0){
			insertNode.next=root;
			root=insertNode;
		}
		else {
				tempt=root;
			for(int i=1;i<index-1;i++){
				 tempt=tempt.next;
				
			}
			insertNode.next=tempt.next;
			tempt.next=insertNode;
		}
		total++;
	}
	//该链表内部类实现对Node的定义
	 class Node{
		 Object data;
		 Node next;
		 Node(Node next,Object data){
                      this.next=next;
                      this.data=data;
                   }
	}

}
  HashTable:
public class MyHashTable{
   private Object[] saveKey;    //存关键字的数组
   private int size;            //数组大小
   
   
 //无参的构造函数
  public MyHashTable(){             
     saveKey= new Object[16];	//默认数组长度是16	
      size = 0;
  }
 //带参数的构造函数
  public MyHashTable(int  arraylenght,int size){
	  saveKey=new Object[arraylenght];
	  this.size=size;
	  
  }
 //哈希函数
  public int hash(Object  obj){                                       
        return Math.abs(obj.hashCode())%saveKey.length;
  }
  //处理冲突的哈希函数
  public int hashForCollision(Object  obj){                                    
      int newhash = Math.abs(obj.hashCode())%(saveKey.length-1);//这里调用里JDK里自有的hashcode方法后实现映射
     
      if(newhash%2==0){
          return newhash + 1;
      }
   return newhash;
  }
  //判断哈希表里面是否已有某对象
  public boolean contains(Object obj){                  
      int i = hash(obj);
      
      while (saveKey[i] != null){
           if(saveKey[i].equals(obj)){
               return true;
           }
        i = (i + hashForCollision(obj))%saveKey.length;

      }
   return false;
  }
  //添加新元素
  public void add(Object obj){
       //先判断是否需要扩容,若已有数据占原数组一半,则扩容
       if(size>=saveKey.length/2){
            this.rehash();
       }
      int i = hash(obj);//获取其哈希值
     while(saveKey[i] != null){  
         if(obj.equals(saveKey[i])){
              return;
         }              //判断该索引处是否已占用,若占用则调用hashforcollision生成新地址
       i = (i + hashForCollision(obj))%saveKey.length;

     }
    saveKey[i] = obj;
    size ++;
  }
  //扩大哈希表为原表的四倍,并把原来的哈希表添加到新表中
   public void rehash(){                             
       MyHashTable ht = new MyHashTable();
       ht.saveKey = new String[this.saveKey.length * 4];
       for(int i = 0; i < this.saveKey.length; i ++){
               if((this.saveKey[i] != null)){
                   ht.add(this.saveKey[i]);
              }
       }
     this.saveKey = ht.saveKey;
     this.size = ht.size;
   }
   //删除某个元素
  public void remove(Object obj){                    
         if(this.contains(obj)){
              int i = this.getIndex(obj);
              this.saveKey[i] = null;
         }
  }
  //得到某对象在哈希表中的位置
  public int getIndex(Object obj){               
    int i = this.hash(obj);

    while(this.saveKey[i] != null){
       if(this.saveKey[i].equals(obj)){
           return i;
       }
     i = (i + this.hashForCollision(obj))%this.saveKey.length;

   }
  return -1;
  }
  //获取哈希表中某元素
  public Object  get(Object obj){
	  if(this.contains(obj)){
          int i = this.getIndex(obj);
          return saveKey[i] ;
     }
	  return null;
  }
//输出哈希表中所有元素
  public void print(){                       
     for(int i = 0; i < saveKey.length; i ++){
        System.out.println(i+":"+saveKey[i]);
    }
  }
//哈希表存储元素的个数
public int size(){          
   return this.size;
 }
//哈希表的长度
public int length(){          
    return this.saveKey.length;
 }
 以上三个实现的数据结构都经过测试,能实现其所写功能。
分享到:
评论

相关推荐

    比较Vector、ArrayList和hashtable hashmap

    - 在选择使用哪种数据结构时,需要考虑性能需求、线程安全性以及是否允许重复元素等因素。例如,如果需要高并发且线程安全,可以选择 Vector 或者同步控制的 ArrayList;如果对性能要求较高且无需线程安全,...

    数据结构常考知识点(java实现版)

    在Java中实现数据结构,可以利用其强大的类库和面向对象特性。以下将详细介绍标题和描述中涉及的数据结构常考知识点及其Java实现。 1. 线性表: 线性表是最基础的数据结构,包括数组和链表两种形式。在Java中,数组...

    Java容器类List、ArrayList、Vector及map、HashTable应用

    List、ArrayList、Vector及map、HashTable是Java中常用的容器类,它们都继承自Collection接口,并提供了不同的实现方式和特点。在实际开发中,选择合适的容器类是非常重要的。 Collection接口是Java中最基本的集合...

    java数据结构课件与分析

    5. **集合框架**:Java的`java.util`包提供了丰富的集合类,如ArrayList、LinkedList、HashSet、HashMap等。学习这些集合类的特性和使用场景,以及它们与数据结构的关联。 6. **映射(Map)**:理解键值对的概念,...

    java数据结构

    首先,数组是Java中最基本的数据结构之一,是相同类型变量的集合。数组可以是一维或多维的,通过下标来访问数组元素。Java中数组的初始化和内存分配是一个重要概念,包括动态数组的概念和Java的边界检查机制。 简单...

    java数据结构总结

    下面将详细解释这些数据结构及其在Java中的实现。 1. **数组**:数组是最基本的数据结构,它是一系列相同类型元素的集合,可以通过索引来访问和修改。在Java中,数组是固定大小的,一旦创建就不能改变大小。 2. **...

    java 数据结构的源代码

    8. 哈希表(Hashtable):哈希表是一种通过哈希函数快速定位元素的数据结构,Java的Hashtable类即为一个线程安全的哈希表实现。注意,Hashtable不接受null键和值,而HashMap则允许。 9. 树(Tree):二叉树和多叉树...

    java数据结构需要的来

    根据给定的文件信息,我们将深入探讨Java中的一些核心数据结构及其在`java.util`包中的实现。 ### 线性表、链表与哈希表 #### 线性表 线性表是数据结构中最基础的一种,其特点是数据元素之间存在一对一的线性关系...

    Java数据结构和算法 (第二版)

    在Java中,这些数据结构通常通过类或接口来实现,如ArrayList、LinkedList、Stack、Queue等。理解这些数据结构的特性(如插入、删除、查找的时间复杂度)对于选择合适的数据结构至关重要。 2. **栈和队列** 栈是一...

    Java超详细!Java实现数据结构PPT课件

    线性数据结构动态数组(ArrayList) 链表(LinkedList) 单向链表 双向链表 循环链表 静态链表 栈(Stack) 队列(Queue) 双端队列(Deque) 循环队列 哈希表(HashTable) 树形数据结构 二叉树(BinaryTree)、...

    java描述版数据结构(简单易懂)

    Java提供了`java.util.Stack`和`java.util.Queue`接口及其实现类来操作这两种数据结构。 三、链表 链表是另一种线性数据结构,与数组不同,链表的元素不连续存储,而是通过节点间的引用连接。这使得链表在插入和...

    java版数据结构程序

    Java作为一门面向对象的语言,以其强大的跨平台能力和丰富的库支持,成为实现数据结构的理想选择。 首先,我们要了解什么是数据结构。数据结构是组织和存储数据的方式,它决定了数据的访问效率和处理速度。常见的...

    java 数据结构

    在Java中,数据结构的实现通常依赖于内置的类库,如ArrayList、LinkedList、HashSet等,但理解其底层原理和自定义数据结构的能力能使开发者在面对特定问题时更加游刃有余。 文档中可能涵盖以下主要知识点: 1. **...

    Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

    LinkedList是List接口的另一个实现,它基于双向链表实现,对于在列表中间插入和删除元素,LinkedList的性能优于ArrayList,因为不需要移动元素。但在随机访问元素时,LinkedList的性能较差,因为需要从头或尾部开始...

    数据结构(java版)课件

    本课件“数据结构(Java版)”专注于使用Java编程语言来实现各种数据结构,由电子工业出版社出版,由叶核亚编著。Java作为一种广泛应用的面向对象的编程语言,其丰富的类库和强大的内存管理机制使得实现复杂的数据...

    Java数据结构上机实践指导教程(PDG)

    4. **队列**:先进先出(FIFO)的数据结构,Java的java.util.Queue接口及其实现类,如ArrayDeque,提供了enqueue和dequeue操作。 5. **树结构**:包括二叉树、二叉搜索树、平衡树(如AVL树和红黑树)。Java的...

    详解如何选择使用ArrayList、HashTable、List、Dictionary数组

    HashTable是一种基于键值对的数据结构,提供快速的查找功能。由于不允许重复键,它的容量通常是质数,以优化哈希函数。然而,HashTable同样是非泛型的,导致了装箱和拆箱。为了解决这个问题,.NET 2.0推出了...

Global site tag (gtag.js) - Google Analytics