1.类集的定义
JDK1.2之后完善的架构,作用是完成了一个动态的对象数组,里面的数据元素可以动态的增加.
类集中提供了以下集中接口:
①单值操作接口:Collection,List,Set
-
List和Set是Collection的子接口
②一对值的操作接口: Map
③排序的操作接口: SortedMap,SortedSet
④输出的接口: Iterator,ListIterator,Enumeration
⑥队列: Queue
2.Collection接口
规定了 一个集合的基本操作方法.
接口定义:
public interface Collection<E> extends Iterable<E>
从开发的角度来说,集合的操作很少直接使用Collection类去完成功能,而是直接使用其子接口List和Set接口去实现.
3.List接口
List接口最大的特点是,里面的内容都允许重复.并新增操作方法.
List接口常用的子类有: ArrayList,Vector,LinkedList.
3.1 ArrayList类
属于新的子类
定义:
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
示例1:
package com.ares.collectiondemo.listdemo;
import java.util.ArrayList;
import java.util.List;
public class ArrayListAddDemo {
public static void main(String args[]) {
List<String> allList = new ArrayList<String>();// 为List接口实例化
allList.add("hello");// 增加元素,Collection接口定义
allList.add(0, "MLDN");// 增加元素,List接口定义
allList.add("world");// 增加元素,Collection接口定义
allList.add("world");// 增加元素,Collection接口定义
System.out.println(allList) ;
}
}
注:没有数组长度限制.
示例2:(删除操作)
package com.ares.collectiondemo.listdemo;
import java.util.ArrayList;
import java.util.List;
public class ArrayListDeleteDemo {
public static void main(String args[]) {
List<String> allList = new ArrayList<String>();// 为List接口实例化
allList.add("hello");// 增加元素,Collection接口定义
allList.add(0, "MLDN");// 增加元素,List接口定义
allList.add("world");// 增加元素,Collection接口定义
allList.remove(0); // 删除第一个位置的元素,List接口定义
allList.remove("world");// 删除元素,Collection接口定义
System.out.println(allList);
}
}
示例3:(完成输出数据的操作)
package com.ares.collectiondemo.listdemo;
import java.util.ArrayList;
import java.util.List;
public class ArrayListPrintDemo01 {
public static void main(String args[]) {
List<String> allList = new ArrayList<String>();// 为List接口实例化
allList.add("hello");// 增加元素,Collection接口定义
allList.add(0, "MLDN");// 增加元素,List接口定义
allList.add("world");// 增加元素,Collection接口定义
for (int i = 0; i < allList.size(); i++) {// 循环输出
System.out.println(allList.get(i)); // 输出内容
}
}
}
注意:Collection接口的输出因为没有get方法,所以需要先转化一下.
示例4:
package com.ares.collectiondemo.listdemo;
import java.util.ArrayList;
import java.util.Collection;
public class ArrayListPrintDemo02 {
public static void main(String args[]) {
Collection<String> allList = new ArrayList<String>();// 为Collection接口实例化
allList.add("hello");// 增加元素,Collection接口定义
allList.add("MLDN");// 增加元素,Collection接口定义
allList.add("world");// 增加元素,Collection接口定义
Object obj[] = allList.toArray() ;
for (int i = 0; i < obj.length; i++) {// 循环输出
System.out.println(obj[i]) ;
}
}
}
备注
:还可以指定泛型类型完成操作
:
String obj[] = allList.toArray(new String[]{}) ;
for (int i = 0; i < obj.length; i++) {// 循环输出
String str = obj[i] ;
System.out.println(str) ;
}
ArrayList类的其他操作.
示例5:
package com.ares.collectiondemo.listdemo;
import java.util.ArrayList;
import java.util.List;
public class ArrayListOtherDemo {
public static void main(String args[]) {
List<String> allList = new ArrayList<String>();// 为List接口实例化
allList.add("hello");// 增加元素
allList.add(0, "MLDN");// 增加元素
allList.add("world");// 增加元素
allList.add("www");// 增加元素
allList.add("mldnjava");// 增加元素
System.out.println(allList.contains("hello")) ;
//结果为true
System.out.println(allList.subList(2, 4)) ;
//结果为[world,www]
}
}
3.2 Vector类
旧的子类.
JDK1.0就有的子类,ArrayList是1.2推出的.Vector类实现了List接口,可以直接为List接口实例化.
示例:
package com.ares.collectiondemo.listdemo;
import java.util.List;
import java.util.Vector;
public class VectorAddDemo {
public static void main(String args[]) {
List<String> allList = new Vector<String>();// 为List接口实例化
allList.add("hello");// 增加元素,Collection接口定义
allList.add(0, "MLDN");// 增加元素,List接口定义
allList.add("world");// 增加元素,Collection接口定义
System.out.println(allList) ;
}
}
备注:此类的操作方法和List接口中的方法是完全一样的.
3.3 ArrayList和Vector类的区别
ArrayList采用的是异步的处理操作,而Vector是同步,所以ArrayList类性能较高,Vector是线程安全的,输出的化,ArrayList类有Iterator,ListIterator,foreach,而Vector除了这三种外还多了一个Enumeration.
3.4 LinkedList类和Queue接口
LinkedList完成的是一个链表的操作.
定义:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, Serializable
示例:
package com.ares.collectiondemo.listdemo;
import java.util.LinkedList;
public class LinkedListDemo01 {
public static void main(String[] args) {
LinkedList<String> link = new LinkedList<String>() ;
link.add("A") ;
link.add("B") ;
link.add("C") ;
link.addFirst("X") ;
link.addLast("Y") ;
System.out.println("链表头:" + link.getFirst());
System.out.println("链表尾:" + link.getLast());
}
}
示例2:
package com.ares.collectiondemo.listdemo;
import java.util.LinkedList;
public class LinkedListDemo02 {
public static void main(String[] args) {
LinkedList<String> link = new LinkedList<String>();
link.add("A");
link.add("B");
link.add("C");
link.addFirst("X");
link.addLast("Y");
for (int i = 0; i <= link.size(); i++) {
System.out.print(link.element()); // 取出表头
}
System.out.println("\nelemtn()操作之后:"+link);
for (int i = 0; i <= link.size(); i++) {
System.out.print(link.poll()); // 取出表头,同时删除表头
}
System.out.print("\npoll()操作之后:"+link);
}
}
4. Set 接口
Set接口也是Collection接口的子接口,最大的特点是里面没有任何的重复元素,在Set接口中常用的子类有:
-
TreeSet
-
HashSet
Set接口并没有对Collection接口进行任何的扩充.
4.1 散列存放 HashSet
示例:
package com.ares.collectiondemo.setdemo;
import java.util.HashSet;
import java.util.Set;
public class HashSetAddDemo {
public static void main(String[] args) {
Set<String> allSet = new HashSet<String>();
allSet.add("A"); // 增加
allSet.add("B"); // 增加
allSet.add("C"); // 增加
allSet.add("C"); // 增加重复元素
allSet.add("C"); // 增加重复元素
allSet.add("D"); // 增加
allSet.add("E"); // 增加
System.out.println(allSet);
}
}
输出结果
:
[D,A,C,B,E] //没有重复,而且是散列存放的.
4.2 有序存放TreeSet
示例:
package com.ares.collectiondemo.setdemo;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetAddDemo {
public static void main(String[] args) {
Set<String> allSet = new TreeSet<String>();
allSet.add("C"); // 增加重复元素
allSet.add("D"); // 增加
allSet.add("E"); // 增加
allSet.add("A"); // 增加
allSet.add("B"); // 增加
allSet.add("C"); // 增加
allSet.add("C"); // 增加重复元素
System.out.println(allSet);
}
}
结果
:
[A,B,C,D,E] //不允许有重复,但是是有序存放的.
4.3 关于排序的说明
示例:
Person类代码:
package org.lxh.collectiondemo.setdemo;
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() { // 覆写toString()
return "姓名:" + this.name + ";年龄:" + this.age;
}
public int compareTo(Person o) {
//覆写实现Comparable接口后的方法
if (this.age > o.age) {
//比较的是对象中的年龄属性
return 1;
} else if (this.age < o.age) {
return -1;
} else {
return this.name.compareTo(o.name); // 比较name
}
}
}
HashSetAdd类代码:
Set<Person> allSet = new HashSet<Person>();
… ...
allSet.add(new Person("王五",31));
说明: 如果没有name属性的比较,那么只要是年龄相同的元素都是不可能被添加进去的,因为会被当做重复的元素被过滤掉.但是添加了name属性的比较又有一个新的问题,那就是同名通年龄的对象不会被过滤掉,都会显示出来.因为在add 时,allSet.add(new Person("王五",31));对象会开辟不同的内存,会被当做是两个不同的HashSet元素.
4.4 关于重复元素的说明
要想解决4.3中的问题则需要另外覆写两个方法.
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
Person p = (Person) obj;
if (this.name.equals(p.name) && this.age == p.age) {
return true;
} else {
return false;
}
}
public int hashCode() { // 这个方法的返回值都是通过一个公式计算的
// 此时的公式:名字的hashCode * age
|乘法
return this.name.hashCode() * this.age;
}
注:在Object类中是通过hashCode()和equals()方法来完成重复元素的验证的.
5.集合输出
java类集中集合输出常用的有四种输出:
-
Iterator
-
ListIterator
-
foreach
-
Enumeration
5.1 Iterator接口
Iterator接口表示迭代接口.
常用方法:
-
hasNext()
-
next()
-
remove()
如果想为Iterator接口实例化,则必须使用Collection接口的如下方法:
public Iterator<T> iterator()
示例:
package com.ares.iteartordemo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo {
public static void main(String[] args) {
List<String> allList = new ArrayList<String>();
allList.add("A");
allList.add("B");
allList.add("C");
Iterator<String> iter = allList.iterator();
//示例化
while (iter.hasNext()) {
System.out.print(iter.next() + "、");
}
}
}
删除操作的代码:
Iterator<String> iter = allList.iterator();
while (iter. ()) {
String str = iter.next(); // 取出内容
if ("C".equals(str)) {
iter.remove();// 删除元素
}
System.out.print(str + "、");
}
System.out.println("删除之后的集合:" + allList);
需要注意的一点是,如果上述的代码iter.remove();删除操作用的是allList.remove(str);则为报错,因为Iterator类是将一个集合的输出交给它来完成,如果直接使用集合的删除操作为破坏整个集合的内容,实际开发中也很少使用Iterator进行删除的操作,只是判断是否有值并将其输出.
5.2 ListIterator接口
ListIterator接口是Iterator接口的子接口.Iterator接口最大的特点是从前向后迭代输出,如果现在要想执行双向输出,则只能使用ListIterator接口,但此接口使用只能输出List接口的内容,因为要依靠如下方法:
public ListIterator<E> listiterator()
示例:
package org.lxh.listiteartordemo;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorDemo01 {
public static void main(String[] args) {
List<String> allList = new ArrayList<String>();
allList.add("A");
allList.add("B");
allList.add("C");
ListIterator<String> iter = allList.listIterator();
System.out.print("从前向后输出:");
while (iter.hasNext()) {
System.out.print(iter.next() + "、");
}
System.out.print("\n从后向前输出:");
while (iter.hasPrevious()) {
System.out.print(iter.previous() + "、");
}
}
}
注
:要想执行双向输出
,首先一定要保证执行了有前向后的输出
,否则执行会没有内容
.
ListIterator接口除了双向输出外还可以对数据执行修改操作.
示例:
package com.ares.listiteartordemo;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorDemo {
public static void main(String[] args) {
List<String> allList = new ArrayList<String>();
allList.add("A");
allList.add("B");
allList.add("C");
ListIterator<String> iter = allList.listIterator();
iter.add("X"); // 增加数据
System.out.print("从前向后输出:");
while (iter.hasNext()) {
String str = iter.next();
iter.set(str + " - A"); // 修改
System.out.print(str + "、");
}
System.out.print("\n从后向前输出:");
while (iter.hasPrevious()) {
System.out.print(iter.previous() + "、");
}
}
}
输出结果
:
从前向后输出:A、B、C
从后向前输出:C-A、B-A、C-A
5.3 foreach输出
示例:
package com.ares.foreachdemo;
import java.util.HashMap;
import java.util.Map;
public class ForeachMapDemo {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("zhangsan", 1);
map.put("zhangsan", 2);
map.put("lisi", 3);
map.put("wangwu", 5);
for (Map.Entry<String,Integer> me : map.entrySet()) {
System.out.println(me.getKey() + " --> " + me.getValue());
}
}
}
注:(ArrayList遍历输出)
List<String> allList = new ArrayList<String>();
allList.add("A");
... ...
for (String str : allList) {
System.out.print(str + "、");
... ...
5.4 废弃的接口: Enumeration接口
Enumeration接口是一个古老的接口,支持此种输出的只有Vector类.
Vector类中有如下的方法:public Enumeration<E> elements(),通过此方法为Enumeration接口实例化.
示例:
package com.ares.enumerationdemo;
import java.util.Enumeration;
import java.util.Vector;
public class EnumerationDemo {
public static void main(String[] args) {
Vector<String> allList = new Vector<String>();
allList.add("A");
allList.add("B");
Enumeration<String> enu = allList.elements();
while (enu.hasMoreElements()) {
System.out.print(enu.nextElement() + "、");
}
}
}
20150513
JAVA学习笔记系列
--------------------------------------------
联系方式
--------------------------------------------
Weibo: ARESXIONG
E-Mail: aresxdy@gmail.com
------------------------------------------------