每次通过values()方法遍历查找,时间复杂度是O(n),而通过HashMap查找,时间复杂度是O(1)。
虽说枚举的数量通常都不会很庞大,每次通过values()方法遍历查找速度也很快。用HashMap会多占用一点点内存,但是考虑到这一点内存能从时间复杂度是O(n)降到O(1),这种惠而不费的事,还是可以花时间去优化代码的。
private static Map<String,CustomType> orgCustomType = new HashMap<>();
static {
for (CustomType value : CustomType.values()) {
orgCustomType.put(value.getOrgId(),value);
public CustomType find(String orgId){
return orgCustomType.get(orgId);
Python微信订餐小程序课程视频https://edu.csdn.net/course/detail/36074Python实战量化交易理财系统https://edu.csdn.net/course/detail/35475一、背景Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。最近工作中,对接了很多其他的系统,发现对接的同一个系统都有不同的环境(开发、测试、正式环境),并且每个环境的配置信息通常不会修改,所
我们知道在JAVA编写一个枚举类之后,在调用时系统就会自动给它生成一个values()的数组,通过这个数组就可按索引获取枚举值
但是如果我们声明的是一个枚举的范型类呢?我们知道所有的JAVA枚举类,其实都是继承Enum类的,然而Enum只有一个静态的方法valueOf(),用于把字符串转化成枚举值。可是如果想把索引值转化成枚举值呢,怎么办?
咋一看,Enum下面似乎真的没有这么一个方法可以让你实现...
开发背景:在开发过程中遇到需要通过给定的值来获取对应的枚举值,如下例枚举类中,需要通过传入"春"来获取SPRING。public enum Season {
SPRING("春"),
SUMMER("夏"),
AUTUMN("秋"),
WINTER("冬");
String season;
Season(String season) {
public class Test {
public static void main(String[] args) {
System.out.println(MsgFlag5.class.getSuperclass().getName());
enum MsgFlag5 {
1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
5、String是最基本的数据类型吗?
基本数据类型包括byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类
6、int 和 Integer 有什么区别
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型 封装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
7、String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。
8、运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
9、说出Servlet的生命周期,并说出Servlet和CGI的区别。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
10、说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
11、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。
EJB包括Ses
•八大数据类型的包装类分别为:Byte、Short、Integer、Long、Character、 Float、Double、Boolean。
把基本数据类型变量包装类实例是通过对应包装类的构造器来实现的,不仅如此,8个包装类中除了
Character之外,还可以通过传入一个字符串参数来构建包装类对象。
•在java类里只能包含Field,方法,构造器,初始化块,内部类(接口、枚举)等5种成员。 用static修饰的类成员属
于类成员,类Field既可通过类来访问,也可以通过类的对象来访问。当通过对象来访问类属性时,系统会在底
层转换为通过该类来访问类 属性。
类成员规则
–1.我们把该类的构造器使用Private修饰,从而把该 类的所有构造器隐藏起来。
–2.则需要提供一个public方法作为该类的访问点,用于创建该类的对象,且必须使用static修饰
–3.该类还必须缓存已经创建的对象,必须用static修饰
final变量
• 抽象类不能被实例化,可以通过其子类给他赋值,普通类里有的抽象里也有,定义抽象方法只需在普通方法上增
加abstract修饰符,并把普通方法的方法体(也就是方法后花括号括起来的部分)全部去掉,并在方法后增加分号
抽象类的特征
•当在非静态内部类的方法内访问某个变量时,系统优先在该方法内查找是否存在该名字的局部变量,如果存在该
名字的局部变量,就使用该变量,如果不存在,则到该方法所在的内部类中查找是否存在该名字的属性,如果存在
则使用该属性。
•总之,第一步先找局部变量,第二步,内部类的属性,第三步。外部类的属性。
本文原创作者:pipi-changing
本文原创出处:http://www.cnblogs.com/pipi-changing/
–在外部类以外的地方使用内部类,内部类完整的类名应该OuterClass.InnerClass.
–在外部类以外的地方使用非静态内部类创建对象的语法如下:OuterInstance.new InnerConstructor()
–在外部类以外的地方使用静态内部类创建对象的语法如下:new OuterClass.InnerConstructer();
局部内部类
•如果把一个内部类放在方法里定义,这就是局部内部类,仅仅在这个方法里有效。
•局部内部类不能在外部类以外的地方使用,那么局部内部类也不能使用访问控制符和static修饰
匿名内部类
•匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下:
•new 父类构造器(实例列表) |实现接口)
• //匿名内部类的 类体部分
•匿名内部类不能是抽象类,匿名内部类不能定义构造器。
Lambda表达式入门
•Lambda表达式主要作用就是代替匿名内部类的繁琐语法。它由三部分组成:
–形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
–箭头(->),必须通过英文等号和大于符号组成。
–代码块。如果代码块只有包含一条语句,Lambda表达式允许省略代码块的花括号,如果省略了代码块的花括
号,这条语句不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。
Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的
Lambda表达式与函数式接口
•如果采用匿名内部类语法来创建函数式接口的实例,只要实现一个抽象方法即可,在这种情况下即可采用
Lambda表达式来创建对象,该表达式创建出来的对象的目标类型就是这个函数式接口。
•Lambda表达式有如下两个限制:
–Lambda表达式的目标类型必须是明确的函数式接口。
–Lambda表达式只能为函数式接口创建对象。Lambda表达式只能实现一个方法,因此它只能为只有一个抽
象方法的接口(函数式接口)创建对象。
•为了保证Lambda表达式的目标类型是一个明确的函数式接口,可以有如下三种常见方式:
–将Lambda表达式赋值给函数式接口类型的变量。
–将Lambda表达式作为函数式接口类型的参数传给某个方法。
–使用函数式接口对Lambda表达式进行强制类型转换。
方法引用与构造器引用
•J2SE1.5新增了一个enum关键字,用以定义枚举类。正如前面看到,枚举类是一种特殊的类,它一样可以有自
己的方法和属性,可以实现一个或者多个接口,也可以定义自己的构造器。一个Java源文件中最多只能定义一个
public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同。
•去活状态:如果程序中某个对象不再有任何引用变量引用它,它就进入了去活状态。在这个状态下,系统的垃圾
回收机制准备回收该对象所占用的内存,在回收该对象之前,系统会调用所有去活状态对象的finalize方法进行资
源清理,如果系统在调用finalize方法重新让一个引用变量引用该对象,则这个对象会再次变为激活状态;否则该
对象将进入死亡状态。
•死亡状态:当对象与所有引用变量的关联都被切断,且系统会调用所有对象的finalize方法依然没有使该对象变成
激活状态,那这个对象将永久性地失去引用,最后变成死亡状态。只有当一个对象处于死亡状态时,系统才会真正
回收该对象所占有的资源。
强制垃圾回收
–永远不要主动调用某个对象的finalize方法,该方法应交给垃圾回收机制调用。
–finalize方法的何时被调用,是否被调用具有不确定性。不要把finalize方法当成一定会被执行的方法。
–当JVM执行去活对象的finalize方法时,可能使该对象,或系统中其他对象重新变成激活状态。
–当JVM执行finalize方法时出现了异常,垃圾回收机制不会报告异常,程序继续执行。
对象的软、弱和虚引用
public class AddCommand implements Command {
public void process(int[] target) {
int sum = 0;
for (int tmp : target) {
sum += tmp;
System.out.println("数组元素的总和是:" + sum);
****************************************************
public class BetterPrinter implements Output {
private String[] printData = new String[MAX_CACHE_LINE * 2];
// 用以记录当前需打印的作业数
private int dataNum = 0;
public void out() {
// 只要还有作业,继续打印
while (dataNum > 0) {
System.out.println("高速打印机正在打印:" + printData[0]);
// 把作业队列整体前移一位,并将剩下的作业数减1
System.arraycopy(printData, 1, printData, 0, --dataNum);
public void getData(String msg) {
if (dataNum >= MAX_CACHE_LINE * 2) {
System.out.println("输出队列已满,添加失败");
} else {
// 把打印数据添加到队列里,已保存数据的数量加1。
printData[dataNum++] = msg;
************************************************
public interface Command {
// 接口里定义的process()方法用于封装“处理行为”
void process(int[] target);
**********************************************
public class CommandTest {
public static void main(String[] args) {
ProcessArray pa = new ProcessArray();
int[] target = { 3, -4, 6, 4 };
// 第一次处理数组,具体处理行为取决于PrintCommand
pa.process(target, new PrintCommand());
System.out.println("------------------");
// 第二次处理数组,具体处理行为取决于AddCommand
pa.process(target, new AddCommand());
*************************************************
public class Computer {
private Output out;
public Computer(Output out) {
this.out = out;
// 定义一个模拟获取字符串输入的方法
public void keyIn(String msg) {
out.getData(msg);
// 定义一个模拟打印的方法
public void print() {
out.out();
**********************************************
interface interfaceA {
int PROP_A = 5;
void testA();
interface interfaceB {
int PROP_B = 6;
void testB();
interface interfaceC extends interfaceA, interfaceB {
int PROP_C = 7;
void testC();
public class InterfaceExtendsTest {
public static void main(String[] args) {
System.out.println(interfaceC.PROP_A);
System.out.println(interfaceC.PROP_B);
System.out.println(interfaceC.PROP_C);
**************************************************
public interface Output
// 接口里定义的成员变量只能是常量
int MAX_CACHE_LINE = 50;
// 接口里定义的普通方法只能是public的抽象方法
void out();
void getData(String msg);
// 在接口中定义默认方法,需要使用default修饰
default void print(String... msgs)
for (String msg : msgs)
System.out.println(msg);
// 在接口中定义默认方法,需要使用default修饰
default void test()
System.out.println("默认的test()方法");
// 在接口中定义类方法,需要使用static修饰
static String staticTest()
return "接口里的类方法";
**********************************************
public class OutputFactory {
public Output getOutput() {
// return new Printer();
return new BetterPrinter();
public static void main(String[] args) {
OutputFactory of = new OutputFactory();
Computer c = new Computer(of.getOutput());
c.keyIn("轻量级Java EE企业应用实战");
c.keyIn("疯狂Java讲义");
c.print();
***********************************************
public class OutputFieldTest {
public static void main(String[] args) {
// 访问另一个包中的Output接口的MAX_CACHE_LINE
System.out.println(lee.Output.MAX_CACHE_LINE);
// 下面语句将引起"为final变量赋值"的编译异常
// lee.Output.MAX_CACHE_LINE = 20;
// 使用接口来调用类方法
System.out.println(lee.Output.staticTest());
************************************************
public class PrintCommand implements Command {
public void process(int[] target) {
for (int tmp : target) {
System.out.println("迭代输出目标数组的元素:" + tmp);
***********************************************
// 定义一个Product接口
interface Product {
int getProduceTime();
// 让Printer类实现Output和Product接口
public class Printer implements Output, Product {
private String[] printData = new String[MAX_CACHE_LINE];
// 用以记录当前需打印的作业数
private int dataNum = 0;
public void out() {
// 只要还有作业,继续打印
while (dataNum > 0) {
System.out.println("打印机打印:" + printData[0]);
// 把作业队列整体前移一位,并将剩下的作业数减1
System.arraycopy(printData, 1, printData, 0, --dataNum);
public void getData(String msg) {
if (dataNum >= MAX_CACHE_LINE) {
System.out.println("输出队列已满,添加失败");
} else {
// 把打印数据添加到队列里,已保存数据的数量加1。
printData[dataNum++] = msg;
public int getProduceTime() {
return 45;
public static void main(String[] args) {
// 创建一个Printer对象,当成Output使用
Output o = new Printer();
o.getData("轻量级Java EE企业应用实战");
o.getData("疯狂Java讲义");
o.out();
o.getData("疯狂Android讲义");
o.getData("疯狂Ajax讲义");
o.out();
// 调用Output接口中定义的默认方法
o.print("孙悟空", "猪八戒", "白骨精");
o.test();
// 创建一个Printer对象,当成Product使用
Product p = new Printer();
System.out.println(p.getProduceTime());
// 所有接口类型的引用变量都可直接赋给Object类型的变量
Object obj = p;
*************************************************
public class ProcessArray {
public void process(int[] target, Command cmd) {
cmd.process(target);
。。。。。。。。。。。。。。。。
本书系编程语言先驱者Ivor Horton的经典之作,是学习C++编程最畅销的图书品种之一,不仅涵盖了Visual C++ .NET编程知识,还全面介绍了标准C++语言和.NET C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,从中读者可以学习Visual C++ 2005的基础知识,并全面掌握在MFC和Windows Forms中访问数据源的技术。此外,本书各章后面的习题将有助于读者温故而知新,并尽快成为C++高效程序员。...
Ivor Horton是世界著名的计算机图书作家,主要从事与编程相关的顾问及撰写工作,曾帮助无数程序员步入编程的殿堂。他曾在IBM工作多年,能使用多种语言进行编程(在多种机器上使用汇编语言和高级语言),设计和实现了实时闭环工业控制系统。Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工和电子CAD系统、机械CAM系统和DNC/CNC系统方面的专家。Ivor Horton还著有Beginning Visual C++ 6、Beginning C Programming和Beginning Java 2等多部入门级好书。
封面 -18
前言 -14
目录 -9
第1章 使用Visual C++ 2005编程 1
1.1 .NET Framework 1
1.2 CLR 2
1.3 编写C++应用程序 3
1.4 学习Windows编程 4
1.4.1 学习C++ 4
1.4.2 C++标准 5
1.4.3 控制台应用程序 5
1.4.4 Windows编程概念 6
1.5 集成开发环境简介 7
1.6 使用IDE 9
1.6.1 工具栏选项 9
1.6.2 可停靠的工具栏 10
1.6.3 文档 11
1.6.4 项目和解决方案 11
1.6.5 设置Visual C++ 2005的选项 23
1.6.6 创建和执行Windows应用程序 24
1.6.7 创建Windows Forms应用程序 26
1.7 小结 29
第2章 数据、变量和计算 31
2.1 C++程序结构 31
2.1.1 程序注释 36
2.1.2 #include指令——头文件 37
2.1.3 命名空间和using声明 37
2.1.4 main()函数 38
2.1.5 程序语句 38
2.1.6 空白 40
2.1.7 语句块 41
2.1.8 自动生成的控制台程序 41
2.2 定义变量 42
2.2.1 命名变量 43
2.2.2 C++中的关键字 43
2.2.3 声明变量 44
2.2.4 变量的初值 44
2.3 基本数据类型 45
2.3.1 整型变量 45
2.3.2 字符数据类型 46
2.3.3 整型修饰符 47
2.3.4 布尔类型 48
2.3.5 浮点类型 48
2.3.6 ISO/ANSI C++中的基本类型 49
2.3.7 字面值 50
2.3.8 定义数据类型的同义词 50
2.3.9 具有特定值集的变量 51
2.3.10 指定枚举常量的类型 52
2.4 基本的输入/输出操作 53
2.4.1 从键盘输入 53
2.4.2 到命令行的输出 53
2.4.3 格式化输出 54
2.4.4 转义序列 55
2.5 C++中的计算 57
2.5.1 赋值语句 57
2.5.2 算术运算 58
2.5.3 计算余数 63
2.5.4 修改变量 63
2.5.5 增量和减量运算符 64
2.5.6 计算
讲真,java的枚举类提供的方法太少了,Enum只有两个valueOf可以搞,如果碰上需要传入枚举类型的值,获取枚举类对象或者枚举类型名称的时候,只能干瞪眼,或者循环比对。最近项目就遇到这种,而且感觉以后以及别人都不会少遇到,所以就写了个帮助类,希望以后能用上吧。这个帮助类是基于以下枚举类的类型提供的:
public enum DeleteStatusEnum {
在Java中,枚举是一种特殊的数据类型,用来定义一组有限的常量。每个枚举常量都被分配了一个整数值,称为其枚举值。
如果我们希望根据状态获取对应的枚举值,可以通过遍历整个枚举列表,并根据状态进行比较来实现。
首先,我们需要定义一个枚举类型,例如:
```java
public enum Status {
SUCCESS(0),
ERROR(1),
PENDING(2);
private int value;
private Status(int value) {
this.value = value;
public int getValue() {
return value;
在上述示例中,我们定义了一个`Status`枚举类型,包含了三个枚举常量:`SUCCESS`、`ERROR`和`PENDING`。每个枚举常量都有一个对应的整数值。
为了根据状态获取枚举值,我们可以编写一个方法,并通过遍历枚举列表来查找对应的枚举常量。
```java
public static Status getStatusByValue(int value) {
for (Status status : Status.values()) {
if (status.getValue() == value) {
return status;
return null;
在上述示例中,我们定义了一个静态方法`getStatusByValue`,该方法接收一个整数值作为参数,并通过遍历枚举列表来查找并返回对应的枚举常量。如果找不到对应的枚举常量,则返回`null`。
通过调用`getStatusByValue`方法,并传入需要获取的状态值,即可获取对应的枚举值。
```java
Status status = getStatusByValue(1);
System.out.println(status); // 输出:ERROR
通过以上步骤,我们可以根据状态值获取枚举值,从而实现根据状态获取枚举值的功能。
### 回答2:
在Java中,可以使用枚举来表示一组有限的状态。如果我们想根据状态获取对应的枚举值,可以使用枚举的特性来实现。
首先,我们需要定义一个枚举类型,其中包含了不同的状态值。例如,我们可以定义一个表示颜色的枚举类型,包含红、绿、蓝等不同的颜色。
然后,我们可以编写一个方法来根据状态获取对应的枚举值。假设我们传入一个表示状态的字符串,我们可以使用枚举的values方法来遍历所有的枚举值,然后与传入的状态进行比较,找到与之匹配的枚举值,并返回。
具体的实现代码如下所示:
```java
enum Color {
RED, GREEN, BLUE;
public class Main {
public static void main(String[] args) {
String status = "GREEN";
Color color = getColorByStatus(status);
System.out.println("Status: " + status + ", Color: " + color);
public static Color getColorByStatus(String status) {
for (Color color : Color.values()) {
if (status.equals(color.name())) {
return color;
throw new IllegalArgumentException("Invalid status: " + status);
在上述代码中,我们定义了一个Color枚举类型,包含了红、绿、蓝三种颜色。然后,我们编写了一个getColorByStatus方法,将传入的状态与枚举值进行比较,找到对应的枚举值返回。
在主方法中,我们传入了状态值"GREEN",通过调用getColorByStatus方法,获取到了对应的枚举值Color.GREEN,并将其打印输出。
总结来说,我们可以通过遍历枚举值的方式,将传入的状态与枚举值进行比较,从而获取到对应的枚举值。这样,我们就可以根据状态获取到相应的枚举值了。
### 回答3:
在Java中,我们可以使用枚举类型来表示一组有限的值。对于一个特定的枚举类型,我们可以定义不同的枚举值,并且每个枚举值都可以有相应的状态。
要根据状态获取枚举值,我们可以使用Java中的枚举反向查找。通常,我们可以通过遍历所有的枚举值,然后检查每个枚举值的状态是否与我们要查找的状态匹配。
举个例子,假设我们有一个枚举类型叫做Color,其中包含了红色、绿色和蓝色三个枚举值,并且每个枚举值都有一个对应的状态。现在我们想要根据状态获取对应的枚举值,我们可以像下面这样实现一个方法:
```java
public static Color getColorByState(int state) {
for (Color color : Color.values()) {
if (color.getState() == state) {
return color;
// 如果没有匹配的枚举值,则返回null或者抛出异常等处理
return null;
在上述的例子中,我们通过遍历Color枚举类型中的所有枚举值,然后通过比较每个枚举值的状态值与输入的状态值是否相等来获取对应的枚举值。如果找到了匹配的枚举值,则返回该枚举值;如果没有找到匹配的枚举值,则根据实际需求来处理,例如返回null或者抛出异常等。
使用枚举类型进行状态获取可以使代码更加可读和可维护,同时也能够保证输入的状态值与枚举值之间的一致性。