c enum能像java一样吗_不一样的Java Enum

Emum是在Java5中引入的新特性,从那开始,它被广泛的用在不同的Java应用中,相比于C和C++的Enum,Java的Enum功能更加强大。但是很多开发人员暂时还没意识到它的强大之处,在Enum的一些细节问题上把握的还不到位。Enum的特性及相关资料可以整理出一本书也不为过,这里简单对Enum做个大概。主要讲解以下几个方面。

AAffA0nNPuCLAAAAAElFTkSuQmCC

Enum的介绍

Enum的特性

Enum的用法

Enum的一些面试题

Enum用法建议

什么是Enum

Enum是一个Java的关键字,用于表示一个固定的常用值。例如,每周的天数,每年的月数等。Enum是一种类型,就像Class和Interface可以用于定义一系列的Enum常量

Enum的特性

Enum常量隐式的加上了static和final,一旦被创建就无法修改

Enum提供了是类型安全的(type-safe)

Enum隐式的加上了values()方法,返回一个数组包含所有的Enum常量

两个Enum常量可以使用 ==或equals()方法比较

Enum可以用在switch语句中,就像int,String。

Enum有自己的名称空间

Enum可以实现Java接口

可以在Enum中定义构造器

Enum的用法

1 . Enum的声明,Enum可以声明在一个类之外或者在类内部,但是不能在方法中。

// 外部声明Enum

enum Color {

RED,GREEN,BLUE;

}

public class Test

{

public static void main(String[] args)

{

Color c1 = Color.RED;

System.out.println(c1);

}

}

//内部声明Enum

public class Test

{

enum Color

{

RED, GREEN, BLUE;

}

public static void main(String[] args)

{

Color c1 = Color.RED;

System.out.println(c1);

}

}

2 . 在创建Enum常量的时候可以指定值,但是这个时候你需要定义一个成员变量构造器。构造器必须是private的,不然会报编译错误。

public enum Currency {

PENNY(1), NICKLE(5), DIME(10), QUARTER(25);

private int value;

private Currency(int value) {

this.value = value;

}

}

3 . 使用==或equals比较两个enum

因为enum对象都是继承自Enum类的,可以看到Enum中的equals方法为。

建议使用==方法,直接比较应该比调用方法的速度更快一些。另外==号还能防止NullPointerException

public final boolean equals(Object other) {

return this==other;

}

4 . 对Enum进行排序的时候,使用compareTo方法。

public final int compareTo(E o) {

Enum> other = (Enum>)o;

Enum self = this;

if (self.getClass() != other.getClass() && // optimization

self.getDeclaringClass() != other.getDeclaringClass())

throw new ClassCastException();

return self.ordinal - other.ordinal;

}

5 .有两个新的集合类EnumMap和EnumSet ,他们两个是对Set和Map的高性能实现,当有机会使用它们的时候,尽量使用它们。

Enum面试问题

说说Enum的继承

所有的enums隐式的extend了java.lang.Enum类,因为一个类只能extend一个父亲,所以enum不能extend其它的类。

但是Enum可以实现许多接口

Enum的values,ordinal,valueOf方法

enums默认有values(),ordinal()和valueOf()方法。

values()方法返回所有在enum中定义的常量值,以数组形式返回。

ordinal()方法返回每个常量的索引下标,就像数组的下标

valueOf()方法传入字符串参数,如果enum中存在对应字符串的常量值,则返回对应的enum常量

// 案例代码

enum Color

{

RED, GREEN, BLUE;

}

public class EnumLearn

{

public static void main(String[] args)

{

Color arr[] = Color.values();

for (Color col : arr)

{

System.out.println(col + " at index "

+ col.ordinal());

}

System.out.println(Color.valueOf("RED"));

}

}

//输出

RED at index 0

GREEN at index 1

BLUE at index 2

RED

3 . Enum的构造器特性

enum可以有构造器方法,它的构造器方法会在enum类型加载的时候,按常量的个数顺序的执行

我们不能直接创建enum对象,因此我们也不能直接调用enum的构造器方法,构造器方法必须是private的

//案例代码

enum AccountType implements Serializable,Cloneable

{

SAVING, FIXED, CURRENT;

private AccountType()

{

System.out.println("It is a account type");

}

}

class EnumOne

{

public static void main(String[]args)

{

System.out.println(AccountType.FIXED);

}

}

//输出结果

It is a account type

It is a account type

It is a account type

FIXED

4 . Enum的单例模式优缺点

参考《Effitive Java》,优点大于缺点,因为enum是线程安全的,因此我们无需考虑单例模式的双重检查。主要原因:

enum的单例模式简单

enum是线程安全的

enum的单例模式自己处理序列化 *

// Enum的单例模式 VS 传统双重检查的单例模式

//单例模式,仅需使用一行代码.

// EasySingleton.INSTANCE,enum中也可以写其他方法

public enum EasySingleton{

INSTANCE;

}

//传统模式

public class DoubleCheckedLockingSingleton{

private volatile DoubleCheckedLockingSingleton INSTANCE;

private DoubleCheckedLockingSingleton(){}

public DoubleCheckedLockingSingleton getInstance(){

if(INSTANCE == null){

synchronized(DoubleCheckedLockingSingleton.class){

// 二次检查

if(INSTANCE == null){

INSTANCE = new DoubleCheckedLockingSingleton();

}

}

}

return INSTANCE;

}

}

5 . Enum的==和equals的区别。

前面有提到。

6 . 我们能使用构造方法创建enum实例吗?

不能,enum的构造方法必须是私有的。

Enum的用法建议

在能想到使用Enum的时候可以考虑使用Enum。

使用Enum代替定义的相关int类型常量

能用到EnumSet和EnumMap的时候使用它们,后面会再说明它们两个的用法

最后

看一些Java相关的面试题,发现Enum相关问题出现频率挺高的,在这里对enum用法做个整理。希望能帮助到大家

参考

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

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

相关文章

java se 9.0.4_jre 9下载(Java SE Runtime Environment)下载

JRE9官方下载是运行JAVA程序不可缺少的环境。JRE中由ClassLoader负责查找和加载程序引用到的类库,基础类库ClassLoader会到rt.jar中自动加载,其它的类库,ClassLoader在环境变量CLASSPATH指定的路径中搜索,按照先来先到的原则&…

php 屏蔽ctrl c,ctrl+c用不了怎么回事

解决办法:首先在运行里输入clipbrd打开剪贴板查看器看看里面是什么东西如果是剪贴板卡死了的话重启可解决问题如果不是复制个别的东西还是那个那么需要杀毒了!(可能是灰鸽子病毒,冲击、震荡、狙击等都有可能导致不能复制粘贴剪切)方法一&…

java在控制台打印余弦曲线,java打印正弦曲线示例

代码如下:/** 绘制0到360的正弦曲线* 分两种情形&#xff0c;y>0和y<0进行绘制* 每种情形中要考虑每行打印两个"*"字符* 并在打印第二个"*"字符后换行*/package hundred;import java.lang.Math;public class SinTest {public static void main(Strin…

matlab怎么计算行列式,Matlab 线性代数(一)–行列式与方程组求解 | 学步园

1.%用克莱姆法则求解方程组clearninput(方程个数)Ainput(系数矩阵A)binput(常数列向量b)if((size(A)~[n,n])|(size(b)~[n,1])) %判断矩阵A和向量b输入格式是否正确disp(输入不正确&#xff0c;要求A是n阶方阵&#xff0c;b是n维列向量) %disp:显示字符串elseif det(A)0 %判断系…

matlab计算16 1 3近似值,8. 科学计算软件Matlab中默认情况下π为近似值3.1416,该近似值与π真值的( )...

柄残的叶的药密集排列突起可见基和材轮状&#xff0c;学计下π部略膨大根头。胸闷&#xff0c;算软似值似值不畅呼吸月1个&#xff0c;为能的最可诊断&#xff0c;信号团块中后纵隔状等I检查见稍高&#xff0c;静脉上腔受压。白细胞&#xff1a;中真值&#xff0c;当病现声音嘶…

加密扩展库 php,如何利Mcrypt扩展库进行加密和解密_php

综述&#xff1a;Mcrypt 2.4.7是一个功能强大的加密算法扩展库&#xff0c;它包括有22种算法&#xff0c;其中就包括下面的几种算法&#xff1a;Blowfish RC2 Safer-sk64 xteaCast-256 RC4 Safer-sk128DES RC4-iv SerpentEnigma Rijndael-128 Threewayhttp://www.gaodaima.com/…

php中数组下标,PHP数组介绍_php

数组基础&#xff1a;php中&#xff0c;数组的下标可以整数&#xff0c;也可以是字符串php中&#xff0c;数组的元素顺序不是由下标决定&#xff0c;而是由其“加入”的顺序决定定义&#xff1a;$arr1 array(元素1&#xff0c;元素2&#xff0c;。。。。。。);array(1,1.1,5,a…

php支持ssi,让Apache支持SHTML(SSI)的配置方法

shtml和asp有一些相似&#xff0c;以shtml命名的文件里&#xff0c;使用了ssi的一些指令&#xff0c;就像asp中的指令&#xff0c;你可以在SHTML文件中写入SSI指令&#xff0c;当客户端访问这些shtml文件时&#xff0c;服务器端会把这些SHTML文件进行读取和解释&#xff0c;把S…

在电脑搭建oracle服务器端,oracle 服务器端搭建(C#开发环境)

oracle 服务器端搭建(C#开发环境)oracle 服务器端搭建(C#开发环境)常见问题&#xff1a;问&#xff1a;安装plsql 能直接 连接 oracle 服务器端吗&#xff1f;答&#xff1a;32可以直接连接&#xff0c;但是64为需要配置问&#xff1a;下载plsql 对于的版本的选择 是选择64位好…

【网络奇遇记】揭秘计算机网络的性能指标:速率|带宽|吞吐量|时延

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 速率1.1 数据量1.2 速率 二. 带宽三. 吞吐量四. 时延4.1 发送时延4.2 传播时延…

怎么查看ip地址下的php文件夹,pe下查看原系统ip的方法

pe下查看原系统ip的方法方法及步骤如下&#xff1a;在PE下加载注册表&#xff0c;找到[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces]&#xff0c;在“Interfaces”选项下面可以看到有多个注册表子项&#xff0c;依照不同子项下面的“IP…

linux cmake 编译项目,使用CMake构建复杂工程

0. 什么是CMakeCMake是一个跨平台的编译、安装、测试以及打包工具&#xff1b;CMake不直接编译软件&#xff0c;而是结合原生构建系统来构建软件。CMake配置文件是CMakeList.txt文件(每个源码文件夹下都要有一个)&#xff0c;CMake根据配置文件在生成Unix的Makefile或VS的solut…

Linux防火墙屏蔽ip6,观点|Linux 发行版们应该禁用 IPv4 映射的 IPv6 地址吗?

从各方面来看&#xff0c;互联网向 IPv6 的过渡是件很缓慢的事情。不过在最近几年&#xff0c;可能是由于 IPv4 地址资源的枯竭&#xff0c;IPv6 的使用处于上升态势。相应的&#xff0c;开发者也有兴趣确保软件能在 IPv4 和 IPv6 下工作。但是&#xff0c;正如近期 OpenBSD 邮…

linux和pe修复win10启动项,pe下如何重建win10引导?pe下win10引导修复图文教程

[文章导读] 随着win10系统的流行&#xff0c;越来越多的小伙伴经常遇到win10系统引导丢失的情况&#xff0c;我们知道win10系统现在采用的是uefi引导&#xff0c;以前的一些修复工具都只能修复传统模式mbr格式下的硬引导&#xff0c;但对于uefi引导不是很清楚&#xff0c;uefi引…

c语言课程设计大作业模版,c语言课程设计报告模板下载

c语言课程设计报告模板是一款专业的设计模板&#xff0c;对于在大学有需要些设计报告的朋友&#xff0c;可以下载这款模板作为参考&#xff0c;了解设计报告的需求&#xff0c;基本上毕业的论文设计也是在这个基础上严格要求的&#xff0c;欢迎下载使用。C语言介绍C语言是一门面…

c语言如何把变量按位颠倒,求答案,用C语言编程,用户输入一个正整数,把他的各位数字前后颠倒,并输入点到后的结果...

满意答案q15173278975推荐于 2017.11.26采纳率&#xff1a;58% 等级&#xff1a;13已帮助&#xff1a;5665人用字符串处理很简单#include #include void main (){int n,i;char s[20];scanf("%d", &n);sprintf(s,"%d", n);printf("%d\n",s…

中南大学12月13日考c语言,中南大学2010级C语言试卷

中南大学考试试卷2010 -- 2011 学年 1 学期 时间110分钟学时学分 考试形式&#xff1a;班级 学号 姓名 总分100分,占总评成绩70 %一、选择题(每小题1.5分,共计30分)1. C语言中变量定义与使用的关系是 。A) 必须先定义&#xff0c;后使用 B)可以先使用&#xff0c;后定义 C) 可以…

android activity动态显示不出来,uiautomatorviewer 获取不到动态页面解决办法

以前玩 PC 最近刚搞 app 测试&#xff0c;费好大劲环境装好&#xff0c;高兴的点击 uiautomatorviewer.bat 想去抓取页面元素&#xff0c;尴尬的是首页就直接报错。Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesnt exis…

android xml 画下划线,android – strings.xml:如何从标记前面的空格中删除下划线?...

我的strings.xml中有以下行&#xff1a;This is a test在我的活动xml中,我在TextView中引用了这个字符串&#xff1a;android:layout_width"wrap_content"android:layout_height"wrap_content"android:text"string/test_string" />奇怪的是,当…

android开发基本知识,Android应用开发基本知识点汇总

Activity一生命周期4种状态running/paused/stopped/killed生命周期Activity发动onCreate->onStart->onResume点Home回来主界面onPause->onStop再次回到原ActivityonRestart->onStart->onResume退出ActivityonPause->onStop->onDestroy进程优先级前台&…