`
蛋呢823
  • 浏览: 73175 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java数据结构与算法学习笔记(2)——数组及ArrayList

阅读更多

 

从概念上可知,数组属于线性表(逻辑上一一对应关系),数组在物理内存上采用顺序存储结构。当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组。

优点:可根据索引快速的查找元素。

缺点:大小不可变。(确切应该讲,不能往一个放满元素的数组里再添加新的元素)

 

ArrayList正是保留了数组可以快速查找的优势,同时,又弥补了数组在创建后,要往数组添加元素的弊端。

其实,要往一个已经放满元素的数组里面再添加一个元素,也是可以实现的,即创建一个比原数组容量大一的新数组,将数组中的元素到新数组,再将新的元素也放入新数组,最后将新数组赋给原数组即可。(这也是用数组的方式实现ArrayList的基本方法)

 

int[] oldArray = {1,2,3,4};
int[] newArray = new int[oldArray.length+1];
for(int t =0;t<oldArray.length;t++){
	newArray[t] = oldArray[t];
}/*这里不能直接用newArray=oldArray; 因为这样newArray的大小会变成 跟oldArray一样了。 */  

System.out.println(newArray.length);
newArray[oldArray.length] = 5;

oldArray = newArray;



通过这样的方法,我们可以简单的实现自己的ArrayList

 

 

public class MyArrayList {

	private static Object array[] = new Object[0];
	
	//得到队列的大小
	public int getLength(){
		return array.length;
	}
	//根据索引得到元素
	public Object get(int index){
		return array[index];
	}
	
	public void add(Object obj){
		Object o[] = new Object[(array.length+1)];
		
		for(int t=0;t<array.length;t++){
			o[t]=array[t];
		}
		o[array.length] = obj;
		array = o;
	}
	
	public void add(int index, Object obj){
		Object o[] = new Object[(array.length+1)];
		
		for(int t=0;t<index;t++){
			o[t]=array[t];
		}
		o[index] = obj;
		for(int t=index+1;t<o.length;t++){
			o[t]=array[t-1];
		}
		array = o;
	}
	
	/**
	 * 查找队列中是否存在obj元素
	 * @param obj:要查找的元素对象
	 * @return :返回元素第一次出现的索引位置,若不含该元素则返回-1
	 */
	public int indexOf(Object obj){
		for(int t=0;t<array.length;t++){
			if(array[t].equals(obj)){
				return t;
			}
		}
		return -1;
	}
}

 

 

 

以上便是自己用数组实现的简单的ArrayList

这样子,我们不但保留了数组可以根据索引快速查找的优势,同时,还可以随时往里面添加元素,不过添加元素的效率应该还是没有链表的效率高的,因为需要创建一个新的数组,还要进行搬迁的工作,实在麻烦。

 

 

=============================================

下面请教一下大家怎么称呼ArrayList的?

 

 

一开始学Java的时候,就一直把ArrayList称之为队列(也不知道对不对)。

ArrayList,以其称之为队列,倒不如叫做可增长的数组好了(个人看法)。

现在反倒觉得不恰当了,因为ArrayList根本也没继承队列Queue接口。而且,list在百度词典上有着链表,表的含义,完全没有队列这个意思。

同时,根据百度百科的定义:队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。ArrayList跟队列实在是风马牛不相干呀。

另外,LinkedList则是同时继承了Queue接口跟List接口。

 

 

PS:这篇文档,我反复的更改字体格式,甚至拷到Word中更改完再复制回来,但始终就是发表后,跟我预览的完全不一样...不知道是不是我电脑有问题,还是人品有问题。如造成您的阅读困扰,请谅解!!!

 

 

2
5
分享到:
评论
4 楼 蛋呢823 2011-04-05  
arne3166 写道
赞一个。
javaeye来了这么久,我喜欢这里的氛围,高手云集,而且不拖泥带水,然而有一点近于苛刻的地方就是对新手不太能容忍。我比较喜欢看别人总结的东西,也喜欢自己总结东西,但很怕被踩,因为自己被否定了,并且踩的人不告诉你为什么,这是对于别人的不尊重。
我在这里赞赏博主的总结和分享精神和学习态度。对于内容的深度,没有得到大牛的肯定,被踩了5次可以看出来,但我挺一下,希望javaeye里面的大牛都高抬贵脚,或者能指出真正不足的地方,才能显示你的实力,否则,走开,这不是你看的东西。

赞楼主的总结和分享精神。。。。


感谢你~  作为小菜,深有同感。
3 楼 arne3166 2011-04-04  
赞一个。
javaeye来了这么久,我喜欢这里的氛围,高手云集,而且不拖泥带水,然而有一点近于苛刻的地方就是对新手不太能容忍。我比较喜欢看别人总结的东西,也喜欢自己总结东西,但很怕被踩,因为自己被否定了,并且踩的人不告诉你为什么,这是对于别人的不尊重。
我在这里赞赏博主的总结和分享精神和学习态度。对于内容的深度,没有得到大牛的肯定,被踩了5次可以看出来,但我挺一下,希望javaeye里面的大牛都高抬贵脚,或者能指出真正不足的地方,才能显示你的实力,否则,走开,这不是你看的东西。

赞楼主的总结和分享精神。。。。
2 楼 蛋呢823 2011-03-15  
裴小星 写道
不过JDK里的ArrayList实现,并非每次增加一个元素,
默认情况下初始大小为10,一旦发现容量不足,
就增加为原来的 (n * 3) /2 + 1 个元素(取整)。
如果仍然达不到要求的大小,则将大小设置为所要求的大小。

if (minCapacity > oldCapacity) {
    Object oldData[] = elementData;
    int newCapacity = (oldCapacity * 3)/2 + 1;
    if (newCapacity < minCapacity)
        newCapacity = minCapacity;
    elementData = (E[])new Object[newCapacity];
    System.arraycopy(oldData, 0, elementData, 0, size);
}


这样一来,就避免了频繁创建数组。不过 3/2 这个比例,不知道是怎么估算出来的。


收获很多,O(∩_∩)O谢谢
1 楼 裴小星 2011-03-15  
不过JDK里的ArrayList实现,并非每次增加一个元素,
默认情况下初始大小为10,一旦发现容量不足,
就增加为原来的 (n * 3) /2 + 1 个元素(取整)。
如果仍然达不到要求的大小,则将大小设置为所要求的大小。

if (minCapacity > oldCapacity) {
    Object oldData[] = elementData;
    int newCapacity = (oldCapacity * 3)/2 + 1;
    if (newCapacity < minCapacity)
        newCapacity = minCapacity;
    elementData = (E[])new Object[newCapacity];
    System.arraycopy(oldData, 0, elementData, 0, size);
}


这样一来,就避免了频繁创建数组。不过 3/2 这个比例,不知道是怎么估算出来的。

相关推荐

    java数据结构与算法中文版

    《Java数据结构与算法中文版》是一本深入探讨编程核心领域的书籍,主要针对Java程序员,旨在提升他们在数据处理和问题解决能力上的技能。这本书详细介绍了数据结构和算法的基础理论及其在Java语言中的实现,是Java...

    C、C++、JAVA数据结构与算法电子书

    数据结构与算法是计算机科学的基础,对于理解和编写高效软件至关重要。C、C++和Java都是广泛使用的编程语言,它们在处理数据结构和算法时各有特点。以下是对这三种语言在数据结构与算法方面的一些关键知识点的详细...

    Java数据结构和算法中文第二版_Java数据结构_

    《Java数据结构和算法中文第二版》是一本深入探讨Java编程中数据结构和算法的书籍。数据结构是计算机科学的基础,它涉及到如何有效地组织和存储数据,以便在各种操作下高效地访问和修改。算法则是解决问题的具体步骤...

    java数据结构与算法1

    《Java数据结构和算法中文第二版》和《数据结构与算法分析——Java语言描述》是深入学习的宝贵资料,它们将帮助读者深入理解数据结构的原理和算法的实现,提高编程技能。 通过系统学习这些内容,开发者可以更好地...

    JAVA数据结构与算法

    在编程领域,数据结构与算法是核心基础,对于任何编程语言,包括Java,理解并熟练掌握它们至关重要。本文将深入探讨Java中的数据结构与算法,旨在帮助开发者提升问题解决能力和程序设计技巧。 首先,我们来看数据...

    Java数据结构和算法之Java数组

    总的来说,Java数组是学习数据结构和算法的基础,理解其工作原理和相关操作对于提高编程能力至关重要。通过深入学习数组,你可以更好地应对各种编程挑战,为更复杂的数据结构和算法打下坚实的基础。在实际开发中,...

    JAVA学习笔记————————

    3. **异常处理**:JAVA提供了一种结构化的异常处理机制,学习笔记会解释何时及如何使用try-catch-finally语句块,以及不同类型的异常类。 4. **内存管理与垃圾回收**:JAVA的自动内存管理是通过垃圾回收机制实现的...

    Java 数据结构与算法+源代码 高清版

    总结来说,这份“Java数据结构与算法+源代码高清版”资源涵盖了IT领域的基础核心知识,它可以帮助学习者或开发者从理论到实践全面掌握数据结构和算法,提升编程能力,为解决复杂问题打下坚实的基础。通过深入学习和...

    数据结构与问题求解——java语言描述 源码

    本资料集是基于Java语言的实现,由著名计算机科学家Mark Allen Weiss所著的《数据结构与问题求解——java语言描述》(第三版)的源码。该书通过丰富的实例和深入的理论讲解,帮助读者理解和掌握各种经典的数据结构...

    使用数组列表ArrayList填充ListBox

    在.NET框架中,ArrayList是System.Collections命名空间下的一种动态数组,它可以存储任意类型的对象,而ListBox控件则是Windows Forms应用程序中常见的用户界面元素,用于显示一个可选项目的列表。本篇将详细介绍...

    C#中数组与arraylist

    在C#编程语言中,数组和ArrayList是两种不同的数据结构,它们各自有着特定的用途和特点。本篇文章将深入探讨这两种数据结构,以及它们在实际编程中的应用与区别。 首先,数组是C#中最基本的数据结构之一,它是一种...

    java数据结构与算法分析

    在编程领域,Java数据结构与算法分析是提升编程能力、优化程序效率的关键所在。本资料集专注于Java语言,深入探讨了各种数据结构和算法,旨在帮助Java开发者更好地理解和运用这些核心概念。 首先,数据结构是存储和...

    C#数组与Arraylist

    在编程领域,尤其是在C#语言中,数组和ArrayList是两种常用的数据存储结构。...在实际编程中,我们应根据需求选择最合适的解决方案,同时,随着技术的发展,不断学习新的数据结构和算法,以适应不断变化的编程环境。

    java数据结构与算法+applet与源码

    在Java中,学习数据结构与算法不仅可以深化对语言特性的理解,还能为实际开发提供强大的工具。例如,集合框架(java.util包)中就包含了多种数据结构的实现,如ArrayList、LinkedList、HashMap等,这些都是数据结构...

    JAVA数据结构与算法(中英全)

    本资源"JAVA数据结构与算法(中英全)"提供了一套完整的Java数据结构和算法的学习资料,包括中文和英文两个版本,方便不同语言背景的学习者使用。 首先,我们来探讨数据结构这一部分。数据结构是组织、管理、存储和...

    数据结构与算法答案——java语言描述

    本资料集是“数据结构与算法答案——java语言描述”,虽然全为英文内容,但其深入探讨了使用Java实现数据结构和算法的细节。 1. **数组**:数组是最基本的数据结构之一,它是一系列相同类型元素的集合,可以通过索...

    《Java数据结构和算法》学习笔记(3)——栈和队列

    本文将基于《Java数据结构和算法》学习笔记中的“栈和队列”部分进行深入探讨。 栈(Stack)是一种线性数据结构,遵循后进先出(LIFO, Last In First Out)的原则。在栈中,元素的添加(压栈)和移除(弹栈)都是在...

    数据结构与算法 Java版

    总的来说,“数据结构与算法 Java版”涵盖了如何在Java环境中理解和实现各种数据结构及算法的知识,这对于Java程序员的技能提升和问题解决能力的培养至关重要。通过深入学习,不仅可以提高编程技巧,还能为解决复杂...

    数据结构与算法分析(java版内含源代码)

    《数据结构与算法分析》是计算机科学领域的一本经典著作,尤其在Java版本中,它深入探讨了如何在Java编程语言中实现各种数据结构和算法。这本书不仅提供了理论知识,还通过提供源代码实例,帮助读者更好地理解和应用...

    《Java数据结构与算法》中的applet

    《Java数据结构与算法》是一本深入探讨编程基础与进阶技术的书籍,其中的"applet"部分涉及了Java编程中的一个重要概念——Java小应用程序。Applet是Java语言在Web环境中的一种应用形式,它可以在浏览器中运行,为...

Global site tag (gtag.js) - Google Analytics