目录

  • Java开发入门
    • ● Java 概述
    • ● JDK的使用
    • ● 系统环境变量
    • ● 第一个Java程序
    • ● Java的运行机制
    • ● 教学设计
    • ● 课程讲义
    • ● 案例学习
    • ● 课后题答案
  • Java 编程基础
    • ● Java的基本语法
      • ● Java代码基本格式
      • ● Java中的注释
      • ● Java中的关键字
      • ● Java中的标识符
    • ● Java中的变量与常量
      • ● 变量的定义
      • ● 变量的数据类型
        • ● 案例导学
      • ● 变量的类型转换
        • ● 案例导学-自动类型转换
        • ● 案例导学-强制类型转换
      • ● 变量的作用域
        • ● 案例导学-作用域
      • ● Java中的常量
    • ● Java中的运算符
      • ● 案例导学-算术运算符
      • ● 案例导学-赋值运算符
      • ● 案例导学-比较运算符
      • ● 案例导学-逻辑运算符
      • ● 案例导学-位运算符
      • ● 案例导学-运算符的优先级
    • ● 选择结构语句
      • ● 案例导学-if条件语句
      • ● 案例导学-switch条件语句
    • ● 循环结构语句
      • ● 案例导学-while循环语句
      • ● 案例导学-for循环语句
      • ● 案例导学-循环嵌套
      • ● 案例导学-break语句
      • ● 案例导学-continue语句
    • ● 数组
      • ● 案例导学-一维数组的定义
      • ● 案例导学-数组最值
      • ● 案例导学-数组排序
    • ● 教学设计
    • ● 课程讲义
    • ● 课后题答案
  • 面向对象(上)
    • ● 面向对象概述
    • ● Java中的类与对象
      • ● 案例导学-类与对象
    • ● 类的封装
    • ● 案例导学-类的封装
    • ● 方法的重载和递归
    • ● 构造方法
      • ● 案例导学-构造方法与重载
    • ● this关键字
      • ● 案例导学-this
    • ● static关键字
      • ● 案例导学-静态变量
      • ● 案例导学-静态方法
      • ● 案例导学-静态代码块
    • ● 教学设计
    • ● 课程讲义
    • ● 章节测试
    • ● 课后题答案
  • 面向对象(下)
    • ● 类的继承
      • ● 案例导学-类的继承
      • ● 案例导学-方法的重写
      • ● 案例导学-super访问父类成员变量
      • ● 案例导学-super访问父类成员方法
      • ● 案例导学-super访问父类构造方法
    • ● final关键字
    • ● 抽象类和接口
    • ● 多态
    • ● 内部类
    • ● JDK8的Lambda表达式
    • ● 异常
    • ● 垃圾回收
    • ● 教学设计
    • ● 课程讲义
    • ● 章节测试
    • ● 课后习题答案
  • Java中的常用类
    • ● String类和StringBuffer类
    • ● System类与Runtime类
    • ● Math类与Random类
    • ● 包装类
    • ● 日期与时间类
    • ● 格式化类
    • ● 课后题答案
    • ● 课程讲义
  • 集合
    • ● 集和概述
    • ● Collection接口
    • ● List接口
      • ● List接口简介
      • ● ArrayList集合
      • ● LinkList集合
    • ● Collection集合遍历
    • ● Set接口
    • ● Map接口
    • ● 泛型
    • ● 常用工具类
      • ● Collections工具类
      • ● Arrays工具类
    • ● 课后题参考答案
    • ● 课程讲义
  • IO流
    • ● I/O流概述
    • ● 字节流
    • ● 字符流
    • ● File类
    • ● RandomAccessFile
    • ● 对象序列化
    • ● NIO
    • ● NIO.2
    • ● 课后题答案
    • ● 课程讲义
    • ● 章节测试
  • GUI(图形用户接口)
    • ● Swing概述
    • ● Swing顶级容器
    • ● 布局管理器
    • ● 事件处理
    • ● Swing常用组件
    • ● Swing组件的整合使用
    • ● JavaFX图形用户界面工具
    • ● 课程讲义
  • JDBC
    • ● 什么是JDBC
    • ● JDBC常用API
    • ● JDBC编程
    • ● 案例-使用JDBC实现QQ登录
    • ● 课程讲义
  • 多线程
    • ● 线程概述
    • ● 线程的创建
    • ● 线程的生命周期及状态转换
    • ● 线程的调度
    • ● 多线程同步
    • ● 多线程通信
    • ● 教学设计
    • ● 课后题参考答案
    • ● 课程讲义
  • 网络编程
    • ● 网络通信协议
    • ● UDP通信
    • ● TCP通信
    • ● 课程讲义
  • Eclipse开发工具
    • ● Eclipse概述
    • ● Eclipse的安装与启动
    • ● Eclipse进行程序开发
    • ● Eclipse程序调试
    • ● 使用Eclipse导出、导入jar文件
  • ACM大赛题库
    • ● 2027
    • ● 2028
    • ● 2024-2026
    • ● 2012-2023
    • ● 2018-2020
    • ● 2015-2017
    • ● 2012-2014
    • ● 2009-2011
    • ● 2003-2005
    • ● 2000-2002
  • PBL学生风采展示
    • ● 实验一
    • ● 实验二
    • ● 实验三
    • ● 实验四
Collection接口


一、Collection接口

Collection接口定义了存取一组对象的方法,其子接口Set、List和Queen分别定义了存储方式。

使用Collection接口需要注意:

1、Collection接口是List、Set和Queen接口的父接口。

    2、定义了可用于操作List、Set和Queen接口的方法,也就是增删改查的方法。

3、Set接口中的数据对象没有顺序且不可以重复;List接口中的数据对象有顺序且可以重复

二、Collection接口中定义的方法

在Collection接口的介绍中我们知道Collection接口中定义了一些用于操作集合接口的有关增加、删除、查找、排序和修改的方法。

查看Java API知道:

我们可以先来看看若是不使用集合框架创建一列对象的实例:

public class Test{

public static void main(String[] args){

                //每次只能创建一个对象,即使是数组也只能添加相同类型的对象

Name name1 = new Name("f1","l1");

                Name name2 = new Name("f2","l2");

                Name name3 = new Name("f3","l3");

                System.out.println(name1);

                System.out.println(name2);

                System.out.println(name3);                     

}

}

class Name{

private String firstName;

private String lastName;

public Name(String firstName,String lastName){

this.firstName = firstName;

this.lastName = lastName;

}

public String getFirstName(){

return firstName;

}

public String getLastName(){

return lastName;

}

public String toString(){

return firstName + " " +lastName;

}

}

输出结果:

f1 l1

f2 l2

f3 l3

 我们使用Collection集合接口的实现类来创建对象以及使用add()方法来添加对象的实例:

import java.util.ArrayList;

import java.util.Collection;

public class Test{

public static void main(String[] args){

Collection c = new ArrayList();

//可以放入不同类型的对象

c.add("hello");

c.add(new Name("f1","l1"));

c.add(new Integer(100));

System.out.println(c.size());

System.out.println(c);

}

}

class Name{

private String firstName;

private String lastName;

public Name(String firstName,String lastName){

this.firstName = firstName;

this.lastName = lastName;

}

public String getFirstName(){

return firstName;

}

public String getLastName(){

return lastName;

}

public String toString(){

return firstName + " " +lastName;

}

}

输出结果:

3

[hello, f1 l1, 100]

如果是使用remove()方法呢?

import java.util.Collection;

import java.util.HashSet;

public class Test{

public static void main(String[] args){

Collection c = new HashSet();

//可以放入不同类型的对象

c.add("hello");

c.add(new Name("f1","l1"));

c.add(new Integer(100));

c.remove("hello");

c.remove(new Integer(100));

System.out.println(c.remove(new Name("f1","l1")));

System.out.println(c);

}

}

class Name{

private String firstName;

private String lastName;

public Name(String firstName,String lastName){

this.firstName = firstName;

this.lastName = lastName;

}

public String getFirstName(){

return firstName;

}

public String getLastName(){

return lastName;

}

public String toString(){

return firstName + " " +lastName;

}

}

输出结果:

false

[f1 l1]

重写类的equals()方法必须重写hashCode()方法

       集合类对象在调用remove()、contains()等方法时需要比较对象是否相等,这回涉及到对象类型的equals()方法和

hashCode()方法;对于自定义的类型,需要重写equals()方法和hashCode()方法以实现自定义的对象相对规则。

       注意:

       1相等的对象应该具有相等的hasd codes。

       2增加Name类的equals()方法hashCode()方法如下:

 public boolean equals(Object obj){

if(obj instanceof Name){

Name name = (Name)obj;

return (firstName.equals(name.firstName))

&&(lastName.equals(name.lastName));

}else{

return super.equals(obj);

}

}

public int hashCode(){

return firstName.hashCode();

}

再次改写上面实例的代码:

import java.util.Collection;

import java.util.HashSet;

import java.util.LinkedList;

public class Test{

public static void main(String[] args){

Collection c = new HashSet();

//可以放入不同类型的对象

c.add("hello");

c.add(new Name("f1","l1"));

c.add(new Integer(100));

c.remove("hello");

c.remove(new Integer(100));

System.out.println(c.remove(new Name("f1","l1")));

System.out.println(c);

System.out.println("-----------------------");

Collection lt = new LinkedList();

lt.add(new Name("f1","l1"));

lt.add(new Name("f2","l2"));

System.out.println(lt.contains(new Name("f2","l2")));

lt.remove(new Name("f1","l1"));

System.out.println(lt);

}

}

class Name{

private String firstName;

private String lastName;

public Name(String firstName,String lastName){

this.firstName = firstName;

this.lastName = lastName;

}

public String getFirstName(){

return firstName;

}

public String getLastName(){

return lastName;

}

public String toString(){

return firstName + " " +lastName;

}

public boolean equals(Object obj){

if(obj instanceof Name){

Name name = (Name)obj;

return (firstName.equals(name.firstName))&&(lastName.equals(name.lastName));

}else{

return super.equals(obj);

}

}

public int hashCode(){

return firstName.hashCode();

}

}

输出结果:

true

[]

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

true

[f2 l2]


 Collection集合接口定义的其它方法就不再一一用实例说明,在后面的模拟学生选课功能的实例时,我们可以再尝

试使用,以便深入了解。

       三、Collections工具类

       Collection工具类是Java集合框架中用来操作集合对象的工具类,也是Java集合框架的成员。

       (1)比较器——Comparable和Comparator接口

       1)Comparable接口——可比较接口

        Comparable实现该接口的提示:这个类的实例可以比较大小,可以进行自然排序,定义了默认的比较规则。

        Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo()

方法被称为它的自然比较方法。

       实现此接口的对象可以通过Collections.sort()和Arrays.sort()进行自动排序,也可以用作有序映射中的键或有序集合

中的元素,无需指定比较器。

       compareTo()方法返回正数表示大,负数表示小,0表示相等。

       接口声明:

       public interface Comparable<T>{

        int compareTo(T o);

}

这里就不举例说明了,后面的一篇博文会专门把它们拿出来详细介绍。

       (2)迭代器——Iterator接口

       所有实现了Collection接口的容器类型都有一个iterator()方法用以返回一个实现了Iterator接口的对象。Iterator对象

称作迭代器,用以方便的实现对象容器内元素的遍历操作。

       Iterator接口定义了如下的方法:

       依然使用上面实例的代码:

import java.util.Collection;

import java.util.HashSet;

import java.util.Iterator;

public class Test{

public static void main(String[] args){

Collection c = new HashSet();

c.add(new Name("f1","l1"));

c.add(new Name("f2","l2"));

c.add(new Name("f3","l3"));

Iterator i = c.iterator();

while(i.hasNext()){

//next()方法返回值为Object类型,需要转换为相应类型

Name n = (Name)i.next();

System.out.println(n.getFirstName()+"");

}

System.out.println("---------------");

Collection hs = new HashSet();

hs.add(new Name("fff1","lll1"));

hs.add(new Name("f2","l2"));

hs.add(new Name("fff3","lll3"));

for(Iterator j=hs.iterator();j.hasNext();){

Name name = (Name)j.next();

if(name.getFirstName().length()<3){

//如果换成c.remove(name)会产生例外

   j.remove();

}

}

System.out.println(hs);

}

}

class Name{

private String firstName;

private String lastName;

public Name(String firstName,String lastName){

this.firstName = firstName;

this.lastName = lastName;

}

public String getFirstName(){

return firstName;

}

public String getLastName(){

return lastName;

}

public String toString(){

return firstName + " " +lastName;

}

public boolean equals(Object obj){

if(obj instanceof Name){

Name name = (Name)obj;

return (firstName.equals(name.firstName))&&(lastName.equals(name.lastName));

}else{

return super.equals(obj);

}

}

public int hashCode(){

return firstName.hashCode();

}

}


运行结果:

f1

f2

f3

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

[fff3 lll3, fff1 lll1]