• Java基础(七)泛型数组列表ArrayList与枚举类Enum


      一、泛型数组列表ArrayList

      1.在Java中,ArrayList类可以解决运行时动态更改数组的问题。ArrayList使用起来有点像数组,但是在添加或删除元素时,具有自动调节数组容量的功能,而不需要为此编写任何代码。

      对数组列表实施插入和删除操作效率比较低,对于小型数组来说可以接受。但是如果数组存储的元素数比较多,又经常需要在中间位置插入、删除元素,就应该考虑使用链表。

      ArrayList是一个采用类型参数(type parameter)的泛型类(generic class)。为了指定数组列表保存的元素对象类型,需要用一对尖括号将类名括起来加在后面。

      例如:构造和保存一个Employee对象的数组列表

    ArrayList<Employee> staff = new ArrayList<>();

      2.ArrayList类的一些方法

      (1)使用add方法可以将元素添加到数组列表中中

    staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15));
    

      数组列表管理着对象引用的一个内部数组。最终,数组的全部空间有可能被用尽。这就显示出数组列表的优点:如果调用add方法且内部数组已经满了,数组列表就将自动地创建一个更大的数组,并将所有的对象从较小的数组中拷贝到较大的数组中。

      如果已经明确数组存储的元素的数量,可以在add前调用ensureCapacity方法:这个方法调用将分配一个包含100个对象的内部数组。

    staff.ensureCapacity(100);

      也可以在构造数组列表的时候就指定初始容量:

    ArrayList<Employee> staff = new ArrayList<>(100);

      (2)使用size方法将返回数组列表中包含的实际元素数目:打印结果:3

          staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15));
          staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1));
          staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15));
    
          System.out.println(staff.size());

      (3)使用trimToSize方法将存储区域的大小调整为当前元素数量所需要的存储空间数目,垃圾回收器将回收多余的存储空间。一旦整理了数组列表的大小,添加新元素就需要花时间再次移动存储块,所以应该在明确不会添加任何元素时,再调用这个方法。

    staff.trimToSize();

      (4)使用get和set方法实现访问或改变数组列表中元素的操作:数组列表访问元素语法较为复杂

    staff.set(i, Harry);     // 等价于对数组a的元素赋值:a[i] = Harry;
    staff.get(i); // 等价于获取数组a下标为i的元素:Employee e = a[i]

      (5)使用toArray方法将数组列表中的元素拷贝到一个数组中:常用的数组列表使用方法,既可以灵活地扩展数组,又可以方便地访问数组元素

    // 第一步:创建一个数组列表,并添加所有的数组元素
    ArrayList<X> list = new ArrayList<>(); while(...){
    x = ...;
    list.add(x);
    }
    // 第二步:将数组列表中的元素拷贝到数组中便于访问
    X[] a = new X[list.size()];
    list.toArray(a)

      (6)使用带索引的add方法在数组列表的中间插入元素:

    int n = staff.size()/2;
    staff.add(n, e);

      (7)使用remove方法移除索引位置的元素并返回:

    Employee e = staff.remove(n)

      (8)使用for each循环遍历数组列表:

          for (Employee e : staff)
             e.raiseSalary(5);

      3.类型化与原始数组列表的兼容性

      假如有下面这个没有使用类型参数的类:可以看到,这里的ArrayList没有使用泛型,如果和这些代码交互就会有一些问题。

    public class EmplayeeDB{
        public void update(ArrayList list){..}
        public ArrayList find(String query){...}
    }

      可以将一个类型化的数组列表传递给update方法,而不需要进行任何类型转换:即只要是ArrayList类对象,不管是什么具体类型化都可以编译通过。

    ArrayList<Employee> staff = ...;
    employeeDB.update(staff);

      但是,如果将一个原始的没有类型化的ArrayList赋值给一个类型化ArrayList就会得到警告:因为得到的可能不是Employee类的类型的数组列表

    ArrayList<Employee> result = employeeDB.find(....);

      这个时候可以使用强制类型转换:这个时候会得到另外一个警告,因为虚拟机中没有类型参数

    ArrayList<Employee> result = (ArrayList<Employee>)employeeDB.find(....);

      这个时候,如果确保不会造成严重的后果,可以使用@SuppressWarnings("unchecked")来标记这个变量能够接受类型转换:

    @SuppressWarnings("unchecked")
    ArrayList<Employee> result = (ArrayList<Employee>)employeeDB.find(....);

      二、枚举类Enum

      1.没有构造器和方法的枚举类:在比较两个枚举类型的值时,永远不需要调用equals,而是直接使用“==”就可以了。

    public enum Size (SMALL, MEDIUM, LARGE, EXTRA_LARGE};

      2.可以在枚举类型中添加构造器、方法和域,例如:

    enum Size
    {
       SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");
    
      // 构造器
    private Size(String abbreviation) { this.abbreviation = abbreviation; }
      // 返回括号里面的字符(缩写)
    public String getAbbreviation() { return abbreviation; }   // 括号里面的字符(缩写) private String abbreviation; }

      3.枚举类的一些方法:

      (1)toString方法能够将枚举对象转化成字符串并返回枚举常量名,例如:

    System.out.println(Size.SMALL.toString());   // 打印:SMALL

      (2)valueOf方法能够根据枚举常量名返回枚举对象,例如:

    Size s = Enum.valueOf(Size.class, "SMALL");
    System.out.println(s.getAbbreviation());    // 打印:S

      (3)values方法可以返回一个包含全部枚举值的数组,例如:

           Size[] values = Size.values();
           for (Size size : values) 
                System.out.print(size + " ");  // 打印:SMALL MEDIUM LARGE EXTRA_LARGE 

      (4)ordinal方法返回enum声明中枚举常量的位置,例如:

    System.out.println(Size.EXTRA_LARGE.ordinal()); // 打印:3
  • 相关阅读:
    Maybe You Don't Know ! 如何比较两个引用是否指向同一个对象?
    记录一点项目心得...
    SharePoint 站点模版
    ObjectSpaces,See you in 2006...
    CLR如何实现线程同步
    Using 1.1, Waiting 2.0 & EasyThread
    在SharePoint中的Workflow引擎开发完成
    ViewState
    《WalkThrough WebPart 入门指南二》完成
    隐藏在.NET中的IoC?
  • 原文地址:https://www.cnblogs.com/BigJunOba/p/9323813.html
Copyright © 2020-2023  润新知