黑马程序员-学习日记(集合类之TreeSet)

为什么会用到集合类?

面向对象语言对事物的体现都是以对象的方式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。                                  

数组虽然也可以存储对象,但长度固定。集合长度可变。数组中可以存储基本数据类型,集合只能存储对象。

集合类自身的特点

只用于存储对象,长度可变,能够存储不同类型的对象。

容器分了很多种,因此Java工程师对其进行了划分。这个划分成的体系就被成为集合框架。

import java.util.*;
class mapDemo
{
    public static void main(String[] args)
    {
        TreeSet ts = new TreeSet();
        ts.add(new student("Truson",22));
        ts.add(new student("Amy",21));
        ts.add(new student("Ben",19));        ts.add(new student("Boston",19));

        Iterator it = ts.iterator();
        while(it.hasNext())
        {
            student s = (student)it.next();
            System.out.println(s);
        }
    }
}

class student implements Comparable
{
    String name;
    int age;
    student(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    int getAge()
    {
        return age;
    }
    String getName()
    {
        return name;
    }
}

能通过编译,但运行时报出了异常。原来TreeSet可以对Set集合中元素按字母顺序进行排序。但集合中若是存入了对象,程序就不知道依据什么标准对元素进行排序。此时的对象不具备比较性,从而报出异常。于是查阅API后发现必须要实现一接口Comparable<T>,此接口强制让学生具备比较性。

于是更改代码如下:

import java.util.*;
class mapDemo
{
    public static void main(String[] args)
    {

        TreeSet ts = new TreeSet();
        ts.add(new student("Truson",22));
        ts.add(new student("Amy",21));
        ts.add(new student("Ben",19));

        Iterator it = ts.iterator();
        while(it.hasNext())
        {
            student s = (student)it.next();
            System.out.println(s);
        }
    }
}

class student implements Comparable
{
    String name;
    int age;
    student(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    int getAge()
    {
        return age;
    }
    String getName()
    {
        return name;
    }
    public int compareTo(Object obj)
    {
        if(!(obj instanceof student))
            throw new RuntimeException("不是学生对象!");
        student stu = (student)obj;
        System.out.println(this.name+"   compare to  "+stu.name);

        if(this.age > stu.age)
            return 1;
        if(this.age < stu.age)
            return -1;
        return 0;
    }

}

显然,这个时候我们可以实现依照学生的年龄排序了。但依然存在问题,因为如果有两个学生年龄一样而姓名不同,便只能保存先出现的那个。于是再次修改代码。

if(this.age == stu.age)
        {
            //当主要条件相同,判断次要条件
            return this.name.compareTo(s.name);
        }
时间: 2024-11-09 05:08:34

黑马程序员-学习日记(集合类之TreeSet)的相关文章

黑马程序员-学习日记(面向对象)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.面向对象  理解面向对象  面向对象是相对面向过程而言,面向对象和面向过程都是一种思想. 面向过程: 强调的是功能行为.代表语言:C语言. 例子:把大象装进冰箱 1.打开冰箱门.2.放入大象.3.关上冰箱门."打开"."存储"."关上"都是功能行为,在代码中的直观体现就是函数或者方法,这就是一种面向过程的以功能行为为主体的思想体现. 面向对

黑马程序员-学习日记(接口和多态)

1.继承 1-1 继承的概念 1-1-1 继承的概述 通过 extends 关键字让类与类之间产生继承关系. 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类或者超类. 注意: ①子类可以直接访问父类中的非私有的属性和行为. ②子类无法继承父类中私有的内容.③父类怎么来的?共性不断向上抽取而来的. ExtendDemo.java class Person{ String name; int

黑马程序员-学习日记(集合类)

第一节:集合框架 一.集合类的由来:    对象用于封装特有数据,对象多了需要存储:如果对象的个数不确定,就使用集合容器进行存储.二.集合类特点:    1. 用于存储对象的容器.    2. 长度是可变的.    3. 不可以存储基本数据类型值.    集合容器因为内部的数据结构不同,有多种具体容器.    不断的向上抽取,就形成了集合框架. 三.数组和集合类同是容器,有何不同?    数组虽然也可以存储对象,但长度是固定的:集合长度是可变的.    数组中可以存储基本数据类型,集合只能存储对

黑马程序员-学习日记(多线程的初步认识)

 ------Java EE培训.Android培训.iOS培训.期待与您交流! ------- 进程:正在执行的应用程序.一个应用程序运行时内存分配的空间.线程:进程中一个程序执行的控制单元,一条执行路径.负责程序的执行顺序.多线程:在java虚拟机启动的时候会有一个java.exe的执行程序,即一个进程.该进程中至少有一个线程负责java程序的运行.而且这个线程运行的代码存在于main方法中. class Demo extends Thread { public void run() { f

黑马程序员-学习日记(多线程安全问题和死锁认识)

------Java培训.Android培训.iOS培训.期待与您交流! ------- 安全问题产生的原因: 当多条代码语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完, 另一个线程参与进来执行.导致共享数据的错误. class Mlpc implements Runnable { private int ticket = 50; public void run() { while(true) { if(ticket>0) { try { Thread.sleep(2

黑马程序员-学习日记(单例设计模式的两种类型)

单例设计模式:解决一个类在内存中只有一个对象 多个程序使用统一配置信息对象时,需要保证该对对象的唯一性. 保证对象唯一性的实现步骤: 1.将构造函数私有化:为了避免其他程序过多建立该对象,禁止其他程序调用该对象. 2.在类中创建一个本类对象:为了让其他程序可以访问该类对象 3.提供一个方法可以获取到该对象的方法:方便其他程序访问自定义的本类对象.(类方法的访问方式只有两种,建立对象或定义为静态方法)

黑马程序员-学习日记(正则表达式)

 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 正则表达式的常用构造: 字符类     [abc] a.b 或 c(简单类)     [^abc] 任何字符,除了 a.b 或 c(否定)     [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) 预定义字符类     . 任何字符(与行结束符可能匹配也可能不匹配)     \d 数字:[0-9]     \D 非数字: [^0-9]     \s 空白字符:[ \t

黑马程序员-学习日记(反射)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.概述 JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制. 动态获取类中信息,就是java反射.可以理解为对类的解剖. 如果想要对指定名称的字节码文件进行加载并获取其中的内容并调用,这时就使用到了此技术. 示例:获取字节

黑马程序员-学习日记(多线程)

进程:正在执行的应用程序.一个应用程序运行时内存分配的空间.线程:进程中一个程序执行的控制单元,一条执行路径.负责程序的执行顺序. 多线程存在的意义: 程序运行中至少有两个线程在运行,一个是主函数的主线程,另一个是垃圾回收的线程. 线程创建方式一: 继承Thread类.要覆盖其run方法,调用线程的start方法. 作用:1.启动线程 2.运行run方法.目的是将自定义的代码存储在run方法中,让线程运行 cpu每次只执行一个程序,只是在快速的不同线程间切换,表现了多线程的随机性 class M