Collection集合 ———— 存储数据
第一部分(List)
一、数组和集合的区别
1)存储数据
数组:只存储同一种数据类型的元素
集合:可以存储多种类型的元素
2)存储长度
数组:固定长度
集合:可变的,任意添加数据进集合
3)存储类型
数组:可以存储基本数据类型,也可以存储引用数据类型
集合:只能存储引用数据类型
二、Collection接口
jdk不提供此接口的任何直接实现,而是通过子接口的具体类进行实现!
1、实例化
Collection c = new ArrayList();
ArrayList是List接口的子实现类;List接口继承了Collection接口所以通过接口的多态对Collection进行实例化创建对象
2、向集合内添加元素
boolean add(Object obj):只要添加成功就返回true;
boolean addAll(Collection c):将集合c中元素全部添加到集合中,添加成功就返回true;
3、对集合进行操作
1)判断功能:
boolean isEmpty():集合为空则返回true;
boolean contains(Object obj):集合包含obj,则返会true;
boolean containsAll(Collection c):目标集合包含集合c则返回true;
boolean equals(Object obj):判断obj是否与目标集合相等
2)查询集合元素数:
int size():相当与数组的length属性;String的length()方法;
3)删除功能
boolean remove(Object obj):只删除第一个obj,如果删除返会true;
boolean removeAll(Collection c):删除集合c与目标集合共有的元素,至少删除一个元素,才会返回true;
boolean retainAll(Collection c):对一个集合取交集,保留集合c与目标集合共有的元素,至少删除一个元素,才会返回true;
void clear():移除集合中的所有元素
4)转换数组
Object[] toArray():返回值是一个Object类型的数组
注意:不能统一向下转型,如需要遍历数组时候逐个向下转型
4、集合遍历
1)通过toAarray()方法转换成数组,for()循环遍历
Collection c = new ArrayList();
。。。
Object[] obj = c.toArray();
for(int i = 0;i < obj.length;i++){
System.out.println((String)obj[i]);
}
2)通过迭代器遍历
Iterator iterator()返回在此集合的元素上进行迭代的迭代器
接口Iterator方法:
Object next():返回迭代的下一个元素(获取元素)
boolean hasNext():如果仍有元素可以迭代,则返回 true。
Collection c = new ArrayList();
。。。
Iterator it = c.iterator();
while(it.hasNext){
System.out.println(it.next()); //注意在循环体能只能出现一次next()方法
} //否则容易出现NoSuchElementException异常
三、List接口 ———— 继承Collection
1、List集合
1)List集合特点:List集合是一个有序的集合,可以有重复的元素;
2)List子类的特点
ArrayList
底层数据结构是数组,查询快,增删慢,线程不安全,不同步,效率高;
vector
底层数据结构是数组,查询快,增删慢,线程安全,同步,效率低;
LinkedList
底层数据结构数链表,查询慢,增删快,线程不安全,不同步,效率高;
3)list的迭代器
ListIterator listIterator():List列表迭代器
ListIterator接口:
boolean hasNext():表示正向遍历:是否有下一个可以迭代的元素
Object next():获取下一个元素
boolean hasPrevious():表示逆向遍历:是否有上一个可以迭代的元素
Object previous()返回列表中的前一个元素
注意:必须先正向遍历后再逆向遍历,否则无法逆向遍历,没有意义
2、ArrayList类
1)实例化:ArrayList c = new ArrarList();
2)特有功能:
添加功能:
void add(int index,Object element):在指定位置添加指定的元素
获取功能:
Object get(int index):获取指定位置的元素
删除功能:
Object remove(int index):删除指定位置的元素,返回的就是删除的元素
替换功能:
Object set(int index,object element):将指定位置的元素用element该元素替代,返回的是需要被替代的元素!
3)集合遍历
A:普通for()循环
ArrayList c = new ArrayList();
。。。
for(int i = 0;i < c.size();i++){
System.out.println(c.get(i));
}
B:通过Iterator迭代器遍历(同Collection)
C:通过List特有的listIterator()方法
ArrayList c = new ArrayList();
。。。
ListIterator li = c.listIterator();
while(li.hasNext()){
System.out.println(li.next());
}
3、Vector类
1)实例化: Vector vector = new Vector();
2)特有方法:
添加功能:
public void addElement(Object obj) ----->boolean add(Object obj)将指定元素添加到此向量的末尾
public Object elementAt(int index) ----->Object get(int index)返回向量中指定位置的元素
public Enumeration elements() ----->Iterator iterator()
接口 Enumeration:
boolean hasMoreElements() ----->hasNext()
Object nextElement() ----->next()
3)集合遍历
A:普通for()循环:利用size(),get()方法
B:通过Iterator迭代器遍历
C:通过List特有的listIterator()方法
D:通过Vector特有的elements()方法
Vector c = new Vector();
。。。
Enumeration e = c.elements();
while(e.hasMoreElements()){
System.out.println(e.nextElement());
}
4、LinkedList类
1)实例化:LinkedList c = new LinkedList();
2)特有功能:
和添加相关的方法:
public void addFirst(Object e):将指定元素插入此列表的开头
public void addLast(Object e):将指定元素添加到此列表的结尾
和获取相关的方法:
public Object getFirst():返回此列表的第一个元素。
public Object getLast():返回此列表的最后一个元素
和删除相关的方法:
public Object removeFirst():删除此列表的第一个元素
public Object removeLast():删除此列表的最后一个元素
四、ArrayList练习
1、 import java.util.ArrayList;
import java.util.ListIterator;
//需求:给List存储字符串,判断如果这个字符串是"world",然后给集合中添加一个新的 字符串"javaee"?
public class ListTest {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add("hello");
al.add("world");
al.add("java");
for(int i = 0;i < al.size();i++){
if(al.get(i) == "world"){
al.add(i + 1, "javaee");
}
}
ListIterator li = al.listIterator();
while(li.hasNext()){
System.out.println(li.next());
}
}
}
sop: hello
world
javaee
java
2、 import java.util.ArrayList;
import java.util.ListIterator;
//需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
public class ListDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add("aa");
al.add("aa");
al.add("aa");
al.add("bb");
al.add("bb");
al.add("cc");
ArrayList al2 = new ArrayList();
for(int i = 0;i < al.size();i++){
if(!(al2.contains(al.get(i)))){
al2.add(al.get(i));
}
}
ListIterator li = al2.listIterator();
while(li.hasNext()){
System.out.println(li.next());
}
}
}
sop: aa
bb
cc
3、 import java.util.ArrayList;
import java.util.ListIterator;
/*
* 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
* 附件条件:不允许新建集合去完成!
*/
public class ListDemo2 {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add("aa");
al.add("aa");
al.add("aa");
al.add("bb");
al.add("bb");
al.add("cc");
for(int x = 0;x < al.size() - 1;x++){
for(int y = x + 1;y < al.size();y++){
if(al.get(x) == al.get(y)){
al.remove(y);
y--;//每删除一次重复元素不给y--的话,角标变化就会漏掉
}
}
}
ListIterator li = al.listIterator();
while(li.hasNext()){
System.out.println(li.next());
}
}
}
sop: aa
bb
cc
4、 import java.util.ArrayList;
import java.util.ListIterator;
////需求:ArrayList去除集合对象的重复的成员信息(成员变量的值是一样)
public class ListDemo3 {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add(new Student("郭嘉",25));
al.add(new Student("荀彧",34));
al.add(new Student("荀彧",34));
al.add(new Student("荀攸",36));
al.add(new Student("郭嘉",25));
al.add(new Student("郭嘉",25));
al.add(new Student("程昱",30));
al.add(new Student("贾诩",42));
ArrayList al2 = new ArrayList();
for(int i = 0;i < al.size();i++){
if(!(al2.contains(al.get(i)))){ //contains()依赖的是equals()方法
al2.add(al.get(i)); //所以使用时要重写equals();
}
}
ListIterator li = al2.listIterator();
while(li.hasNext()){
System.out.println(li.next());
}
}
}
class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
sop: Student [name=郭嘉, age=25]
Student [name=荀彧, age=34]
Student [name=荀攸, age=36]
Student [name=程昱, age=30]
Student [name=贾诩, age=42]