一、为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一 种方式。
二、集合类的特点
集合类存放于java.util包中。集合长度是可变的;它存放的都是不同类型的对象的引用,而非对象本身;集合中不可以存储基本的数据类型值。
集合类型主要有3种:set(集)、list(列表)和map(映射)。
三、数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
四、Collection的常见方法
1、添加
a) boolean add (Object obj);
b) boolean add(Collection coll);
2、删除
a) boolean remove(Object obj);
b) boolean removeAll(Collection coll);
c) void clear();
3、判断
a) boolean contains(object obj);
b) boolean containsAll(Collection coll);
c) boolean isEmpty()
4、获取
a) int size(); 获取集合中的长度
b) Iterator iterator(); 获取元素的方式:迭代器
5、其他
a) boolean retainAll (Collection coll);取交集
b) Object[] toArray();将集合转为数组
五、Iterator()方法实现原理
六、集合框架中的常用接口
1、Collection接口有两个子接口:
List(列表),Set(集)
List:可存放重复元素,元素存取是有序的。
Set:不可以存放重复元素,元素存取是无序的。
2、List集合特有的迭代器,ListIterator是iterator的子接口。在迭代时,不可以通过集合对象的方法操作计划中的元素,因为会发生ConcurrentModificationException异常。所以在迭代时,只能使用迭代器的放过操作元素,可以是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用子接口ListIterator.。该接口只能通过List集合的ListIterator方法获取。
示例:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class ArrayListTest
{
public static void main(String[] args)
{
//演示列表迭代器
ArrayList<String> al = new ArrayList<String>();
//添加元素
al.add("java01");
al.add("java02");
al.add("java03");
System.out.println("原集合中的元素:"+al);
ListIterator<String >li = al.listIterator();
while (li.hasNext())
{
String str = (String) li.next();
if (str.equals("java02"))
{
//li.add("java009");
li.set("java002");
}
}
System.out.println("改变后集合的元素:"+al);
<span style="white-space:pre"> </span>}
}
七、ArrayList和LinkedList的区别
1、ArrayList:底层的数据结构使用的是数组结构,特点:查询速度快,但增删稍慢
2、LinkedList:底层使用的是链表数据结构,特点:增删速度很快,查询稍慢。
八、Set集合:不可以存放重复元素,元素存取是无序的。Set方法和Collection类似,主要看看其子类:
1、HashSet:底层数据结构为哈希表。HashSets通过元素的两个方法,hashCode和equals来完成,如果hashCode值相同才会判断equals是否为true,如果元素的hashCode值不同,则不会调用equals。
注意:
A、正常开发中,自定义的对象要放到集合中一般都要重写hashCode()和equals()方法。保证元素唯一性。
B、对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法。(而ArrayList判断元素存在或删除元素等操作,只依赖equals方法,这是因为数据结构的不同而不同。)
2、示例:
import java.util.HashSet;
import java.util.Iterator;
/**
* 往hashSet集合中存入自定义对象(person)
* 姓名和年龄相同为同一人,重复元素
*/
public class HashSetTest
{
public static void main(String[] args)
{
HashSet<Person> hs = new HashSet<Person>();
hs.add(new Person("a1", 12));
hs.add(new Person("a2", 13));
hs.add(new Person("a3", 14));
//hs.add(new Person("a2", 13));
System.out.println(hs.contains(new Person("a2", 13)));
System.out.println(hs.remove(new Person("a2", 13)));
for (Iterator it = hs.iterator(); it.hasNext();)
{
Person p = (Person) it.next();
System.out.println(p.getName()+"::"+p.getAge());
}
}
}
class Person
{
private String name;
private int age;
public Person(String name, int age)
{
super();
this.name = name;
this.age = age;
}
public int hashCode()
{
//System.out.println(this.name +"......hashCode");
return name.hashCode()+age*37;
}
public boolean equals(Object obj)
{
if (!(obj instanceof Person))
{
return false;
}
Person p = (Person)obj;
//System.out.println(this.name + "...equals..."+ p.name);
return (this.name).equals(p.name) && this.age == p.age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}