List接口
一、关于List集合
- 在java.util包中,继承于Collection接口
- 允许存放重复数据而且是有序存放(元素进入集合的顺序),通过元素的equals方法,来判断两个元素是否重复
- 在集合中存在下标,通过下标访问其中的元素
二、常用方法
List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操 作集合的特有方法,例如:
- 往集合中添加元素:add(E)
- 根据下标获取元素:get(index)
- 移除一个元素:remove(index/obj)
- 重置某个元素的值:set(index,obj)
- 清空集合:clear()
- 获取当前集合中元素的个数:size()
- 判断是否包含某个元素:contains(obj)
- 获取某个元素在集合中的下标:indexOf(obj)
- 判断集合是否为空:isEmpty()
- 把List集合转换成数组:list.toArray()
- 遍历集合中的元素:iterator() -----使用迭代器
- 截取一个子集合:subList(index,index)
List<String> list=new ArrayList<String>();
//往集合中添加元素
list.add("123");
list.add("2324");
list.add("eee");
//根据下标获取元素
String value = list.get(1);
System.out.println(value);//2324
//获取集合中元素的个数
int size = list.size();
System.out.println(size);//3
//判断一个元素在集合中的下标
int i = list.indexOf("123");
System.out.println(i);//0
//是否包含“2324”这个元素
boolean boo = list.contains("2324");
System.out.println(boo);//true包含,false则不包含
//转成数组
Object[] arr = list.toArray();
System.out.println(arr);
//重置某个元素
list.set(1,"aaa");
System.out.println(list);//[123, aaa,eee]
//截取一部分
List<String> newList = list.subList(1, 2);
System.out.println(newList);//[aaa]不包含尾部
三、List接口的实现类ArrayList
ArrayList是基于数组实现的,底层是动态数组。无论任何类型的数据,存储进ArrayList之后,都会变成Object类型。
特点:元素增删慢,查找快,有序集合
- 创建ArrayList集合
ArrayList list=new ArrayList()
当我们使用构造方法创建一个对象时默认情况下ArrayList底层的数组初始化大小为10,当添加新元素时会先检测当前数组是否存满,如果存满,会新建一个新数组,将原有数组中的内容复制到新数组,继续存储。
- 基本操作
- 在移除一个元素时,默认根据元素的下标移除,如果要移除一个整数元素,需要传入整数对象remove(new Integer())
ArrayList list=new ArrayList();
//没加泛型,可以添加任何类型的元素
list.add("喜洋洋");
list.add(123);
list.add('c');
list.add("abc");
System.out.println(list);//[喜洋洋, 123, c, abc]
//使用增强for循环遍历集合
for (Object l:list) {
System.out.println(l);
}
//使用迭代器
Iterator iterator=list.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
System.out.print(next);//喜洋洋123cabc
}
//移除某个元素
list.remove(2);
System.out.println(list);//[喜洋洋, 123, abc]
list.remove(new Integer(123));
System.out.println(list);//[喜洋洋, abc]
四、List接口的实现类LinkedList
- java.util.LinkedList也是一个基于线性表的顺序存储
- java.util.LinkedList集合存储的结构是链表结构
- 有序集合,允许存储重复元素,查找慢,增删块
- LinkedList集合的实现
LinkedList list=new LinkedList();
list.add(1);
list.add("w");
list.add(true);
list.add("123");
list.add("猪猪侠");
System.out.println(list.get(3));//获取一个元素 123
//往前边添加一个元素
list.addFirst("笨笨狗");
System.out.println(list);//[笨笨狗, 1, w, true, 123, 猪猪侠]
//往最后添加
list.addLast(0);
System.out.println(list);//[笨笨狗, 1, w, true, 123, 猪猪侠, 0]
//删除下标为3 的元素
list.remove(3);
System.out.println(list);//[笨笨狗, 1, w, true, 123, 猪猪侠, 0]
- 使用LinkedList实现栈结构
栈的结构特点:先进后出--------只有一个出口
LinkedList stack=new LinkedList();
//入栈 push方法实现
stack.push(123);
stack.push("ddd");
stack.push('s');
System.out.println(stack);//[s, ddd, 123]
//pop方法,取栈顶元素,并将其移除
Object pop = stack.pop();
System.out.println(pop);//s
System.out.println(stack);//[ddd, 123]
- 使用LinkedList实现队列结构
队列的特点:先进先出------有两个出口
LinkedList queue=new LinkedList();
queue.add(123);
queue.add("sss");
queue.add("哈哈哈哈啊");
System.out.println(queue);//[123, sss, 哈哈哈哈啊]
//poll方法,取队头元素,并移除
Object poll = queue.poll();
System.out.println(poll);//123
System.out.println(queue);//[sss, 哈哈哈哈啊]
//peek()方法。取第一个元素但不移除
Object peek = queue.peek();
System.out.println(peek);
System.out.println(queue);
五、List接口的实现类Vector
- Vector的底层和ArrayList一样都是基于动态数组的。
- ArrayList和Vector的区别:ArrayList不是线程同步的,在多线程情况下可能会出现数据异常,如果要在多线程情况下使用该类则需要使用Collections. synchronizedList(new ArrayList())来实现外部同步。
- Vector是线程同步,在多线程情况下可以保证数据的正确性