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

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--ArrayListLinkedList、HashSet、HashMap、Hashtable、Collection、Collections详解 1.ArrayList ArrayList是List接口的实现类,一种大小可变数组,随着元素的增多,容量会自动扩充,默认初始容量值是10,也可以自己指定初始容量 采用的数据结构:数组 (线性表:数组、链表、队列、栈 非线性表:二叉树、堆、图等) ArrayList优点: 查询速度快 ArrayList缺点: 新增删除元素比较慢 查询速度快的原因: ArrayList底层是数组实现的,根据下标查询,不需要比较,查询方式为,首地址+(元素长度*下标),基于这个位置读取相应的字节数,所以非常快; 新增删除慢的 阅读详情

相关推荐

自定义实现LinkedList

自定义实现ArrayList数据结构,有大量注释以及编写思路,帮助新手用Java语言来实现数据结构

纯手写LinkedList集合框架

LinkeList原理 LinkedList ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同。LinkedList 是基于链表实现的(通过名字也能区分开来),所以它的插入删除操作比 ArrayList 更加高效。但也是由于其为基于链表的,所以随机访问的效率要比 ArrayList 差。 LinkedList数据结构原理 LinkedList底层的数据...

飞上云端看彩虹 853

java中各种集合

首先看一下他们之间的关系 其他参考:http://blog.csdn.net/comkingfly/article/details/7327657   Collection          接口的接口   对象的集合 ├ List                   子接口      按进入先后有序保存   可重

我只是坚持我的兴趣。 1462

Java中List、HashMap、HashTable的详细用法

1.list中添加,获取,删除元素;   添加方法是:.add(e);  获取方法是:.get(index);  删除方法是:.remove(index); 按照索引删除;  .remove(Object o); 按照元素内容删除; List<String> person=new ArrayList<>(); person.add("jackie"); //索引为0 //.add(e) person.a

独旅天涯 1052

Java常用数据结构分析 【ArrayList, Vector,LinkedList, HashMap, HashTable

Vector, ArrayListLinkedList  VectorArrayList VectorArrayList在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。  Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。  当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它

sunny09290的专栏 887

ArrayListLinkedList‌的区别

‌:HashMap不是线程安全的,而HashTable是线程安全的。‌:HashMap允许键值为null,而HashTable不允许键或值为null,尝试插入null会抛出NullPointerException。‌:HashMap只支持Iterator遍历,而HashTable支持IteratorEnumeration两种方式遍历。HashTable默认初始容量为11,扩容时容量变为原来的2倍加1。‌:由于HashTable的线程安全特性,其性能通常低于HashMap,尤其是在单线程环境下。

2403_87122707的博客 295

Java集合基本数据结构(快速理解版)

目录Collection接口ListArrayListLinkedListVectorSetHashSetLinkedHashSetTreeSetMap接口HashMapLinkedHashMapTreeMapHashtable

门牙咬脆骨的奋斗日志 2157

java 数据结构区别_JAVA几种常见数据结构类型的区别

这是一个程序员的自我修养,一个学术者的自我探索,一个大神的养成之道。String:String对象的长度一旦定义就固定就不可以改变,对于已经存在的String对象的修改都是创建一个新的对象,然后把新的值存进去,String类不能被继承。StringBuffer:StringBuffer是一个可变对象,当对它进行修改的时候不会像String那样重新建立对象。它只能通过构造函数来建立对象。另外Stri...

weixin_42129005的博客 340

Java集合

Java集合说List Set Map 之间的区别:有序,可重复,存储单个对象。:无序(或特定实现有序),不可重复,存储单个对象。:无序,遍历顺序不确定。:有序,遍历顺序插入顺序一致。:有序,遍历顺序按元素的自然顺序或指定的排序规则排列。因此,如果你需要一个无序集合,HashSet是常用的选择;如果你需要维持插入顺序或排序顺序,可以选择或TreeSet。:键值对存储,键无序(或特定实现有序),键不可重复,值可重复。这些集合在java中都有那些对应实现类 以及底层数据结构ArrayList

huahuaiyuyu的博客 1010

java数据结构

数据结构的分类: 1,collectioncollections的区别 collection是listset顶层接口,collections是集合工具类 2,ArrayListlinkedlist的区别(重点) ArrayList底层数组结构,查询快(因为数组结构有角标,根据对应的角标位置能直接获取到要查询的数据),增删慢(因为数组严格有序,当增删数据,除了操作对应位置的数据本身,还需要对数组内其他数据进行重新位置的排序,内存分配空间动态发生变化,所以效率比较低),线程不安全,使用效率较高。 link

m0_53587898的博客 126

Java中的Collection类

http://blog.csdn.net/asklxf/archive/2004/01/06/15992.aspx     线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类。 Collection├List│├LinkedLi

DengBo的Blog 1939

java集合框架学习总结

这是我自己目前学习的总结,方便复习。

weixin_70964589的博客 1094

数据结构ArrayList、Vector、LinkedListHashMap、HashTable、LinkedHashMap、TreeMap

一、ArrayList、Vector、LinkedList ArrayList Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加插入元素,二者都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快,插入数据慢;Vector由于使用了synchronized方法(如add、insert、remove、set、equals、hashcode等

CTO成长之路——Rosanu 3303

面试官都惊呆了!这些Java集合框架问题你绝不能错过!

在面试中,Java集合框架是经常被问到的知识点之一。但是,你是否真的掌握了所有的问题答案呢?今天,我要分享一些你可能从未听说过的Java集合框架问题,帮助你在面试中脱颖而出!

Q2024107的博客 855

Java集合框架面试题

JavaGuide/Java/这几道Java集合框架面试题几乎必问.md Arraylist LinkedList 异同 补充:数据结构基础之双向链表 ArrayList Vector 区别 HashMap的底层实现 JDK1.8之前 JDK1.8之后 HashMap Hashtable 的区别 HashMap 的长度为什么是2的幂次方 Has...

qq_40516725的博客 286

hashmap,hashtable,linkedhashmap,treemap,arraylistlinkedlist

HashMap是无序的(是针对往map里面put值的顺序而言),但是如果key值是long或者intger时,他会按照key值从小到大的顺序排列,并且key值一样时,value值会被替换 linkedhashmap,treemap是有序的(是针对往map里面put值的顺序而言,貌似是倒序) 1、Hashtable是早期提供的接口,HashMap是新版JDK提供的接口。 2、Hashtable继承Dictionary类,HashMap实现Map接口。 3、Hashtable线程安全,HashM.

潘少的博客 229

Java集合框架万字详解

本文深入解析了Java集合框架的核心实现原理,主要包括: ArrayList基于动态数组实现,扩容机制为1.5倍增长,随机访问O(1)性能; LinkedList采用双向链表结构,头尾操作O(1)性能; HashMap在JDK8后引入数组+链表/红黑树结构,通过哈希算法扩容机制保证性能; LinkedHashMap通过双向链表维护元素顺序; Set接口实现(HashSet/TreeSet)基于对应Map实现; 迭代器提供统一遍历方式,包含fail-fast机制; 泛型在集合中的应用类型擦除原理; Col

油墨香^-^的博客 709

java arraylist用法_我在Java的第017天

学习Java已经17天,来看看今天学了啥……分别是: 基本概念_Collection_Set_List接口的介绍; List接口ArrayList用法;ArrayList_JDK源码分析; LinkedList的特点_链表_JDK源码分析; Vector用法ArrayList区别;Map接口_HashMap_Hashtable的用法; HashMap的底层原理等。 Collec...

weixin_34017901的博客 105
上一篇: 对Java中继承的初步认识
下一篇: first blood!
domphy
博客等级 码龄11年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值