关于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方法)