list、Vector、迭代器和Stack

来源:互联网 发布:淘宝买欢乐豆 编辑:程序博客网 时间:2024/06/14 11:07

关于list

ArrayList(基于动态数组的数据结构)

ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高。

在API中ArrayList有三种构造方法:


第三种构造一个具有指定容量的空列表:

当你初始化为一个具体的数字的时候,你通过size方法查看依旧为0     size为0    index为0

后来在网上查了之后发现这里的capacity指的是分配的内存大小,并不是初始化的List的大小。如果用list.size()打印结果为0.所以这个参数我们一般不用设置它。

ArrayList默认构造的容量为10,没错。   ArrayList的底层是由一个Object[]数组构成的,  而这个Object[]数组,默认的长度是10  所以有的文章会说ArrayList长度容量为10。   然而你所指的size()方法,只的是“逻辑”长度。  所谓“逻辑”长度,是指内存已存在的“实际元素的长度”  而“空元素不被计算”   即:当你利用add()方法,向ArrayList内添加一个“元素”时,  逻辑长度就增加1位。 而剩下的9个空元素不被计算。

集合中的泛型

集合在声明的时候后面会有尖括号,原本集合是可以存放各种元素的,但是加上尖括号之后就变为泛型,集合中就只能装指定的这种泛型元素了。

集合中特殊:

在前面数组之类的引用在堆栈中是通过地址的引用,但是在集合中是将所有元素进行复制实现的。

LinkedList(基于链表的数据结构)

LinkedList采用链表存储方式。插入、删除元素时效率比较高。

相对于ArrayList,LinkedList对集合中的元素的增删查改速率更高,因为链表相对于动态数组的优越性。

LinkedList相比于ArrayList最明显的地方就是多了getFirst、getLast、addFirst和addLast方法。因为链表本身查找和修改元素更加的方便。

ArrayList和LinkedList的区别和应用

对于访问而言 ArrayList优于LinkedList。

但是对于增删查改而言 LinkedList 优于ArrayList。

关于Vector

Vector 实现了一个动态数组。是可实现自动增长的对象数组。

Vector和ArrayList的区别

vector和arraylist的比较:

(线程安全:很多个线程同时做事情的时候,是否会发生冲突,发生就不安全,不发生就安全)

1、都是采用数组格式存储数据,索引数据块插入数据慢

2、ArrayList会比Vector快,他是非同步的

3、涉及到多线程,Vector是同步更好一些

4、ArrayList是重速度轻安全,Vector是线程安全。

5、容量增大时有一定的区别,Vector是默认每次数组增大一倍,ArrayList默认增长的是百分之五十。

 

关于迭代器

迭代器引入:

集合中实现动态数组的深层理解:



  remove掉了,但是第一次循环得到的却还是第一个元素和第二个元素,只有第二次for循环加强中将原本的第一个元素和第三个元素给遍历了出来;其实这里面就涉及了javaAPI中对集合实现的源代码,集合的实现本身是通过数组的增删查改,将数组的不停的copy到长数组或者短数组中完成的,第一次for循环的时候通过计数器查找到第二个元素之后,执行集合底层的remove方法,就将元素前移了,所以当i=2去查找第三个元素时,就无法查找到,或者说根本没有第三个元素可进行循环了。

 

    所以在循环中进行对集合的元素进行删除动作在普通for循环和for循环加强中是没法实现的,或者说这是极其不合理的,要实现在循环中对集合元素的删除,我们就必须要用到迭代器

迭代器:

Collection接口下所有的集合都实现了iterator方法,具体的作用就是通过此方法返回一个迭代器(对象)

每种不用的算法实现的集合本身的迭代器都有差别,通过iterator方法返回一个符合自己类型的迭代器,通过这种方式返回迭代器的集合,都可以通过迭代器的方式进行集合的遍历

 

迭代器模式

提供一种方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部结构。

集合有多种结构,得到元素和判断元素的细节不一样。

迭代器将访问元素的过程和元素本身的存储结构分离。

迭代器(Iterator)是一个接口,它只有三种可实现的方法,分别是

所有集合对象最终都要自己实现这三种方法,才能实现迭代器的功能。

Stack的使用

先进后出,后进先出:


Stack的方法摘要:

Stack方法测试代码:

package collection;

 

import java.util.Stack;

 

publicclassStackTest{

  publicstaticvoidmain(String[]args){

    Stack<String>stack=newStack<String>();

    Stringstr1="hello_1";

    Stringstr2="hello_2";

    Stringstr3="hello_3";

   

    //如果为空的话,显示true

    System.out.println("栈开始初始化是否为空:"+stack.empty());

    //将str1放入栈中

    stack.push(str1);

    //如果不为空的话,显示false

    System.out.println("栈放入一个元素后是否为空:"+stack.empty());

    //将剩下的两个元素也放入到stack

    System.out.println("将剩下的两个字符串也放进去...");

    stack.push(str2);

    stack.push(str3);

    //开始测试

    System.out.println("通过pop移除最上面的元素");

    System.out.println(stack.pop());

    System.out.println("查看现在栈中还有多少个元素");

    System.out.println(stack.size());

    System.out.println("通过peek查看栈顶部的对象");

    System.out.println(stack.peek());

    System.out.println("查看栈中还有几个对象");

    System.out.println(stack.size());

   

    System.out.println("通过search查找特定的对象(输入为Object:返回index,从0开始的):");

    System.out.println(stack.search(str2));

   

  }

}

 

使用LinkedList实现类似栈的先进后出,后进先出的结构(利用LinkedList的addFirst、addLast、removeFirst、removeLast方法实现Stack的push和pop方法)

 

原创粉丝点击