java arraylist枚举器遍历_Java基础(七)泛型数组列表ArrayList与枚举类Enum

一、泛型数组列表ArrayList

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

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

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

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

ArrayList 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 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 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 classEmplayeeDB{public voidupdate(ArrayList list){..}publicArrayList find(String query){...}

}

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

ArrayList staff =...;

employeeDB.update(staff);

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

ArrayList result = employeeDB.find(....);

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

ArrayList result = (ArrayList)employeeDB.find(....);

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

@SuppressWarnings("unchecked")

ArrayList result = (ArrayList)employeeDB.find(....);

二、枚举类Enum

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

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

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

enumSize

{

SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");

// 构造器private Size(String abbreviation) { this.abbreviation =abbreviation; }

// 返回括号里面的字符(缩写)public String getAbbreviation() { returnabbreviation; }

// 括号里面的字符(缩写)privateString 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Blazor University (12)组件 — 组件生命周期

原文链接&#xff1a;https://blazor-university.com/components/component-lifecycles/组件生命周期源代码[1]Blazor 组件具有许多我们可以重写以影响应用程序行为的虚拟方法。这些方法在组件生命周期的不同时间执行。下图概述了这些生命周期方法的流程。组件生命周期图SetPar…

datatable.select()的一个问题

今天用tbCategory.select("ID"id)时发现报错&#xff1a;在 Range 对象中&#xff0c;Min (3)必须小于或等于 max (-1) 后来百度发现参数要用单引号括起来&#xff1a;tbCategory.select("ID"id"")&#xff0c;但是ID的类型是int型的&#xff0c…

C#趣味程序---个位数为6,且能被3整出的五位数

using System;namespace ConsoleApplication1 {class Program{static void Main(string[] args){int count 0;int k;for (int i 1000; i < 9999; i){k i * 10 6;if (k % 3 0){Console.WriteLine(k);count;}}Console.WriteLine(count); }} }

如何通过css控制内容显示顺序 第二行的内容优先显示

我们有时进行网页设计时为了想让用户感兴趣的内容优先显示在前&#xff0c;又不想改动代码的先后顺序&#xff0c;要怎么操作呢&#xff1f;&#xff08;或者换种说法&#xff1a;源代码中要先看到A再看到B&#xff0c;而视觉上是先B再A&#xff09;举个简单的例子&#xff0c;…

【C语言简单说】十七:数组(补)

上一节 我们所说的数组是整数类型的对吧&#xff1f;那么我们还有其他类型 的数组&#xff0c;在这里用字符数组举例。 如下代码&#xff1a; #include<stdio.h> #include<stdlib.h> int main() {char a[5]{a,b,c,d,e};int i;for(i0;i<5;i){printf("a[%d…

精简 opencv python_基于Python的OpenCV人脸检测!简直不要太简单!

一、文章概述注意&#xff1a;本文只是人脸检测&#xff0c;人脸识别的实现请参见本人另一篇博客&#xff1a;基于OpenCVTensorFlowKeras实现人脸识别本文将要讲述的是Python环境下如何用OpenCV检测人脸&#xff0c;本文的主要内容分为&#xff1a;1、检测图片中的人脸2、实时检…

WireShark之抓包过滤链接部分

1 问题 我们打开WireShark&#xff0c;开始抓包&#xff0c;然后浏览器输入http链接地址&#xff0c;那我们怎么快速在WireShark里面找到 2 解决办法 1&#xff09;在WireShark里面输入http 2 ) Ctrl F,然后选择字符串&#xff0c;然后在字符串的右边输入 我们要过滤的部分…

最通俗易懂的依赖注入之生命周期

这篇文章是 ASP.NET 6 依赖注入系列文章的第二篇&#xff0c;点击上方蓝字可以阅读整个系列。在上一篇文章中&#xff0c;我们讨论了什么是依赖注入和控制反转&#xff0c;以及它的作用是什么。在这篇文章中&#xff0c;我们先演示一下依赖注入的基本用法&#xff0c; 然后再讨…

Cnblogs自定义皮肤css样式-星空观测者

不知不觉来Cnblogs也这么久了&#xff0c;然而Blogs提供的主题还是依旧那么复古&#xff0c;总觉得阅读起来难免枯燥&#xff0c;虽然我认为做技术不可以太过浮躁&#xff0c;但是一个美观的主题终究是吸引人眼的第一要素。 毕竟这么久了&#xff0c;在博客园还没有发现一个比较…

我的世界java版forge怎么用_我的世界电脑版MOD怎么用 我的世界pc版forge怎么安装...

我的世界由游戏本体以及启动器两部分组成&#xff0c;要玩游戏就要下载好本体再用启动器启动&#xff0c;单有游戏或者单有启动器都是玩不成的&#xff0c;想知道我的世界电脑版怎么开始&#xff0c;我的世界pc版启动器怎么用就来看看吧&#xff01;▍MOD怎么用1.安装MOD前要先…

C#趣味程序---百鸡百钱

问题&#xff1a;公鸡一只5元&#xff0c;母鸡一只3元&#xff0c;小鸡三只1元&#xff0c;问100元可以买多少只鸡&#xff1f; using System;namespace ConsoleApplication1 {class Program{static void Main(string[] args){int z, i0;for (int x 0; x < 20; x)for (int …

python面向对象设计管理系统_python面向对象之单例设计模型

单例目标单例设计模式__new__ 方法Python 中的单例01. 单例设计模式设计模式设计模式 是 前人工作的总结和提炼&#xff0c;通常&#xff0c;被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案使用 设计模式 是为了可重用代码、让代码更容易被他人理解、保证代码…

【C语言简单说】十八:二维数组

这里可能会让大家脑袋迷糊&#xff0c;不过没事&#xff0c;多动动脑。 这一节我们来说二维数组&#xff0c;啥叫二维数组&#xff1f;之前我们那个是一维数组&#xff0c;好了&#xff0c;我们接下来大家就会慢慢的搞懂的。 我们的一维数组就像 一列排得整整齐齐的队伍&…

移动web开发(一)——移动web开发必备知识

参考: 移动终端开发必备知识.http://isux.tencent.com/mobile-development-essential-knowledge.html

剑指offer之求两个链表的第一个公共节点

1 问题 输入两个链表&#xff0c;找出它们的第一个公共结点。 含有公共节点的两个链表的结构类似于下图中的链表&#xff1a; 1 -> 2 -> 3 -> 4 ->5 2 -> 4 ->5 可以看到两个链表中有一个公共节点&#xff0c;其中4节点就是这两个链表的公共节点 2 分析…

.Net Core 限流控制-AspNetCoreRateLimit

简介AspNetCoreRateLimit是ASP.NET核心速率限制框架&#xff0c;能够对WebApi&#xff0c;Mvc中控制限流&#xff0c;AspNetCoreRateLimit包包含IpRateLimit中间件和ClientRateLimit中间件&#xff0c;每个中间件都可以为不同的场景设置多个限&#xff0c;该框架的作者是stefan…

应用系统日志采集解决方案

概述 基于Flume MongoDB&#xff0c;对现有的多个应用系统进行日志采集。特点 采集范围每一次用户请求的请求信息。数据量大尽量减少现有系统的改动数据流图 说明&#xff1a;首先考虑的结构体系&#xff0c;是直接在应用系统中&#xff0c;将日志数据写到Flume&#xff1b;但…

0x00000001java_「十六进制表示」0x00000001是个啥?32位表示、十六进制表示 - seo实验室...

十六进制表示0x0000 0001首先他是个16进制的数字、8进制的是0开头的、比如 077 他是八进制的、十进制的话就是63、7*87630x0000 0001他表示一个32位的、因为十六进制的一位有16种变化、四位的变化也是16种。那么、想表示32位的数据、需要16进制的bit 0000 0000 0000 0000 0000 …

每个程序员都可能犯过的10个错误

1. 面向编译器写代码&#xff0c;而不是面向用户 当人们使用编译器创建自己的 app 时&#xff0c;在把自己的想法诉诸于机器代码的过程中&#xff0c;常常会将那些可以使得编程更为简单却又冗长的语法遗忘于脑后。 无论你使用的是单字母的标识符还是更易于人脑理解的标识符&…

C#趣味程序---爱因斯坦的台阶问题

问题&#xff1a;设有一阶梯&#xff0c;每步跨2阶&#xff0c;最后余1阶&#xff1b;每步跨3阶&#xff0c;最后余2阶&#xff1b;每步跨5阶&#xff0c;最后余4阶&#xff1b;每步跨6阶&#xff0c;最后余5阶&#xff1b;每步跨7阶&#xff0c;刚好到阶顶&#xff0c;问共有多…