Java核心-核心类与API(3)

话接上回,继续核心类与API的学习,这次介绍一下枚举类以及与系统、交互有关的类,需要了解并能使用即可。
在这里插入图片描述

一、枚举类

1、概述

枚举也称穷举,简单理解就是把所有可能一一列举出来(穷尽所有可能)。枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。使用 enum 关键字来定义枚举类,各个常量使用逗号( , ) 分割。如一年的 4 个季节、12 个月份,一个星期的 7 天。

2、声明

必须使用 enum 关键字声明枚举,并定义枚举的名称、可访问性、基础类型和成员等。

注:如果没有显式地声明基础类型的枚举,则基础类型是 int。

3、案例

//定义一个表示颜色的枚举类型 Color
public enum Color {RED,BLUE,GREEN,BLACK;  //可通过枚举类型名直接引用常量,如 Color.RED
}
//使用枚举使switch语句的可读性更强
enum Signal {// 定义一个枚举类型GREEN,YELLOW,RED
}
public class TrafficLight {Signal color = Signal.RED;public void change() {switch(color) {case RED:color = Signal.GREEN;break;case YELLOW:color = Signal.RED;break;case GREEN:color = Signal.YELLOW;break;}}
}

4、枚举类

4.1 几点注意

1)每一个枚举都继承自 java.lang.Enum 类。
2)当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,书写时可省略这些关键词。当使用枚举类型成员时,直接使用枚举名称调用成员即可。
3)所有枚举实例都可以调用 Enum 类的方法,主要有

values():以数组形式返回枚举类型的所有成员

valueOf():将普通字符串转换为枚举实例

compareTo():比较两个枚举成员在定义时的顺序

ordinal():获取枚举成员的索引位置等。

4.2 案例

1)创建一个包含3个成员的枚举类型Signal,并调用values()方法输出这些成员

enum Signal {  // 定义一个枚举类型GREEN,YELLOW,RED
}
public class Color {public static void main(String[] args){for(int i=0;i<Signal.values().length;i++)System.out.println("枚举成员:"+Signal.values()[i]);}
}
//结果
枚举成员:GREEN
枚举成员:YELLOW
枚举成员:RED

2)调用valueOf()方法获取枚举的一个成员,再调用compareTo()方法进行比较

enum Sex {  // 定义一个枚举类型male,female;
}
public class Gender {public static void main(String[] args){compare(Sex.valueOf("male"));}public static void compare(Sex s){for(int i=0;i<Sex.values().length;i++){System.out.println(s + "与" + Sex.values()[i] + "的比较结果是:" + s.compareTo(Sex.values()[i]));}}
}
//结果
male与male的比较结果是:0
male与female的比较结果是:-1

3)调用枚举类型实例的ordinal()方法,获取成员在枚举中的索引位置。

enum Sex {  // 定义一个枚举类型male,female;
}
public class Gender {public static void main(String[] args){for(int i=0;i<Sex.values().length;i++){System.out.println("索引" + Sex.values()[i].ordinal()+",值:" + Sex.values()[i]);}}
}
//结果
索引0,值:male
索引1,值:female
4.3 为枚举添加方法

1)必须在枚举实例的最后一个成员后添加分号,而且必须先定义枚举实例。看如下示例

enum WeekDay {  // 定义一个枚举类型Mon("Monday"), Tue("Tuesday"), Wed("Wednesday"), Thu("Thursday"), Fri("Friday"), Sat("Saturday"), Sun("Sunday");// 以上是枚举的成员,必须先定义,而且使用分号结束private final String day;private WeekDay(String day) {this.day = day;}public static void printDay(int i) {switch (i) {case 1:System.out.println(WeekDay.Mon);break;case 2:System.out.println(WeekDay.Tue);break;case 3:System.out.println(WeekDay.Wed);break;case 4:System.out.println(WeekDay.Thu);break;case 5:System.out.println(WeekDay.Fri);break;case 6:System.out.println(WeekDay.Sat);break;case 7:System.out.println(WeekDay.Sun);break;default:System.out.println("wrong number!");}}public String getDay() {return day;}public static void main(String[] args){for(WeekDay day:WeekDay.values()){ // for-each遍历System.out.println(day+"--->"+day.getDay());}WeekDay.printDay(5);}
}
//结果
Mon--->Monday
Tue--->Tuesday
Wed--->Wednesday
Thu--->Thursday
Fri--->Friday
Sat--->Saturday
Sun--->Sunday
Fri
4.4 EnumMap 与 EnumSet(了解,可不看)

为了能够更高效地操作枚举类型,java.util 中增加了两个新类:EnumMap 和 EnumSet
1)EnumMap
EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其他的 Map(如 HashMap)实现也能完成枚举类型实例到值的映射,但使用 EnumMap 更加高效。

注:HashMap 只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值,使得 EnumMap 的效率非常高。

2)EnumSet
EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。

二、交互相关

1、Console类(简单了解)

JDK6中提供了java.io.Console类专用来访问基于字符的控制台设备。Console类的目的是使Java程序和控制台之间的交互更容易。

import java.io.Console; //导包
public class Demo1 {public static void main(String[] args) {Console console = System.console();  //通过调用 System.console() 方法获得该类唯一的实例if (console != null) {  //判断console是否可用String user = console.readLine("Enter user:");  //读取整行字符String pwd = new String(console.readPassword("Enter password:"));  //读取密码,密码输入时不会显示console.printf("User is:" + user + "\n");console.printf("Password is:" + pwd + "\n");} else {System.out.println("Console is unavailable");//Console is unavailable,表示Console不可获得,因为JVM不是在命令行中被调用的或者输入输出被重定向了//如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的Console实例}}
}

2、Scanner类(掌握)

Scanner类用于获取用户输入,使用前先导包:import java.util.Scanner。以下是一些常用方法介绍。

2.1 next方法

直接看案例

import java.util.Scanner; //导包
public class ScannerDemo {public static void main(String[] args){Scanner sc=new Scanner(System.in); //从键盘接收数据if(sc.hasNext()){ //判断是否还有输入String s=sc.next();System.out.println("输入的数据为:"+s);}sc.close(); //关闭输入通道,防止内存损耗}
}

输入zhangsan lishi,如下

// 输入
zhangsan lishi
// 结果(可以看到 lishi 字符串并未输出)
输入的数据为:zhangsan
2.2 nextLine方法

直接看案例

import java.util.Scanner; //导包
public class ScannerDemo {public static void main(String[] args){Scanner sc=new Scanner(System.in); //从键盘接收数据if(sc.hasNextLine()){ //判断是否还有输入String s=sc.nextLine();System.out.println("输入的数据为:"+s);}sc.close(); //关闭输入通道,防止内存损耗}
}

输入zhangsan lishi,如下

// 控制台输入
zhangsan lishi
// 结果(可以看到 lishi 字符串已经输出)
输入的数据为:zhangsan lishi
2.3 总结

1)next() 与 nextLine() 区别
next():

  • 一定要读取到有效字符后才可以结束输入。(未输入有效字符前输入空格,按enter后不会结束)
  • 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
  • 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  • next() 不能得到带有空格的字符串。

nextLine():

  • 以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
  • 可以获得空白。

pass:一般情况nextLine()方法使用得较多。

2.4 输入类型

除了nextLine()方法,还有其他很多类型,这里列举几种,直接看如下案例。

import java.util.Scanner; //导包
public class ScannerDemo {public static void main(String[] args){Scanner sc=new Scanner(System.in); //从键盘接收数据String name = sc.nextLine();  //字符串输入int age = sc.nextInt();   //数字输入double salary = sc.nextDouble();sc.close(); //关闭输入通道,防止内存损耗System.out.println("Name: " + name);System.out.println("Age: " + age);System.out.println("Salary: " + salary);}
}

结果

// 控制台输入
zhangsan
21
10000.88
// 输出结果
Name: zhangsan
Age: 21
Salary: 10000.88
2.5 综合案例(使用Scanner类求总和及平均数)
import java.util.Scanner; //导包
public class ScannerDemo {public static void main(String[] args){System.out.println("请输入数字:");Scanner sc = new Scanner(System.in);double sum = 0; //初始化int m = 0;while (sc.hasNextDouble()) { //输入非数字结束循环double x = sc.nextDouble();m = m + 1; //计数sum = sum + x; //累加求和}System.out.println(m + "个数的和为" + sum);System.out.println(m + "个数的平均值是" + (sum / m));sc.close();}
}

结果

请输入数字:
10
20
30
end
3个数的和为60.0
3个数的平均值是20.0

二、系统相关

1、System类

1.1 概述

System类代表当前java程序的运行平台,系统级的很多属性和控制方法都放置在该类的内部。由于该类的构造方法是 private 的,无法创建该类的对象,即无法实例化该类。

1.2 System类的成员变量(了解)

PrintStream out:标准输出流。
InputStream in:标准输入流。
PrintStream err:标准的错误输出流。

1.3 System类的成员方法

System 类中提供了一些系统级的操作方法,常用有 arraycopy()、currentTimeMillis()、exit()、gc() 和 getProperty()。
1)arraycopy()方法
数组复制,即从指定源数组中复制一个数组。

//arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
//参数说明:(源数组,从源数组复制的起始位置,目标数组,要复制到的目标数组的起始位置,复制的个数)
public class SystemDemo {public static void main(String[] args) {char[] srcArray={'A','B','C','D'};char[] destArray={'E','F','G','H'};System.arraycopy(srcArray,1,destArray,1,2);System.out.println("源数组:");for(int i=0;i<srcArray.length;i++){ //遍历输出System.out.println(srcArray[i]);  //源数组:A B C D (纵向)}System.out.println("目标数组:");for(int j=0;j<destArray.length;j++){System.out.println(destArray[j]);  //目标数组:E B C H (纵向)}}
}

2)currentTimeMillis()方法
返回当前的计算机时间。long m = System.currentTimeMillis(); ,获得一个长整型的数字,是以差值表达的当前时间(当前计算机时间与 GMT 时间(格林尼治时间)1970 年 1 月 1 日 0 时 0 分 0 秒所差的毫秒数)。

作用:测试不同算法程序的执行效率高低,用于后期线程控制时的精确延时实现。

public class SystemDemo {public static void main(String[] args) {long start=System.currentTimeMillis();int a=0;for(int i=0;i<100000000;i++){ //循环100000000次a++;  //a=a+1,自增加一}long end=System.currentTimeMillis();long time=end-start;  //for循环执行所需要的毫秒数System.out.println(a);  //100000000System.out.println(("程序运行前时间"+start+"秒"));  //程序运行前时间1673702597732秒System.out.println(("程序运行后时间"+end+"秒"));  //程序运行后时间1673702597734秒System.out.println(("程序执行时间为"+time+"秒"));  //程序执行时间为2秒}
}

3)exit()方法
终止当前正在运行的 Java 虚拟机。exit(int status),status = 0 时为正常退出,非零为异常退出,较常应用在图形界面编程中实现程序的退出功能等。
4)gc()方法
请求系统进行垃圾回收,完成内存中的垃圾清除。
5)getProperty()方法
使用该方法可以获得很多系统级的参数以及对应的值。

public class SystemDemo {public static void main(String[] args) {String jversion = System.getProperty("java.version");String oName = System.getProperty("os.name");String user = System.getProperty("user.name");System.out.println("Java运行时环境版本:"+jversion);System.out.println("当前操作系统是:"+oName);System.out.println("当前用户是:"+user);}
}

结果

Java运行时环境版本:11.0.14
当前操作系统是:Windows 10
当前用户是:ASUS

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

前端学习——JS学习

文章目录 1. 定义变量&#xff0c;关键字 var、let、const2. 定义变量&#xff0c;数据类型3. 数组变量的操作4. 对象的操作5. JSON 字符串 1. 定义变量&#xff0c;关键字 var、let、const 这里主要是对var、let做比较 /** 1. var存在变量提升、let不存在变量提升 **/ cons…

【C语言基础】:操作符详解(一)

文章目录 操作符详解1. 操作符的分类2. 二进制和进制转换2.1 什么是二进制、八进制、十进制、十六进制2.1.1 二进制和进制转换2.1.2 二进制转十进制2.2.3 二进制转八进制2.2.4 二进制转十六进制 3. 源码、反码、补码4. 移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符&…

【域适应论文汇总】未完结

文章目录 DANN&#xff1a;Unsupervised Domain Adaptation by Backpropagation (2015)TADA&#xff1a;Transferable Attention for Domain Adaptation&#xff08;2019 AAAI&#xff09;1 局部注意力迁移&#xff1a;Transferable Local Attention2 全局注意力迁移&#xff1…

调度服务看门狗配置

查看当前服务器相关的sqlserver服务 在任务栏右键&#xff0c;选择点击启动任务管理器 依次点击&#xff0c;打开服务 找到sqlserver 相关的服务&#xff0c; 确认这些服务是启动状态 将相关服务在看门狗中进行配置 选择调度服务&#xff0c;双击打开 根据上面找的服务进行勾…

打开 Camera app 出图,前几帧图像偏暗、偏色该怎样去避免?

1、问题背景 使用的安卓平台&#xff0c;客户的应用是要尽可能快的获取到1帧图像效果正常的图片。 但当打开 camera 启动出流后&#xff0c;前3-5帧图像是偏暗、偏色的&#xff0c;如下图所示&#xff0c;是抓取出流的前25帧图像&#xff0c; 前3帧颜色是偏蓝的&#xff0c;…

vue2和vue3 setup beforecreate create生命周期时间比较

创建一个vue程序&#xff0c;vue3可以兼容Vue2的写法&#xff0c;很流畅完全没问题 写了一个vue3组件 <template><div></div> </template><script lang"ts"> import {onMounted} from vue export default{data(){return {}},beforeCr…

操作符详解3

✨✨ 欢迎大家来到莉莉的博文✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 前面我们已经讲过算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单目操作 符&#xff0c;今天继续介绍一部分。 目录 1.操作符的分类 2…

【软件测试面试】要你介绍项目-如何说?完美面试攻略...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试面试时&am…

QtRVSim F扩展实现(一):解码阶段

跟踪解码流程可以发现&#xff0c;解码主要是读取 instruction.cpp 里存储的指令集数组进行解码的。 那么对于实现 F 扩展指令集&#xff0c;第一步能成功读取识别新指令&#xff0c;就需要从这里入手。 解码部分代码&#xff1a; static inline const struct InstructionMa…

12. Springboot集成Dubbo3(三)Dubbo-Admin

目录 1、前言 2、安装 2.1、下载Dubbo-admin 2.2、修改配置 2.3、编译前端 2.4、访问 2.5、加载自己的服务 2.6、服务测试 2.7、其他 3、小结 1、前言 Dubbo Admin是用于管理Dubbo服务的基于Web的管理工具。Dubbo Admin提供了一个用户友好的界面&#xff0c;用于在分…

C/C++暴力/枚举/穷举题目持续更新(刷蓝桥杯基础题的进!)

目录 前言 一、百钱买百鸡 二、百元兑钞 三、门牌号码&#xff08;蓝桥杯真题&#xff09; 四、相乘&#xff08;蓝桥杯真题&#xff09; 五、卡片拼数字&#xff08;蓝桥杯真题&#xff09; 六、货物摆放&#xff08;蓝桥杯真题&#xff09; 七、最短路径&#xff08;蓝…

二蛋赠书十六期:《高效使用Redis:一书学透数据存储与高可用集群》

很多人都遇到过这么一道面试题&#xff1a;Redis是单线程还是多线程&#xff1f;这个问题既简单又复杂。说他简单是因为大多数人都知道Redis是单线程&#xff0c;说复杂是因为这个答案其实并不准确。 难道Redis不是单线程&#xff1f;我们启动一个Redis实例&#xff0c;验证一…

【Java程序设计】【C00262】基于Springboot的会员制医疗预约服务管理系统(有论文)

基于Springboot的会员制医疗预约服务管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的会员制医疗预约服务管理信息系统&#xff0c;本系统分为三种角色&#xff1a;管理员、医生和会员&#xff1b; 在系统…

Web3 基金会推出去中心化之声计划:投入高额 DOT 和 KSM ,助力去中心化治理

作者&#xff1a;Web3 Foundation Team 编译&#xff1a;OneBlock 原文&#xff1a;https://medium.com/web3foundation/decentralized-voices-program-93623c27ae43 Web3 基金会为 Polkadot 和 Kusama 创建了去中心化之声计划&#xff08;Decentralized Voices Program&…

【生活】浅浅记录

各位小伙伴们好鸭&#xff0c;今天不是技术文章&#xff0c;浅浅记录一下最近几个月的收获&#x1f60a; 新的一年&#xff0c;一起努力&#xff0c;加油加油&#xff01;

vue3(vite)+electron打包踩坑记录(1)

vue3(vite)electron打包踩坑记录 - 打包vue 第一步 编译vue 使用vite构建vue&#xff0c;package.json如下 {"name": "central-manager","private": true,"version": "0.0.0","type": "commonjs",&q…

2023年总结与2024展望

今天是春节后上班第一天&#xff0c;你懂的&#xff0c;今天基本上是摸鱼状态&#xff0c;早上把我们负责的项目的ppt介绍完善了一下&#xff0c;然后写了一篇技术文章&#xff0c;《分布式系统一致性与共识算法》。接着就看了我近几年写的的年度总结&#xff0c;我一般不会在元…

代码随想录算法训练营day27|39. 组合总和、40.组合总和II

39. 组合总和 如下树形结构如下&#xff1a; 选取第二个数字5之后&#xff0c;剩下的数字要从5、3中取数了&#xff0c;不能再取2了&#xff0c;负责组合就重复了&#xff0c;注意这一点&#xff0c;自己做的时候没想明白这一点 如果是一个集合来求组合的话&#xff0c;就需…

【C++精简版回顾】12.友元函数

1.友元函数 1.class class MM { public:MM(int age,string name):age(age),name(name){}friend void print(MM mm); private:int age;string name;void print() {cout << age << "岁的" << name << "喜欢你" << endl;} }; f…

Redis如何修改key名称

点击上方蓝字关注我 近期出现过多次修改Redis中key名字的场景&#xff0c;本次简介一下如何修改Redis中key名称的方法。 1. 命令行方式修改在Redis中&#xff0c;可以使用rename命令来修改Key的名称。这个命令的基本语法如下&#xff1a; RENAME old_key new_key 在这里&#…