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替代了。
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。所有集合类都位于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