一、System 类
1.1、System 类提供的常用方法
=======================================================================================================================
方法 功能描述
-----------------------------------------------------------------------------------------------------------------------
currentTimeMillis() 返回当前计算机时间 和 格林威治时间(GMT)1970年1月1号0时0分0秒所差的毫秒数
-----------------------------------------------------------------------------------------------------------------------
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)是一种自动内存管理机制。它负责在程序运行过程中,自动回收不再使用的对象所占用的内存空间,以避免内存泄漏和内存溢出的问题。
垃圾回收工作的原理如下:
-
标记-清除(Mark and Sweep)算法:该算法是垃圾回收的基本算法。它通过标记所有活动对象(即仍然被引用的对象),然后清除未被标记的对象,并回收它们占用的内存空间。
-
引用计数(Reference Counting)算法:该算法会为每个对象维护一个引用计数器,记录对象被引用的次数。当引用计数为0时,表示该对象不再被引用,即为垃圾对象,可以被回收。
Java中的垃圾回收由Java虚拟机(JVM)负责管理。JVM会周期性地执行垃圾回收操作,具体的触发时机和算法取决于具体的JVM实现。
以下是一些常用的垃圾回收算法和相关概念:
-
标记-清除(Mark and Sweep)算法:在垃圾回收过程中,首先通过根对象进行标记,然后遍历整个对象图,标记所有可达的对象,最后清除未被标记的对象。
-
复制(Copying)算法:将内存分为两个区域,一个是当前使用的区域,另一个是空闲的区域。当当前区域使用完时,将存活的对象复制到空闲区域,并清除当前区域中的所有对象。
-
标记-整理(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
类的常用用法:
-
导入
java.util.Scanner
类:
在使用Scanner
类之前,需要在代码中导入java.util.Scanner
包。 -
创建
Scanner
对象:
使用new
关键字创建一个Scanner
对象,并通过构造函数传入输入流(通常是System.in
,表示从标准输入读取数据)。Scanner scanner = new Scanner(System.in);
-
读取基本数据类型:
Scanner
类提供了多个nextXxx()
方法,可以读取不同类型的基本数据。例如:// 读取整数 int num = scanner.nextInt(); // 读取浮点数 double value = scanner.nextDouble(); // 读取布尔值 boolean flag = scanner.nextBoolean();
-
读取字符串:
Scanner
类的next()
方法用于读取下一个以空格分隔的字符串,nextLine()
方法用于读取整行字符串。例如:// 读取单词 String word = scanner.next(); // 读取整行文本 String line = scanner.nextLine();
注意:使用
nextLine()
方法读取整行字符串时,Scanner
会读取上一次调用nextXxx()
方法时遗留的换行符。可以在读取整行字符串之前使用nextLine()
方法清空换行符。 -
关闭
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();
}
}