Java集合框架浅谈-List(一)

1. 为什么出现集合
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。所有集合类都位于java.util包下。  
集合中只能保存对象(保存对象的引用变量)。(数组既可以保存基本类型的数据也可以保存对象)。
  当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进行处理。 从JDK1.5以后,这种状态得到了改进:可以使用泛型来限制集合里元素的类型,并让集合记住所有集合元素的类型。     
2.  数组和集合同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可以变化的。数组中可以存储基本数据类型,集合只能存储对象。
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。
下面主要说明一下Collection中的List,List中较为常用的有ArrayList, LinkedList, Vector。
Collection
|--list:元素是有序的,元素可以重复,是因为该集合体系有索引。
  |--ArrayList:底层的数据结构使用的都是数组结构。特点:查询速度快,但是增删稍慢。线程不同步,不是安全线程。
  |--Linked List:底层的数据结构都是链表数据结构。增删速度快,查询速度慢。
  |--Vector:底层是数组数据结构。线程同步,所以效率较低。被ArrayList替代了。

|--Set:元素是无序的,元素不可以重复。


<span style="font-family:Courier New;font-size:12px;">package com.test.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class ListDemo
{
	public static void main(String[] args)
	{
		//在JDK5.0以后,不太建议使用非泛型模式
		//1. 添加数据
		List<String> list1 = new ArrayList<String>();
		list1.add("java01");
		list1.add("java02");
		list1.add("java03");
		List<String> list2 = new ArrayList<String>();
		list2.add("java007");
		list2.add("java008");
		//使用重载方法添加元素 add(int index, E element)
		list1.add(1, "java04");
		//将另一个集合中的元素添加进来addAll(Collection<? extends E> c)
		list1.addAll(list2);
		//可以直接打印ArrayList集合
		System.out.println(list1);
		System.out.println("---------------------------------------------------");
</span>
<span style="font-family:Courier New;font-size:12px;">		//2. 更新集合中元素
		//set(int index, E element) 
		list2.set(1, "Welcome");
		System.out.println("Change the second element from java008 to Welcome"+ list2);
		System.out.println("---------------------------------------------------");
</span>
<span style="font-family:Courier New;font-size:12px;">		//3. 删除元素
		list1.remove(2);
		System.out.println("Remove java02 "+list1);
		//将两个集合中公共元素删除
		list1.removeAll(list2);
		System.out.println("Reomve list2 from list1 "+list1);
		list2.clear();
		//判断是否为空
		System.out.println("Clearing all elements ? "+ list2.isEmpty());
		System.out.println("After clearing: "+list2);
		System.out.println("-----------------------------------------------------");</span>
<span style="font-family:Courier New;font-size:12px;">		
		//4. 查询元素
		//元素个数
		System.out.println("Size = "+ list1.size());
		//指定元素首次出现索引
		System.out.println("Index = "+ list1.indexOf("java03"));
		//遍历集合方法一
		for(int i = 0; i < list1.size(); i++)
		{
			System.out.print(list1.get(i)+" ");
		}
		System.out.println();
		//遍历集合方法二
		// 使用迭代器,也是遍历集合最常用的方式
		Iterator<String> it = list1.iterator();
		while(it.hasNext())
		{
			System.out.print(it.next()+" ");
		}
		System.out.println();
		//遍历方法三,开发时常用
		for(Iterator<String> iter = list1.iterator();iter.hasNext();)
		{
			String str = iter.next();			
			//查看数组中是否包含某个元素
			if("java03".contains(str))
				System.out.print(" got it!");
			System.out.print(str);
		}
		System.out.println();
		//遍历方法四
		//使用高级for循环
		for(String str : list1)
		{
			System.out.print(str + " ");
		}
		System.out.println();
		System.out.println("------------------------------------------------");
		//关于Iterator和ListIterator
		/*
		 * Iterator与ListIterator有什么区别? 
			1、Iterator是ListIterator的父接口。			 
			2、Iterator是单列集合(Collection)公共取出容器中元素的方式。
			        对于List,Set都通用。
			        而ListIterator是List集合的特有取出元素方式。			 
			3、Iterator中具备的功能只有hashNext(),next(),remove();
			       ListIterator中具备着对被遍历的元素进行增删改查的方法,可以对元素进行逆向遍历。
			       之所以如此,是因为ListIterator遍历的元素所在的容器都有索引。
		 */
		for(ListIterator<String> li= list1.listIterator();li.hasNext();)
		{
			String str = li.next();	
			if("java03".equals(str))
				li.add("Hello java03");			
		}
		System.out.println(list1);
		for(Iterator<String> it1 = list1.iterator();it1.hasNext();)
		{
			String str = it1.next();
			//如果在迭代过程中使用了集合的方法,就是产生ConcurrentModificationException
			//为了避免该异常的出现,使用ListIterator
			if("java03".equals(str))
				list1.add("Hello java03");
			System.out.println(str);
		}
	}
}</span>

运行结果:

<span style="font-family:Courier New;font-size:12px;">[java01, java04, java02, java03, java007, java008]
---------------------------------------------------
Change the second element from java008 to Welcome[java007, Welcome]
---------------------------------------------------
Remove java02 [java01, java04, java03, java007, java008]
Reomve list2 from list1 [java01, java04, java03, java008]
Clearing all elements ? true
After clearing: []
-----------------------------------------------------
Size = 4
Index = 2
java01 java04 java03 java008 
java01 java04 java03 java008 
java01java04 got it!java03java008
java01 java04 java03 java008 
------------------------------------------------
[java01, java04, java03, Hello java03, java008]
java01
java04
java03
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
	at java.util.AbstractList$Itr.next(AbstractList.java:343)
	at com.test.list.ListDemo.main(ListDemo.java:99)
</span>


 

<span style="font-family:Courier New;font-size:12px;">package com.test;

import java.util.ArrayList;
import java.util.List;

public class ListDemo {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		
		String[] arr = {"a","b","c", "d"};
		
		for(String s : arr) {
			if(list.indexOf(s) == -1){
				System.out.println("List中不包含元素"+s);
			}else{
				System.out.println("元素"+s+"在list中的序号为"+list.indexOf(s));
			}
		}
	}
}</span>
结果为:

元素a在list中的序号为0
元素b在list中的序号为1
元素c在list中的序号为2
List中不包含元素d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值