一、泛型数组列表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

Java基础(七)泛型数组列表ArrayList与枚举类Enum的更多相关文章

  1. 泛型数组列表 ArrayList

    为什么使用泛型数组列表而不使用普通数组? 1.普通数组经常会发生容量太大以致浪费的情况 2.普通数组无法动态更改数组 基本概念: 1.采用[类型参数]的[类]---->[泛型类] 2.[泛型类型 ...

  2. 「JavaSE 重新出发」05.02 泛型数组列表、包装类

    泛型数组列表 ArrayList 是一个采用类型参数(type parameter)的泛型类(generic class). java ArrayList<Employee> staff ...

  3. java 泛型数组列表

    如下代码: package com.company; import java.lang.reflect.Array; import java.util.ArrayList; public class ...

  4. 黑马程序员:Java基础总结----泛型(高级)

    黑马程序员:Java基础总结 泛型(高级)   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...

  5. 在Java中怎样把数组转换为ArrayList?

    翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...

  6. Java中创建泛型数组

    Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...

  7. Java 基础类型转换byte数组, byte数组转换基础类型

    Java 基础类型转换byte数组, byte数组转换基础类型 Java类型转换 java类对象转化为byte数组

  8. Java基础七-正则表达式

    Java基础七-正则表达式 一.定义: 特定的符号的组合 二.作用: 用于操作字符串数据 三.优缺点 简化代码,但是阅读性差 四.引入 4.1 问题 判断一个号码是否是QQ号? 不是零开头 6-15位 ...

  9. Java基础语法(7)-数组

    title: Java基础语法(7)-数组 blog: CSDN data: Java学习路线及视频 1.数组的概述 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并 ...

随机推荐

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 使用springboot最新版本mysql-Connector连接数据库时报错解决

    在连接数据库时,使用了最新版本的mysql-Connector,即6.0以上版本 1.报错如下: Loading class `com.mysql.jdbc.Driver'. This is depr ...

  3. 机器学习回顾篇(6):KNN算法

    1 引言 本文将从算法原理出发,展开介绍KNN算法,并结合机器学习中常用的Iris数据集通过代码实例演示KNN算法用法和实现. 2 算法原理 KNN(kNN,k-NearestNeighbor)算法, ...

  4. CSS 换行

    默认情况下,元素的属性是 white-space:normal:自动换行:(不把单词截断,会把单词看作一个整体) -----但是但是但是但是..当元素中的内容是一对没有空格的字符/数字时,超过容器宽度 ...

  5. Django基础五之django模型层之关联管理器

    class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: ForeignKey关系的“另一边”.像这样: 1 ...

  6. Zookeeper 学习笔记之 Leader Election

    ZooKeeper四种节点类型: Persist Persist_Sequential Ephemeral Ephemeral_Sequential 在节点上可注册的Watch,客户端先得到通知再得到 ...

  7. Mysql高手系列 - 第22篇:深入理解mysql索引原理,连载中

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...

  8. 三天讲透SpringBoot-初识基础使用

    这次我们来说一下我们的SpringBoot,现在SpringBoot已经成为趋势,在我这里我用三篇文章的形式来讲清楚我们的SpringBoot,大致分为,第一篇讲搭建,基本使用,第二篇三方集成,自动装 ...

  9. liunx下安装MySQL

    1.安装依赖包:yum -y install gcc gcc-c++ ncurses ncurses-devel cmake bisonyum install -y perl-Module-Insta ...

  10. 各种常见文件的hex文件头

    我们在做ctf时,经常需要辨认各种文件头,跟大家分享一下一些常见的文件头.   扩展名 文件头标识(HEX) 文件描述 123 00 00 1A 00 05 10 04 Lotus 1-2-3 spr ...