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);  //100000000
        System.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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

申请攻读博士学位研究生相关模板资料(包括专家推荐信、学术简历、研究计划及范文、回复导师邮件)

申请攻读博士学位研究生相关模板资料&#xff08;包括专家推荐信、学术简历、研究计划及范文、回复导师邮件&#xff09; 博士是对攻读博士学位的研究生的称呼&#xff0c;同样也可用来称呼已获得博士学位的人员。 主要通过拥有博士点的普通高等学校和拥有博士研究生培养资格…

[SUCTF 2019]EasySQL1 题目分析与详解

一、题目介绍 1、题目来源&#xff1a; BUUCTF网站&#xff0c;网址&#xff1a;https://buuoj.cn/challenges 2、题目描述&#xff1a; 通过以上信息&#xff0c;拿到flag。 二、解题思路 首先打开靶机&#xff0c;尝试输入1查看回显&#xff0c;回显如图所示&#xff1a;…

图像读取裁剪与人脸识别

图像读取 Image read ⇒ \Rightarrow ⇒ torchvision.datasets from torchvision import datasets dataset datasets.ImageFolder(data_dir, transformtransforms.Resize((512, 512)))Return value illustration dataset[0][0]是PIL.Image objects&#xff0c;这利用IPyth…

数据结构-列表LinkedList

一,链表的简单的认识. 数组,栈,队列是线性数据结构,但都算不上是动态数据结构,底层都是依托静态数组,但是链表是确实真正意义上的动态数组. 为什么要学习链表? 1,链表时最简单的动态数据结构 2,掌握链表有助于学习更复杂的数据结构,例如,二叉树,trie. 3,学习链表有助于更深入…

LeetCode 1038.从二叉搜索树到更大和树

给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下&#xff0c; 二叉搜索树 满足下列约束条件&#xff1a; 节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左…

js逆向-2

#md5加密&#xff0c;某宝案例演示。 #免责声明:本文仅供学习使用&#xff0c;请勿用于其他违法行为(╥ω╥)

软件性能测试和功能测试有何联系和区别?第三方软件检测机构简析

软件性能测试和功能测试是软件开发过程中非常重要的两个环节。从根本上说&#xff0c;它们都是为了保证软件质量和可靠性&#xff0c;但它们的目标和方法却有所不同。 软件性能测试是评估软件在特定负载下的性能表现&#xff0c;包括响应时间、吞吐量、并发能力等指标。它通过…

MySQL 学习记录 2

原文&#xff1a;https://blog.iyatt.com/?p13818 13 存储引擎 查看一下前面创建的一张表的创建语句&#xff0c;当时并没有显式指定引擎&#xff0c;MySQL 自动指定的 InnoDB&#xff0c;即默认引擎是这个。 创建表的时候要显式指定引擎可以参考这个语句 查看当前 MySQL …

如何正确使用Postman变量?又该如何灵活设置变量?

引言 Postman变量可以帮助你快速生成测试数据、模拟不同的场景和环境。 但是&#xff0c;如何正确使用Postman变量&#xff1f;又该如何灵活设置变量&#xff1f;这些问题不用担心&#xff0c;接着往下看吧&#xff01; 理解变量 为什么要使用变量&#xff1f; 如果在多个…

探索Java11新世界:JDK 11新特性详解

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

设计模式篇---观察者模式

文章目录 概念结构实例总结 概念 观察者模式&#xff1a;定义对象之间的一种一对多的依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其他相关依赖对象都得到通知并被自动更新。 观察者模式是使用频率较高的一个模式&#xff0c;它建立了对象与对象之间的依赖…

一文读懂列表解析、字典解析、集合解析

一、所谓解析/解析式&#xff0c;也称为推导/推导式&#xff0c;对应英语单词为comprehension&#xff0c;是Python的一种独有特性。解析就是从一个数据序列构建另一个新的数据序列的结构体&#xff0c;其本质是使用一个可迭代对象&#xff0c;按一定规则通过表达式、函数等运算…

Git的基本操作和原理

目录 写在前面的话 为什么要有Git&#xff08;git初识&#xff09;&#xff1f; Git安装(Centos为例) Git基本操作 创建Git本地仓库 Git配置 认识工作区、暂存区、版本库 概念认识 添加文件 查看.git文件 修改文件 版本回退 撤销修改 情况一&#xff1a;…

[数据集][目标检测]游泳者溺水数据集VOC+YOLO格式2类别895张

数据集制作单位&#xff1a;未来自主研究中心(FIRC) 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;895 标注数量(xml文件个数)&#xff1a…

博途PLC PID仿真(单容水箱液位高度控制含变积分变增益测试)

单容水箱和双荣水箱的微分方程和数值求解,可以参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/131139432https://rxxw-control.blog.csdn.net/article/details/131139432这篇博客我们利用欧拉求解器在PLC里完成单容水箱的数学建模。PLC也可以和MATL…

SpringBoot Admin 详解

SpringBoot Admin 详解 一、Actuator 详解1.Actuator原生端点1.1 监控检查端点&#xff1a;health1.2 应用信息端点&#xff1a;info1.3 http调用记录端点&#xff1a;httptrace1.4 堆栈信息端点&#xff1a;heapdump1.5 线程信息端点&#xff1a;threaddump1.6 获取全量Bean的…

基于SSM的萌宠宜家商城系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的萌宠宜家商城系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …

【黑马程序员】3、TypeScript常用类型_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址&#xff1a;【黑马程序员前端TypeScript教程&#xff0c;TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 3、TypeScript常用类型 3.1 类型注解 …

【51单片机】想学会串口通信,你需要知道这些(串口通信实验前置知识)(13)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

Qt Android sdk配置报错解决

使用的jdk8总是失败&#xff0c;报错command tools run以及platform sdk等问题。后来主要是设置jdk版本为17&#xff0c;就配置生效了。Android sdk路径可以选用Android Studio自带的&#xff0c;但是也要在Qt中点击“设置SDK”按钮做必要的下载更新等。 编译器这里会自动检测到…