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

news2025/1/12 12:26:09

话接上回,继续核心类与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

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

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

相关文章

matlab新能源汽车三自由度操纵稳定性分析及优化

1、内容简介 略 可以交流、咨询、答疑 55-新能源汽车三自由度操纵稳定性分析及优化 2、内容说明 略 摘 要 电动化是节能减排、寻求替代能源的最佳途径&#xff0c;已成为行业共识&#xff0c;论文基于江西科技学院桑塔纳轿车油改气项目&#xff0c;在拆除发动机、变速…

JAVA工程师面试专题-《Redis》篇

目录 一、基础 1、Redis 是什么 2、说一下你对redis的理解 3、Redis 为什么这么快&#xff1f; 4、项目中如何使用缓存&#xff1f; 5、为什么使用缓存&#xff1f; 6、Redis key 和value 可以存储最大值分别多是多少&#xff1f; 7、Redis和memcache有什么区别&#xf…

普中51单片机学习(8*8LED点阵)

8*8LED点阵 实验代码 #include "reg52.h" #include "intrins.h"typedef unsigned int u16; typedef unsigned char u8; u8 lednum0x80;sbit SHCPP3^6; sbit SERP3^4; sbit STCPP3^5;void HC595SENDBYTE(u8 dat) {u8 a;SHCP1;STCP1;for(a0;a<8;a){SERd…

golang学习7,glang的web的restful接口结构体传参

接口&#xff1a; //POST请求 返回json 接口传参json r.POST("/postJson", controller.PostUserInfo) 1.定义结构体 //定义结构体 type Search struct {Id intName string }2.结构体传参 //结构体传参 func PostUserInfo(c *gin.Context) {search : &Searc…

GO语言基础总结

多态&#xff1a; 定义一个父类的指针&#xff08;接口&#xff09;&#xff0c;然后把指针指向子类的实例&#xff0c;再调用这个父类的指针&#xff0c;然后子类的方法被调用了&#xff0c;这就是多态现象。 Golang 高阶 goroutine 。。。。。 channel channel的定义 …

FPS游戏漫谈优化包体传输

在游戏服务器的部署环境中&#xff0c;机房的网络带宽都是有限制的。如果通信传输的数据总量太大&#xff0c;会挤占带宽甚至达到带宽上限&#xff0c;影响正常消息发送。另外&#xff0c;如果包体太大&#xff0c;在弱网环境下的通信质量会变差&#xff0c;更容易发生丢包重传…

VB6添加资源文件总是内存溢出?最终我还是治好了这胎里病!

网管小贾 / sysadm.cc 说来也奇怪&#xff0c;话说不久前我刚刚解决了 VB6 释放资源文件的一个 BUG &#xff0c;心里正美滋滋的。 不料居然还有个巨大的 BUG 在后边等着我呢&#xff01; 真是不说不知道&#xff0c;一说吓一跳&#xff0c;十天找 BUG &#xff0c;N把辛酸泪…

【国产MCU】-CH32V307-定时器同步模式

定时器同步模式 文章目录 定时器同步模式1、定时器同步模式介绍2、驱动API介绍3、定时器同步模式实例1、定时器同步模式介绍 CH32V307的定时器能够输出时钟脉冲(TRGO),也能接收其他定时器的输入(ITRx)。不同的定时器的ITRx的来源(别的定时器的TRGO)是不一样的。 通用定…

Python高性能web框架--Fastapi快速入门

文章目录 fastapi框架一、预备知识点1.1、http协议一、简介二、 http协议特性三、http请求协议与响应协议 1.2、api接口 二、quick start简单案例 fastapi框架 Fastapi&#xff0c;一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的web框架。 fastapi的两个核心…

单步调试Linux内核论证水位线

哈喽&#xff0c;我是子牙&#xff0c;一个很卷的硬核男人 深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程。为了保证课程质量及教学效果&#xff0c;一年磨一剑&#xff0c;三年先后做了这些课程&#xff1a;手写JVM、手写OS…

Linux安装jdk、tomcat、MySQL离线安装与启动

一、JDK和Tomcat的安装 1.JDK安装 直接上传到Linux服务器的&#xff0c;上传jdk、tomcat安装包 解压JDK安装包 //解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 置环境变量(JAVA_HOME和PATH) vim /etc/profile 在文件末尾添加以下内容&#xff1a; //java environment expo…

matlab一维二维和三维RBF插值方法

1、内容简介 略 50-可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 matlab一维二维和三维RBF插值方法_哔哩哔哩_bilibili 4、参考论文 略

【Linux运维系列】vim操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

03-Linux权限

root用户 root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用的管理模式进行权限管理 在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#xff08;超级管理员&#xff09;刚开始学习的时候&#xff0c;大多时间都是用的…

MySQL 篇-深入了解 DDL 语言(一)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 MySQL 说明 2.0 DDL 语言 2.1 DDL 语言 - 定义数据库 2.1.1 创建数据库操作 2.1.2 查看数据库操作 2.1.3 使用数据库操作 2.1.4 删除数据库操作 2.2 DDL 语言 …

leetcode-hot100-双指针

剪枝&#xff0c;减少不必要的计算 283. 移动零 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出: [0] 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 第一印象&#xff1a;使用一个辅助数组&#xff0c;同时以…

蓝桥杯-答疑

原题链接&#xff1a;用户登录 答疑 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老师办公室答疑。一位同学答疑的过程如下 1.首先进入办公室&#xff0c;编号为 的同学需要 s&#xff0c;…

卖家横扫海外露营市场的机会来了,赛盈分销预测2024年消费者新需求

甲辰龙年开篇&#xff0c;就要迎来国外野营浪潮了&#xff0c;希望点开这篇推送的你&#xff0c;红红火火、热辣滚烫一整年。每年的3月份&#xff0c;海外用户对露营设备的搜索开始迅速增长。今天和大家聊聊露营市场出海的一些布局方向。 全球露营商品的市场规模愈发壮大&#…

Wireshark过滤DNS协议包语法实战

背景 现网DNS服务器发现CPU突增&#xff0c;发现有可能是客户恶意发起的随机子域名扫描&#xff0c;对服务器进行抓包分析&#xff0c;记录下当时的操作。 抓包 执行命令 tcpdump -iany port 53 and host $ip -nnv -w $ip.pcap进行抓包导出到本地&#xff0c;使用Wireshark进…

网站开发--详解Servlet

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网站开发–详解Servlet 一.基本介绍 tomcat是Java中开发服务器的重要的一个工具,任何开发的服务器都要部署在tomcat之上,可以说tomcat是所有服务器的底座,为了更好的操作http,to…