三十三,Java类集汇总

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

------------------------------------------------



转载于:https://my.oschina.net/u/2288529/blog/414111

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值