Java026——System 类和Scanner 类

一、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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的扫雷小游戏的 JAVA 代码,实现了基本的游戏功能: ``` import java.util.Random; import java.util.Scanner; public class Minesweeper { private static final int ROWS = 10; private static final int COLS = 10; private static final int BOMBS = 10; private static final char COVERED = '-'; private static final char UNCOVERED = ' '; private static final char BOMB = '*'; private char[][] board; private boolean[][] bombPositions; public Minesweeper() { board = new char[ROWS][COLS]; bombPositions = new boolean[ROWS][COLS]; initBoard(); initBombs(); } private void initBoard() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { board[i][j] = COVERED; } } } private void initBombs() { Random random = new Random(); int count = 0; while (count < BOMBS) { int row = random.nextInt(ROWS); int col = random.nextInt(COLS); if (!bombPositions[row][col]) { bombPositions[row][col] = true; count++; } } } private int countAdjacentBombs(int row, int col) { int count = 0; for (int i = row - 1; i <= row + 1; i++) { for (int j = col - 1; j <= col + 1; j++) { if (i >= 0 && i < ROWS && j >= 0 && j < COLS && bombPositions[i][j]) { count++; } } } return count; } public boolean playMove(int row, int col) { if (bombPositions[row][col]) { board[row][col] = BOMB; return false; } int adjacentBombs = countAdjacentBombs(row, col); board[row][col] = (char) ('0' + adjacentBombs); if (adjacentBombs == 0) { for (int i = row - 1; i <= row + 1; i++) { for (int j = col - 1; j <= col + 1; j++) { if (i >= 0 && i < ROWS && j >= 0 && j < COLS && board[i][j] == COVERED) { playMove(i, j); } } } } return true; } public void playGame() { Scanner scanner = new Scanner(System.in); boolean gameOver = false; while (!gameOver) { printBoard(); System.out.print("Enter row and column (e.g. 1 2): "); int row = scanner.nextInt() - 1; int col = scanner.nextInt() - 1; if (row < 0 || row >= ROWS || col < 0 || col >= COLS) { System.out.println("Invalid row or column!"); continue; } gameOver = !playMove(row, col); if (checkWin()) { System.out.println("You win!"); gameOver = true; } } printBoard(); } private boolean checkWin() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (board[i][j] == COVERED && !bombPositions[i][j]) { return false; } } } return true; } private void printBoard() { System.out.print(" "); for (int j = 0; j < COLS; j++) { System.out.print((j + 1) + " "); } System.out.println(); for (int i = 0; i < ROWS; i++) { System.out.print((i + 1) + " "); for (int j = 0; j < COLS; j++) { System.out.print(board[i][j] == UNCOVERED && bombPositions[i][j] ? BOMB : board[i][j]); System.out.print(" "); } System.out.println(); } } public static void main(String[] args) { Minesweeper minesweeper = new Minesweeper(); minesweeper.playGame(); } } ``` 代码中定义了游戏的行数,列数和雷数,以及用来表示板块状态的字符常量。在 `Minesweeper` 类中,通过二维数组 `board` 和 `bombPositions` 来表示游戏面板和雷的位置。通过 `initBoard` 和 `initBombs` 方法初始化游戏面板和雷的位置。 在 `countAdjacentBombs` 方法中,根据当前位置的周围八个位置计算雷的个数。 在 `playMove` 方法中,根据当前位置是否有雷计算该位置的状态,并根据周围是否有雷递归更新周围的位置状态。 在 `playGame` 方法中,通过 `Scanner` 类读取玩家的输入,并根据输入更新游戏状态,直到游戏结束。 在 `checkWin` 方法中,检查游戏是否胜利。 在 `printBoard` 方法中,输出游戏面板。 在 `main` 方法中,创建 `Minesweeper` 对象并调用 `playGame` 方法开始游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值