Arraylist就像vector一样,不限长度
List接口:
实现了List接口
常用的声明 List heros = new ArrayList();
这样用接口引用子类对象 (多态)
ArrayList里的方法照常用,而且这样并没有把heros写死,就是可以通过new的不同 动态的调用对象,如后边的linkedlist也实现了List 的接口,就更灵活嘛。
泛型:
List<Hero> genericheros = new ArrayList<Hero>();
给一个容器指定它能装的类型,只能存那个类型,其他的存进去就会出错。
这样可以避免取出来的时候因为不知是什么类型而出现的转型出错。
要想指定一个容器之内能装两个或者以上类型,则把这两个类型写成拥有同一个父类,然后指定这个容器能装的是他们的父类类型即可。
遍历Arraylist 的几个方法:
一、正常的for
因为.size可以获取容器的大小
所以使用
for(int i = 0;i < heros.size();i ++) { Hero h=heros.get(i); }
二、迭代器
for(Iterator<Hero> it = heros.iterator();it.hasNext();) { Hero hero = (Hero) iterator.next(); }
三、增强型for
很多开发人员的首选,缺点是无法得知当前是第几个元素了,需要自己记录。
for(Hero h : heros) { System.out.println(h); }
在处理字符串中的数字的时候可以使用Integer.parse 贼好用。
作业:删掉名字中为8的倍数的对象。
package collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TextCollection {
public static void main(String[] args) {
List<Hero> heros = new ArrayList<Hero>();
for(int i = 0;i < 100;i ++)
{
//if(i < 10)
// heros.add(new Hero("hero 0"+i));
//else
heros.add(new Hero("hero "+i));
}
for(Iterator<Hero> it = heros.iterator();it.hasNext();)
{
Hero h = (Hero) it.next();
int x = Integer.parseInt(h.name.split(" ")[1]);
/*String a=h.name;
String b="" ;
b+=a.charAt(5);
b+=a.charAt(6);
int x=(b.charAt(0)-'0')*10+(b.charAt(1)-'0');
System.out.println(x);*/
if(x % 8 == 0 && x != 0)
{
it.remove();
}
}
for(Hero e : heros)
{
System.out.println(e.name);
}
}
}
linkedlist:
linkedlist也实现了list接口,也能照着之前那样使用。
但是linkedlist更牛逼的是实现了 Deque双向链表、Queue队列
deque,linkedlist本来就是一个双向链表形式的list,就是你只要声明了linkedlist就可以使用deque的功能
比如:
addLast 在后边添加
addFirst 在前面添加
getLast、getfirst 查看最后、最前的元素
removelast、removefirst 删除最后、最前的元素
就像linkedlist实现了list接口一样,它也实现了queue接口
Queue<Hero> q= new LinkedList<Hero>();
这样定义了之后奥
就可以使用
offer 在最后添加元素
poll 取出第一个元素
peek 查看第一个元素
虽然有queue的实现,但是没有栈的实现,需要用的时候就可以使用deque自己写。