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

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;
 }
 以上三个实现的数据结构都经过测试,能实现其所写功能。
分享到:
评论

相关推荐

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

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

    JAVA SE 开发手册.CHM

    14、JAVA集合框架之list接口、LinkedList类、ArrayList类、Vector类 15、JAVA集合框架之Set接口、HashSet类、TreeSet类 16、JAVA集合框架之Map接口、HashMap类、Trelap类、Hashtable类 17、JAVA异常Exception 18...

    java面试大全视频版

    Java面试题10.ArrayList 和LinkedList的区别 Java面试题11.HashMap和HashTable的区别 Java面试题12.实现一个拷贝文件的工具类要使用字节流还是字符串 Java面试题13.线程的的实现方式?怎么启动线程?怎么区分线程? ...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解2:Queue和LinkedList Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java集合详解5:深入...

    data-structures:高中数据结构课的数据结构和排序算法

    数据结构 北卡罗来纳科学与数学学院在 CS410(数据结构)中创建的... 实现IList.java接口的 LinkedList 数据结构。 DuhHashTable.java 实现IList.java接口的 HashTable 数据结构。 节点.java 在DuhLinkedList.java

    DataStructureJava:主要数据结构——java中的简单实现

    数据结构Java 主要数据结构——java中的简单实现如何使用集合:-&gt; JDK(Java集合)-&gt; Guava(谷歌)-&gt; Commons-collections(Apache) 主要抽象数据结构——ADS列表(ArrayList、LinkedList、Vector)栈(FIFO)队列...

    01java基础-集合知识点详解.xlsx

    就是一些通用java集合知识点整理,ArrayList LinkedList,HashMap,HashTable ,ConcurrentHashMap,HashSet,LinkedHashSet类通过线程安全否: 底层: 初始值: 扩容 : 区别(对比优势) 图解

    JavaSE 笔试 精华

    1. java.util.*包的UML结构图。 Collection List LinkedList ArrayList Vector Stack Set HashSet Map HashMap Dictionary Hashtable Comparetor 2. Vector和ArrayList、LinkedList区别? Hashtable 和 HashMap之间...

    Java工程师面试复习指南

    Java集合详解:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解:Queue和LinkedList Java集合详解:迭代器,快速失败机制与比较器 Java集合详解:HashMap和HashTable Java集合详解:深入理解...

    Java 基础核心总结 +经典算法大全.rar

    ArrayList Vector LinkedList 类Stack HashSet TreeSet LinkedHashSet 类 PriorityQueue HashMap TreeMap 类 LinkedHashMap 类 Hashtable 类IdentityHashMap 类WeakHashMap 类 Collections 类集合实现类特征图 泛形 ...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题10.ArrayList LinkedList.mp4 │ Java面试题11.HashMap和HashTable的区别.mp4 │ Java面试题12.实现一个拷贝文件的类使用字节流还是字符串.mp4 │ Java面试题13.线程的实现方式 怎么启动线程怎么区分...

    Java后端面试问题整理.docx

    • 熟悉常用集合数据结构(数组、Hashmap、ConcurrentHashMap、HashTable、ArrayList、Vetor、LinkedList、HashSet、TreeSet、LinkedHashSet),了解AVL、RBtree、B/B+树、跳表 • 熟悉常见异常分类以及处理,熟悉反射...

    java jdk实列宝典 光盘源代码

    java为数据结构中的列表定义了一个接口类java.util.list同时提供了3个实现类,分别是ArrayList、Vector、LinkedList使用; 生成不重复的随机数序列;列表、集合与数组的互相转换;java为数据结构中的映射定义一个接口...

    java-Exe5_1.rar_Exe5_3_exe5_exe5_1_exe5_2_java-Exe5_1

    1. 分别使用Vector、Hashtable、Stack,ArrayList、LinkedList和HashSet作为容器类,实现以下要求: (1) 向容器中添加1,000,000个随机整数。 (2) 遍历容器中的所有元素。 (3) 随机产生100,000个整数,在容器中查找...

    Java集合框架完整说明便于了解集合

    java集合在日常开发中经常用到,对基础的掌握尤其重要,其中List,Set,Map的作用以及使用的场景和分类描述,其中Arraylist 与 LinkedList 区别,HashSet与TreeSet与LinkedHashSet对⽐,LinkedHashMap和HashMap,...

    Java 最常见的 208 道面试题:第二模块答案

    25. ArrayList 和 LinkedList 的区别是什么? 26. 如何实现数组和 List 之间的转换? 27. ArrayList 和 Vector 的区别是什么? 28. Array 和 ArrayList 有何区别? 29. 在 Queue 中 poll()和 remove()有什么区别? ...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题10.ArrayList 和LinkedList的区别 Java面试题11.HashMap和HashTable的区别 Java面试题12.实现一个拷贝文件的工具类要使用字节流还是字符串 Java面试题13.线程的的实现方式?怎么启动线程?怎么区分线程? ...

    Java集合多线程安全.docx

    import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * @author: Raicho * @Description: * @program: mianshi * @create: 2020-07-17 15:32 **/ public class ...

    java面试题.docx

    ArrayList 和 LinkedList 的区别是什么? 并行和并发有什么区别? 说一下 runnable 和 callable 有什么区别? 线程的 run()和 start()有什么区别? 创建线程池有哪几种方式? 在 java 程序中怎么保证多线程的运行...

    Java实验报告

    正确使用字符串相关类(String,StringBuffer,StringTokenizer),日期类(Date、Calendar);另外,还有ArrayList、LinkedList、HashTable、TreeSet等都涉及在内。用Java实现对数据的增、删、改、查功能。

Global site tag (gtag.js) - Google Analytics