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方法)
- list、Vector、迭代器和Stack
- 【C++】利用list和vector实现stack和queue!!!
- Vector和Stack分析
- Vector和Stack注意事项
- Vector和Stack分析
- Vector 和 stack
- List接口——Vector(Stack)
- List 接口—— Vector(Stack)
- java vector,list,map,stack,queue
- Stack/Queue与Vector/List的联系
- 16、Collection接口及其子接口Set和List(常用类LinkedList,ArrayList,Vector和Stack)
- 数据结构:List和Stack
- Vector和Stack的用法
- List结构集合类的使用:ArrayList、LinkedList、Vector(向量)和Stack(栈)
- Java 集合系列之 List总结(LinkedList, ArrayLis,vector,stack等使用场景和性能分析)
- vector 和 list
- vector 和list
- vector和list
- 【机器学习系列之一】线性回归模型
- MacBook Pro 2017版(带multi-touch bar)安装使用 windows10
- select2 点击清除,清除原来的值
- 电容/电阻规格整理
- JAVA自定义标签教程及实例代码
- list、Vector、迭代器和Stack
- python学习之Turtle 3
- python 数据可视化练习(2)
- java上传文件时抛出java.lang.OutOfMemoryError: Java heap space
- 如何将自己代码的核心部分对用户“隐藏”起来,使用导入静态库。
- 形态学图像处理学习笔记
- (M)Dynamic Programming:464. Can I Win
- sizeof--披着函数的外衣
- Python安装Scikit-learn的问题