Java026——System 类和Scanner 类

news2024/9/24 7:20:40

一、System 类

1.1、System 类提供的常用方法

=======================================================================================================================
	方法													功能描述
-----------------------------------------------------------------------------------------------------------------------
currentTimeMillis()			返回当前计算机时间 和 格林威治时间(GMT197011000秒所差的毫秒数
-----------------------------------------------------------------------------------------------------------------------
exit(int status)  			该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。使用该方法可以在图形界面编程中
							实现程序的退出功能等。
-----------------------------------------------------------------------------------------------------------------------
getProperty()				获取当前系统属性
-----------------------------------------------------------------------------------------------------------------------
getProperty(String key)		该方法的作用是获得系统中属性名为 key 的属性对应的值。系统中常见的属性名以及属性的作用如下:
							  属性名					   属性说明
							java, version			Java 运行时环境版本
							java.home				Java 安装目录
							os.name					操作系统的名称
							os.version				操作系统的版本
							user.name				用户的账户名称
							user.home				用户的主目录
							user.dir				用户的当前工作目录	
-----------------------------------------------------------------------------------------------------------------------
arraycopy()					该方法的作用是数组拷贝,也就是将一个数组中的内容复制到另外一个数组中的指定位置,由于该方法是native方法,
							所以性能上比使用循环高效。
-----------------------------------------------------------------------------------------------------------------------
gc()						该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时
							的情况。
-----------------------------------------------------------------------------------------------------------------------
getenv()					获取所有的系统变量的值
getenv(String name)			获取指定的系统变量的值
=======================================================================================================================

1.2、currentTimeMillis()方法

public static long currentTimeMillis()

class test {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();//循环开始前记录一个时间
        /************获取for循环执行时间**************/
        int a = 0;
        for (int i = 0; i < 100000000; i++) {
            a += 1;
        }
        /******************************************/
        long end = System.currentTimeMillis();//循环结束后记录一个时间
        System.out.println("运行时间等于 == " + (end - start) + "毫秒");//两个时间相减,就得到for循环运行时间
    }
}

//运行结果
运行时间等于 == 2毫秒

1.3、exit(int status)方法

public static void exit(int status)
该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等。

class test {
    public static void main(String[] args) {
        System.out.println("程序正常运行,这条语句会执行");
        System.out.println("程序还是正常运行,这条语句会执行");
        System.exit(0);//使用System调用exit方法,程序退出
        System.out.println("还没运行到这里就退出了,这条语句不会执行");
    }
}

//运行结果
程序正常运行,这条语句会执行
程序还是正常运行,这条语句会执行

1.4、getProperty(String key)

getProperty(String key)		该方法的作用是获得系统中属性名为 key 的属性对应的值。系统中常见的属性名以及属性的作用如下:
							  属性名					   属性说明
							java, version			Java 运行时环境版本
							java.home				Java 安装目录
							os.name					操作系统的名称
							os.version				操作系统的版本
							user.name				用户的账户名称
							user.home				用户的主目录
							user.dir				用户的当前工作目录

示例

class test {
    public static void main(String[] args) {
        String javaVersion = System.getProperty("java.version");
        System.out.println("java 的 version:" + javaVersion);

        String javaHome = System.getProperty("java.home");
        System.out.println("java 的 home:" + javaHome);

        String osName = System.getProperty("os.name");
        System.out.println("os 的 name:" + osName);

        String osVersion = System.getProperty("os.version");
        System.out.println("os 的 version:" + osVersion);

        String userName = System.getProperty("user.name");
        System.out.println("user 的 name:" + userName);

        String userHome = System.getProperty("user.home");
        System.out.println("user 的 home:" + userHome);

        String userDir = System.getProperty("user.dir");
        System.out.println("user 的 dir:" + userDir);
    }
}

//运行结果
java 的 version:1.8.0_371
java 的 home:D:\ErmaoWang\SoftwareInstall\Entertainment\jdk-8u371-windows-x64\jre
os 的 name:Windows 11
os 的 version:10.0
user 的 name:王二毛
user 的 home:C:\Users\王二毛
user 的 dir:D:\ErmaoWang\Documents\myStudy\java\001\HelloWorld

1.5、arraycopy()方法

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
该方法的作用是数组拷贝,也就是将一个数组中的内容复制到另外一个数组中的指定位置,由于该方法是native方法,所以性能上比使用循环高效。
使用示例:

class test {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4};
        int[] b = new int[5];
        System.arraycopy(a, 1, b, 3, 2);

        for (int i = 0; i < b.length; i++) {
            System.out.println(b[i]);
        }
    }
}

//运行结果
0
0
0
2
3

该代码的作用是将数组a中,从下标为1开始,复制到数组b从下标3开始的位置,总共复制2个。也就是将a[1]复制给b[3],将a[2]复制给b[4],这样经过复制以后数组a中的值不发生变化,而数组b中的值将变成{0,0,0,2,3}。

1.6、gc()垃圾回收

public static void gc()
该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。

在Java中,垃圾回收(Garbage Collection,GC)是一种自动内存管理机制。它负责在程序运行过程中,自动回收不再使用的对象所占用的内存空间,以避免内存泄漏和内存溢出的问题。

垃圾回收工作的原理如下:

  1. 标记-清除(Mark and Sweep)算法:该算法是垃圾回收的基本算法。它通过标记所有活动对象(即仍然被引用的对象),然后清除未被标记的对象,并回收它们占用的内存空间。

  2. 引用计数(Reference Counting)算法:该算法会为每个对象维护一个引用计数器,记录对象被引用的次数。当引用计数为0时,表示该对象不再被引用,即为垃圾对象,可以被回收。

Java中的垃圾回收由Java虚拟机(JVM)负责管理。JVM会周期性地执行垃圾回收操作,具体的触发时机和算法取决于具体的JVM实现。

以下是一些常用的垃圾回收算法和相关概念:

  1. 标记-清除(Mark and Sweep)算法:在垃圾回收过程中,首先通过根对象进行标记,然后遍历整个对象图,标记所有可达的对象,最后清除未被标记的对象。

  2. 复制(Copying)算法:将内存分为两个区域,一个是当前使用的区域,另一个是空闲的区域。当当前区域使用完时,将存活的对象复制到空闲区域,并清除当前区域中的所有对象。

  3. 标记-整理(Mark and Compact)算法:在标记过程之后,会将所有存活的对象向一端移动,然后清除边界之外的空间。这样可以解决碎片化问题,提高内存的连续性。

需要注意的是,程序员不需要手动释放对象的内存,由JVM自动管理。但是,程序员可以通过手动调用System.gc()方法来建议JVM执行垃圾回收操作,但是具体是否执行和何时执行垃圾回收,仍然由JVM决定。

使用垃圾回收机制可以简化内存管理,减少内存泄漏的可能性,但也会有一定的性能开销。在编写Java代码时,应避免不必要的创建对象和保持过多的长期引用,以减少垃圾回收的次数和开销。

class test {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4};
        int[] b = new int[5];
        System.arraycopy(a, 1, b, 3, 2);

        for (int i = 0; i < b.length; i++) {
            System.out.println(b[i]);
        }

        System.gc();//垃圾回收
    }
}

1.7、getenv()

获取指定的系统变量的值
在这里插入图片描述

class test {
    public static void main(String[] args) {
        String javaHome = System.getenv("JAVA_HOME");
        System.out.println("javaHome的值:" + javaHome);
    }
}

//运行结果
javaHome的值:D:\EnyiWang\SoftwareInstall\Entertainment\jdk-8u371-windows-x64

1.8、控制台输出字符

class test {
    public static void main(String[] args) {
        //不换行输出
        System.out.print("Hello");
        System.out.print(" Java");

        //换行输出
        System.out.println("Hello");
        System.out.println(" Java");
    }
}

二、Scanner 类

主要作用:获取控制台输入的内容
Scanner类是Java标准库中的一个工具类,用于获取用户输入的数据。它提供了多种方法来读取基本数据类型和字符串。以下是Scanner类的常用用法:

  1. 导入java.util.Scanner类:
    在使用Scanner类之前,需要在代码中导入java.util.Scanner包。

  2. 创建Scanner对象:
    使用new关键字创建一个Scanner对象,并通过构造函数传入输入流(通常是System.in,表示从标准输入读取数据)。

    Scanner scanner = new Scanner(System.in);
    
  3. 读取基本数据类型:
    Scanner类提供了多个nextXxx()方法,可以读取不同类型的基本数据。例如:

    // 读取整数
    int num = scanner.nextInt();
    
    // 读取浮点数
    double value = scanner.nextDouble();
    
    // 读取布尔值
    boolean flag = scanner.nextBoolean();
    
  4. 读取字符串:
    Scanner类的next()方法用于读取下一个以空格分隔的字符串,nextLine()方法用于读取整行字符串。例如:

    // 读取单词
    String word = scanner.next();
    
    // 读取整行文本
    String line = scanner.nextLine();
    

    注意:使用nextLine()方法读取整行字符串时,Scanner会读取上一次调用nextXxx()方法时遗留的换行符。可以在读取整行字符串之前使用nextLine()方法清空换行符。

  5. 关闭Scanner对象:
    当不再需要使用Scanner对象时,应该调用close()方法关闭它,释放系统资源。

    scanner.close();
    

以上是Scanner类的一些常用用法。通过Scanner类,可以方便地从用户输入中读取数据,进行后续的处理和计算。

2.1、Scanner 类的几个常用方法

=======================================================================================================================
方法											返回类型										功能描述
-----------------------------------------------------------------------------------------------------------------------
next()										String							查找并返回此扫描器获取的下一个完整标记
nextBoolean()								boolean							扫描一个布尔值标记并返回
nextBtye()									byte 							扫描一个值返回 byte 类型
nextDouble()								double							扫描一个值返回 double 类型
nextFloat()									float							扫描一个值返回 float 类型
nextInt()									int 							扫描一个值返回 int 类型
nextLine()									String 							扫描一个值返回 String 类型
nextLong() 									long 							扫描一个值返回 long 类型
nextShort() 								short							扫描一个值返回 short 类型
close() 									void							关闭此扫描器
=======================================================================================================================

在这里插入图片描述

2.2、nextInt()简单的int类型输入

class test {
    public static void main(String[] args) {
        System.out.println("请输入一个数");
        Scanner sc=new Scanner(System.in); //步骤1、创建Scanner类的对象
        int i = sc.nextInt(); //步骤2、创建一个变量用于接收(输入对象sc)的值,
        					  //运行到此代码时控制台将等待用户输入一个int值,并给予变量i
        System.out.println("你输入的数字是:"+i);
        sc.close();//步骤3、手动关闭scanner,否则会一直占用空间
    }
}

//运行结果
请输入一个数
12
你输入的数字是:12

2.3、nextLine()和next()及两者的区别

nextLine()可以扫描到一行内容(当前行,光标所在行的内容,包括空格、回车)并作为一个字符串而被获取到
next()获得有效字符串后遇到的第一个空格就会结束读取。比如,输入hello world.最终的输出结果为hello。

2.3.1、next()

class test {
    public static void main(String[] args) {
        //创建一个扫描器对象,用于接收键盘数据
        Scanner scan = new Scanner(System.in);
        //提示输入
        System.out.println("使用next方式接收:");
        //使用next方式接收
        String str = scan.next();
        //输出结果
        System.out.println("输出的内容为:"+str);
        //及时关闭IO流的类,否则会一直占用资源
        scan.close();
    }
}

//运行结果
使用next方式接收:
I am Iron Man
输出的内容为:I

2.3.2、nextLine()

class test {
    public static void main(String[] args) {
        //创建一个扫描器对象,用于接收键盘数据
        Scanner scan = new Scanner(System.in);
        //提示输入
        System.out.println("使用next方式接收:");
        //使用next方式接收
        String str = scan.nextLine();
        //输出结果
        System.out.println("输出的内容为:"+str);
        //及时关闭IO流的类,否则会一直占用资源
        scan.close();
    }
}

//运行结果
使用next方式接收:
I am Iron Man
输出的内容为:I am Iron Man

2.4、通过使用Scanner类的next()与nextLine()方法获取输入的字符串,在读取之前一般需要使用hasNext()与hasNextLine()进行判断是否还有输入的数据。

hasNext()hasNextLine()Scanner类中用于检查输入中是否还有下一个数据项的方法。

  • hasNext()方法用于检查是否有下一个可用的单词(以空格分隔的字符串)或非空白字符序列。
  • hasNextLine()方法用于检查是否有下一行可用的数据。

这两个方法都返回一个boolean值,true表示有下一个数据项可用,false表示输入结束或没有下一个数据项可用。

以下是使用示例:

class test {
    public static void main(String[] args) {
        //创建一个扫描器对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);

        // 使用hasNext()循环读取多个整数
        while (scanner.hasNext()) {
            String str = scanner.next();
            if(str.equals("jieshu")){//当输入jieshu时退出循环
                break;
            }
            System.out.println("输入的是: " + str);
        }

        // 使用hasNextLine()循环读取多行文本
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if(line.equals("")){//当下一行只按下回车,什么都不输入时退出循环
                break;
            }
            System.out.println("输入的行是: " + line);
        }

        scanner.close();
    }
}

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

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

相关文章

mysql查询练习

1.创建表 CREATE TABLE worker( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10) NOT NULL DEFAULT 群众 , 姓名 varchar(20) NOT NULL,出生日期 date NOT NULL,PRIMARY KEY (职工号))ENGINE…

4.3Java EE——一对多查询

用户与订单关联关系图​​​​​​​ 与一对一的关联关系相比&#xff0c;接触更多的关联关系是一对多&#xff08;或多对一&#xff09;。例如一个用户可以有多个订单&#xff0c;多个订单也可以归一个用户所有。用户和订单的关联关系如图。 一、<collection>元素 在MyB…

前端技术学习第九讲:VUE基础语法---VUE常用指令

VUE常用指令 在VUE学习中&#xff0c;通常使用相关指令使VUE对象中的内容与网页进行挂载绑定&#xff0c;是我们的数据与视图之间产生关联&#xff0c;完成渐进式动态效果。VUE指令都会以“v-”开头。 指令名描述v-text将文本内容挂载到页面元素中v-html将html代码展示到页面…

更开放、更高性能、更具规模,闪马智能布局AGI时代

7月6日&#xff0c;2023世界人工智能大会&#xff08;WAIC 2023&#xff09;在上海盛大开幕。本届大会以“智联世界 生成未来”为主题&#xff0c;聚焦通用人工智能发展&#xff0c;共话产业新未来。 8日上午&#xff0c;由上海闪马智能科技有限公司&#xff08;下称“闪马智能…

ZGC垃圾收集器(-XX:+UseZGC)

ZGC在jdk11只支持Linux版本&#xff0c;4TB的内存&#xff0c;STW时间控制在10ms内&#xff1b;jdk16已经支持16TB的内存&#xff0c;STW时间不超过1ms&#xff0c;下面主要针对jdk11版本的详解 一、堆内存结构 ZGC堆内存分为三种类型的页面即小页面&#xff08;空间大小2M&a…

CYCLO (L-ALA-L-ALA),5845-61-4,环(丙氨酰-丙氨酰),氨基酸中间体

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 【产品描述】 cyclo(Ala-Ala)氨基酸中间体&#xff0c;主要由丙氨酰组成 【中文名称】环(丙氨酰-丙氨酰) 【英文名称】 cyclo(Ala-Ala)&#xff0c;CYCLO (L-ALA-L-ALA) 【结 构 式】 【CAS】5845-61-4 【分子式】C6H10N2O…

C#制作打包安装程序,安装程序类使用

这里写目录标题 安装Microsoft Visual Studio Installer Projects创建安装项目设置安装程序文件设置程序桌面图标给程序设置安装程序名称安装程序类怎么使用Installer1.cs自定义安装步骤自定义设置安装程序路径&#xff0c;让用户安装时不能选择安装路径生成安装包 安装Microso…

实例011 在状态栏中显示检查框

实例说明 在设计程序界面时&#xff0c;为了规范界面&#xff0c;可以将一些控件放置在状态栏中&#xff0c;这样既能起到控制程序的作用&#xff0c;又能使界面和谐、美观。运行程序&#xff0c;在窗体的状态栏中加入了显示时间检查框。效果如图1.11所示。 技术要点 在状态…

对Linux系统对Spark开发环境配置

单机版本 上传对应文件&#xff0c;解压文件&#xff0c;并查看 unzip scala-2.12.12.zip tar -xzf spark-3.2.0-bin-hadoop2.7.tgz 移动scala及spark安装包到指定目录下 在opt目录下移动该文件到/usr目录下 mv scala-2.12.12 /usr/scala/ mv spark-3.2.0-bin-hadoop2.7 /…

Django_使用redis缓存数据

目录 一、配置redis 二、缓存Django的默认session 三、使用django的缓存机制缓存数据 四、自定义缓存数据 源码等资料获取方法 一、配置redis 在settings中添加配置参数 # Django的缓存配置 CACHES {"default": {"BACKEND": "django_redis.ca…

【企业微信多选的星期数据生成如“周一、周三至周六“】

目标效果如下图 实现这个过程首先是要找到逻辑&#xff0c;这个看似简单的操作却属实让我想了很久。 首先要了解需求 根据拿到的数据得到生成符合要求的字符串。中间有连续的星期大于三天的&#xff0c;开始和结束星期中间要有"至"。 分析逻辑 一、判断开始日期和…

RabbitMQ系列(19)--实现在RabbitMQ宕机的情况下对消息进行处理

前言&#xff1a;在生产环境中由于一些不明原因&#xff0c;导致RabbitMQ重启的情况下&#xff0c;在RabbitMQ重启期间生产者投递消息失败&#xff0c;生产者发送的消息会丢失&#xff0c;那这时候就需要去想在极端的情况下&#xff0c;RabbitMQ集群不可用的时候&#xff0c;如…

创造一款安卓自定义控件_裁剪原理介绍

1、新增功能&#xff0c;旋转&#xff1a; 效果如图&#xff0c;点击旋转&#xff0c;可以将控件画面本身进行90度倍数的旋转&#xff0c;并进行宽高比例适配&#xff0c;旋转之后裁剪依然正常。 功能实现原理&#xff1a; 1、通过调用view的setRotation功能进行以View为中心…

Stable Diffusion - 超分辨率插件 StableSR v2 (768x768) 配置与使用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131582734 论文&#xff1a;Exploiting Diffusion Prior for Real-World Image Super-Resolution StableSR 算法提出了一种新颖的方法&#xff0…

【JAVA】JAVA与C++的区别与联系

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言两方介绍CJAVA 不同|Java不支持指针、模板、指针重载、联合等||支持析构函数||条件编译和包含||螺纹支架||默认参数||转到语句||多重继承||异常处理||方法重载和操作符重载|…

对表中的数据操作

目录标题 创建一个工作者的表 &#xff0c;对表中数据进行相关操作worker表要求表中的数据内容 对数据的操作1.显示所有职工的基本信息2.查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号3.求出所有职工的人数4.列出最高工和最低工资5.列出职工的平均工资和总工资6…

卷积神经网络CNN进阶与搭建

目录 Pooling&#xff08;池化&#xff09;ReluResNetGradient VanishingFeature scalingImage NormalizationBatch Normalization Pooling&#xff08;池化&#xff09; 在降采样(Subsampling)中起作用&#xff0c;在不改变feature map的基础上&#xff0c;在卷积出来的基础上…

【LeetCode】217. 存在重复元素

217. 存在重复元素&#xff08;简单&#xff09; 方法一&#xff1a;哈希表长度比较 思路 针对重复元素&#xff0c;很容易就想到 set。我们可以先将 nums 中的所有元素存入set&#xff0c;然后比较两个数据结构的长度&#xff0c;如果相等则说明不存在重复元素&#xff0c;反…

Android View滑动处理大法

原文链接 Android View滑动处理大法 对于触控式操作来说&#xff0c;滑动是一个特别重要的手势操作&#xff0c;如何做到让应用程序的页面滑动起来如丝般顺滑&#xff0c;让用户感觉到手起刀落的流畅感&#xff0c;是开发人猿需要重点解决的问题&#xff0c;这对提升用户体验是…

Python:使用 np.lib.stride_tricks.sliding_window_view 将立方体切割成N个三维小块

函数说明&#xff1a;np.lib.stride_tricks.sliding_window_view(arr, window_shape) 参数说明&#xff1a; arr&#xff1a;要创建滑动窗口视图的数组。 window_shape&#xff1a;滑动窗口的形状&#xff0c;表示切割出的小块的大小。 作用&#xff1a;用于创建滑动窗口视图。…