文档章节

三十三,Java类集汇总

ARESXIONG
 ARESXIONG
发布于 2015/05/13 02:59
字数 2428
阅读 22
收藏 1

1.类集的定义

JDK1.2之后完善的架构,作用是完成了一个动态的对象数组,里面的数据元素可以动态的增加.

类集中提供了以下集中接口:

①单值操作接口:Collection,List,Set

  • ListSetCollection的子接口

②一对值的操作接口: Map

③排序的操作接口: SortedMap,SortedSet

④输出的接口: Iterator,ListIterator,Enumeration

⑥队列: Queue

2.Collection接口

规定了 一个集合的基本操作方法.

接口定义:

public interface Collection<E> extends Iterable<E>

从开发的角度来说,集合的操作很少直接使用Collection类去完成功能,而是直接使用其子接口ListSet接口去实现.

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就有的子类,ArrayList1.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 ArrayListVector类的区别

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

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



© 著作权归作者所有

ARESXIONG
粉丝 8
博文 104
码字总数 225460
作品 0
西城
私信 提问
从Java到JVM到OS线程睡眠

前言 Java 中有时需要将线程进入睡眠状态,这时一般我们就会通过使线程进入睡眠状态,接下去就看看执行该语句在 JVM 中做了什么。 简单例子 以下是一个简单的例子,使主线程睡眠5秒钟。 JVM ...

超人汪小建
2018/08/20
0
0
12月21日云栖精选夜读 | 推荐:一款分布式的对象存储服务

最近公司在准备内部数据上云,并且内部数据库每天的数据量很大,需要采用大数据存储的方案。 方案调研每个程序技术在实现之前,需要进行开源产品的调研,适合自己产品的技术方案才是最好的。...

yq传送门
2018/12/21
0
0
本地方法怎么映射Java层的数据类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyangzhizhou/article/details/79576578 前言 Java 语言上定义了不同的数据类型,比如有基础类型、等等,还...

超人汪小建(seaboat)
2018/03/16
0
0
工作十一年求个机会

年龄老大不小,三十三岁,危机感严重,上有老,下有小,目前的公司也有些风雨飘摇。从事IT行业已经第十一年了,研发做了几年(java方面),现在是PM角色,做PM也有好多年了,做过政府行业,金...

寄居蟹
2014/04/04
805
10
JAVA中如何处理海量数据集?

正在参与一个计费系统的开发,系统需要定期的汇总用户的消费账单,周期不同或是按周汇总或是按月汇总,消费流水会比较庞大存储在DB2的若干张消费流水表中,现有的账单汇总程序是使用C编写的,...

简单的牛牛
2012/05/19
2K
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
717
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
26
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
75
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
74
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部