65从零开始学Java之初学者必会的几个常用Java类

news2024/11/27 16:44:56

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦

千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者

前言

我们在解决实际问题时,除了经常需要对数字、日期、时间进行操作之外,有时候还需要对系统进行设置,另外还需要生成一些随机数字。那么我们又该如何实现这些需求呢?接下来壹哥会带着大家来学习一下Java中的另几个常用类,包括System、Random、SecureRandom等。

-----------------------------------------------前戏已做完,精彩即开始---------------------------------------------

全文大约【4000】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

配套开源项目资料

Github:

GitHub - SunLtd/LearnJava

Gitee:

一一哥/从零开始学Java

一. System类

1. 简介

System类位于java.lang包中,代表着当前Java程序的运行平台,系统级的很多属性和控制方法都放在该类中。由于该类的构造方法是private的,所以我们无法直接通过new的方式来创建该类的对象。System类提供了一些静态变量和静态方法,允许我们直接通过System类来调用这些类变量和类方法。在System类中,虽然有挺多的静态变量和方法,但对我们来说,只需记住一些常用的即可。

1.1 常用静态变量

System类中常用的静态变量有如下几个:

  • PrintStream out:标准输出流;
  • InputStream in:标准输入流;
  • PrintStream err:标准错误输出流;

1.2 常用静态方法

System类中常用的静态方法有如下几个:

  • currentTimeMillis():返回当前的计算机时间;
  • exit():终止当前正在运行的 Java 虚拟机;
  • gc():请求系统进行垃圾回收,完成内存中的垃圾清除;
  • getProperty():获得系统中属性名为 key 的属性对应的值;
  • arraycopy():进行数组复制,即从指定源数组中复制一个数组。

接下来壹哥就把以上这些静态变量和静态方法的基本使用,给大家简要介绍一下。

2. 静态变量的使用

首先我们来看看System类中几个常用静态变量该如何使用。

2.1 out

out静态变量属于PrintStream类型,是System类中的标准输出流,用于接收要输出的数据。out中的数据内容通常会输出到显示器,或用户指定的某个输出目标。其实对我们来说,out并不陌生,可以说在我们之前的案例中经常使用,尤其是out中的print方法,最近我们一直在使用。但我们要搞清楚,print属于PrintStream流的方法,并不是 System类的方法。

//输出字符串不换行
System.out.print("Hello World");

//输出字符串并换行
System.out.println("Hello World");

2.2 in

in静态变量属于InputStream类型,是System类中的标准输入流,用于接收输入的数据。in通常是对应着键盘的输入,或是用户指定的另一个输入源。我们在之前的案例中,也简单使用过in常量,但它没有out用的那么频繁。

import java.io.IOException;
import java.util.Scanner;

public class Demo01 {

	public static void main(String[] args) {
		//in的用法
		//用法1:配合Scanner,作为它的参数
		System.out.println("请输入内容:");
		Scanner scanner=new Scanner(System.in);
		String content = scanner.next();
		System.out.println("content="+content);

		//用法2:挨个读取输入的每个字符
		System.out.println("请输入内容,按回车键结束输入:");
        int c;
        try {
        	//读取输入的每个字符
            c = System.in.read();    
            // 判断输入的字符是不是回车键
            while(c != '\r') {   
            	//输出字符
                System.out.print((char) c);   
                c = System.in.read();
            }
        } catch(IOException e) {
        	//捕获异常,壹哥以后会给大家专门讲解异常类
            System.out.println(e.toString());
        } 
	}

}

上面的这个案例,System.in.read()语句可以读入一个字符,read()方法是InputStream类拥有的方法。变量c必须用 int 类型,而不能用char类型,否则可能会丢失精度而导致编译失败。另外上面的程序,如果输入的是汉字将不能正常输出。如果我们想正常输出汉字,需要把 System.in声明为 InputStreamReader类型的实例。比如InputStreamReader in=new InputStreamReader(System.in,"GB2312"),此时就可以读入完整的Unicode码,才能显示正常的汉字。

2.3 err

err静态变量属于PrintStream类型,是System类中的标准错误输出流,用于接收要输出的数据。err中的数据内容通常会输出到显示器,或用户指定的某个输出目标。其用法与System.out一样,只是不需要我们提供参数就可以输出错误信息,也可以用来输出用户指定的其他信息,包括一些变量的值。

//err的用法
System.err.println();

//输出指定的内容
System.err.println("错误信息");

以上这几个静态变量都很简单,大家记住其用法即可。

3. 静态方法的使用

接下来壹哥再跟大家说说System类中的几个常用静态方法的用法。

3.1 currentTimeMillis()方法

currentTimeMillis()方法用于返回当前计算机的时间戳,时间格式是当前计算机的时间与GMT时间(格林尼治时间),自1970年 1月 1日 0时 0分 0秒以来所经历的毫秒数,我们一般用它来测试程序的执行时间。通过调用currentTimeMillis()方法,我们可以获得一个长整型的数字,该数字是以差值表达的当前时间。其实currentTimeMillis()方法我们在之前的文章中已经详细讲解过,这里壹哥就不再细说了。

long time = System.currentTimeMillis();

3.2 exit()方法

exit()方法用于终止当前正在运行的Java虚拟机,也就是可以用于退出程序。该方法需要一个整型的status参数,0表示正常退出,非零表示异常退出。我们使用该方法,可以在图形界面编程中实现程序的退出功能。该方法的用法如下:

public class Demo01 {
	public static void main(String[] args) {
		//exit的用法
		try {
            //睡眠5秒
			Thread.sleep(5000);
			//5秒后正常退出程序
			System.exit(0);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

3.3 gc()方法

gc()方法用于请求对系统主动进行垃圾回收,完成内存中的垃圾清除。但系统是否会立刻回收这些垃圾,却取决于系统中垃圾回收算法的具体实现,以及系统执行时的具体情况。一般我们在开发时不会主动调用该方法,有时候调用了也未必有效果。

//主动进行垃圾回收
System.gc();

3.4 getProperty()方法

getProperty()方法可以根据指定的key,获得系统中对应的某些属性值,系统中常见的属性名及其属性如下表所示:

属性名

属性说明

java.version

Java 运行时环境版本

java.home

Java 安装目录

os.name

操作系统的名称

os.version

操作系统的版本

user.name

用户的账户名称

user.home

用户的主目录

user.dir

用户的当前工作目录

public class Demo03 {

	public static void main(String[] args) {
		//getProperty的用法
		
		//获取java版本
		String version = System.getProperty("java.version");
		System.out.println("Java版本:"+version);
		
		//获取java安装目录
		String home = System.getProperty("java.home");
		System.out.println("Java目录:"+home);
		
		//系统名称
        String name = System.getProperty("os.name");
        System.out.println("操作系统名称:"+name);
        
        //用户名称
        String user = System.getProperty("user.name");
        System.out.println("当前用户名称:"+user);
	}

}

3.5 arraycopy()

arraycopy()方法用于数组复制,可以从指定的源数组中复制出一个数组,复制会从指定的位置开始,到目标数组的指定位置结束。arraycopy()方法一般有5个参数,其中,src表示源数组,srcPos表示从源数组中复制的起始位置,dest表示目标数组,destPos表示要复制到的目标数组的起始位置,length表示复制的个数。

public class Demo04 {

	public static void main(String[] args) {
		//arraycopy的用法
		
		//源数组
		char[] srcArray = {'A','B','C','D'};
		//目标数组
        char[] destArray = {'1','2','3','4','5'};
        
        //进行数组复制
        System.arraycopy(srcArray,1,destArray,1,2);
        
        System.out.println("遍历源数组:");
        for(int i = 0;i < srcArray.length;i++) {
            System.out.println("源数组中的每个元素:"+srcArray[i]);
        }
        
        System.out.println("遍历目标数组:");
        for(int j = 0;j < destArray.length;j++) {
            System.out.println("新数组中的每个元素:"+destArray[j]);
        }
	}

}

二. Random随机类

1. 简介

我们在开发时,除了操作一些固定的数字之外,有时候还要操作一些不确定的随机数。Java中给我们提供了两种生成指定范围内随机数的方法:

  • 使用Random类:伪随机数类,用来创建伪随机数。所谓伪随机数,就是指我们只要给定一个初始的种子,产生的随机数序列是完全一样的;
  • 调用Math类的random()方法:Math.random()内部其实是在调用Random类,它也是伪随机数,但我们无法指定种子。

Random类为我们提供了比较丰富的随机数生成方法,比如nextInt()、nextLong()、nextFloat()、nextDouble()等方法。这些方法可以产生boolean、int、long、float、byte数组以及double类型的随机数,这是它比random()方法更好的地方,random()方法只能产生0~1之间的double类型随机数。

而且Random类提供的所有方法,生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的概率是均等的。Random类位于java.util包中,该类有如下两个常用的构造方法:

  • Random():默认利用当前系统的时间戳作为种子数,使用该种子数构造出Random对象。
  • Random(long seed):使用单个的long类型参数,创建一个新的随机数生成器。

2. 常用API方法

在Random类中,有如下一些常用的API方法供我们操作随机数:

方法

说明

boolean nextBoolean()

生成一个随机的 boolean 值,生成 true 和 false 的值概率相等

double nextDouble()

生成一个随机的 double 值,数值介于 [0,1.0),含 0 而不包含 1.0

int nextlnt()

生成一个随机的 int 值,该值介于 int 的区间,也就是 -231~231-1。如果
需要生成指定区间的 int 值,则需要进行一定的数学变换

int nextlnt(int n)

生成一个随机的 int 值,该值介于 [0,n),包含 0 而不包含 n。如果想生成
指定区间的 int 值,也需要进行一定的数学变换

void setSeed(long seed)

重新设置 Random 对象中的种子数。设置完种子数以后的 Random 对象
和相同种子数使用 new 关键字创建出的 Random 对象相同

long nextLong()

返回一个随机长整型数字

boolean nextBoolean()

返回一个随机布尔型值

float nextFloat()

返回一个随机浮点型数字

double nextDouble()

返回一个随机双精度值

3. 基本用法

接下来壹哥通过一个案例,来给大家讲解一下上述方法该如何使用。

import java.util.Random;

/**
 * @author 一一哥Sun 
 */
public class Demo07 {

	public static void main(String[] args) {
		// 随机类生成随机数
		Random r = new Random();
		
		// 生成[0,1.0]区间的小数
		double d1 = r.nextDouble();
		System.out.println("d1="+d1);
		
		// 生成[0,10.0]区间的小数
		double d2 = r.nextDouble() * 10;
		System.out.println("d2="+d2);
		
		// 生成[0,10]区间的整数
		int i1 = r.nextInt(10);
		System.out.println("i1="+i1);
		
		// 生成[0,25)区间的整数
		int i2 = r.nextInt(30) - 5;
		System.out.println("i2="+i2);
		
		// 生成一个随机长整型值
		long l1 = r.nextLong();
		System.out.println("l1="+l1);
		
		// 生成一个随机布尔型值
		boolean b1 = r.nextBoolean();
		System.out.println("b1="+b1);
		
		// 生成一个随机浮点型值
		float f1 = r.nextFloat();
		System.out.println("f1="+f1);
	}

}

但是我们从上面的案例中,会发现每次生成的随机数可能都是不同的,并没有体现出伪随机数的特性,这是为什么呢?其实这是因为我们创建Random实例时,如果没有给定种子,默认是使用系统的当前时间戳作为种子。因此每次运行时,种子都不同,所以得到的伪随机数序列就不同。如果我们在创建Random实例时指定一个固定的种子,就会得到完全确定的随机数序列。

4. 配套视频

与本节内容配套的视频链接如下:

External Player - 哔哩哔哩嵌入式外链播放器

三. SecureRandom类

1. 简介

壹哥在前面给大家说过,Random是一种伪随机数类。这时候就有小伙伴问了,那有没有真随机数类呢?当然是有的!

SecureRandom就是一种真随机数!从原理来看,SecureRandom内部使用了RNG(Random Number Generator,随机数生成)算法,来生成一个不可预测的安全随机数。但在JDK的底层,实际上SecureRandom也有多种不同的具体实现。有的是使用安全随机种子加上伪随机数算法来生成安全的随机数,有的是使用真正的随机数生成器来生成随机数。实际使用时,我们可以优先获取高强度的安全随机数生成器;如果没有提供,再使用普通等级的安全随机数生成器。但不管哪种情况,我们都无法指定种子。

因为这个种子是通过CPU的热噪声、读写磁盘的字节、网络流量等各种随机事件产生的“熵”,所以这个种子理论上是不可能会重复的。这也就保证了SecureRandom的安全性,所以最终生成的随机数就是安全的真随机数。

尤其是在密码学中,安全的随机数非常重要。如果我们使用不安全的伪随机数,所有加密体系都将被攻破。因此,为了保证系统的安全,我们尽量使用SecureRandom来产生安全的随机数。

2. 基本使用

SecureRandom给我们提供了nextBoolean()、nextBytes()、nextDouble()、nextFloat()、nextInt()等随机数生成方法,如下图所示:

接下来我们就通过一个案例,来看看到底该如何生成一个安全的随机数。

import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;

public class Demo05 {

	public static void main(String[] args) {
		//SecureRandom真随机数的用法
		
		SecureRandom sr = null;
        try {
        	//获取高强度安全随机数生成器实例对象
            sr = SecureRandom.getInstanceStrong(); 
        } catch (NoSuchAlgorithmException e) {
        	//处理异常,获取普通的安全随机数生成器
            sr = new SecureRandom(); 
        }
        
        //生成16个随机数
        byte[] buffer = new byte[16];
        //用安全随机数填充buffer
        sr.nextBytes(buffer); 
        System.out.println("随机数="+Arrays.toString(buffer));
        
        //生成100以内的随机整数
        int nextInt = sr.nextInt(100);
        System.out.println("随机数="+nextInt);
	}

}

-----------------------------------------------正片已结束,来根事后烟---------------------------------------------

四. 结语

至此,壹哥就把与系统类、伪随机数、真随机数等相关的类给大家介绍完了,这样我们就把开发时的一些常见类介绍完毕了。今天的重点内容是:

  • System:代表着当前Java程序的运行平台,系统级的很多属性和控制方法都放在该类中;
  • Random:生成伪随机数;
  • SecureRandom:生成安全的真随机数。

如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。

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

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

相关文章

js原型链

什么叫原型链 原型链是js中的核心&#xff0c;原型链将各个属性链接起来&#xff0c;在原型链上面定义&#xff0c;原型链上的其他属性能够使用&#xff0c;原型链就是保证继承 原型链区分 原型链分为显式原型和隐式原型 显式原型&#xff1a;只有函数和构建函数才有显式原型…

【ARM AMBA AXI 入门 12 -- AXI协议中的 WLAST 与 RLAST】

文章目录 AXI协议中的 WLAST 与 RLAST AXI协议中的 WLAST 与 RLAST AMBA AXI协议是由ARM公司定义的一种高性能&#xff0c;高频率的总线协议。总线协议中的 WLAST 信号是一个重要的信号&#xff0c;它在 AXI 协议中用来标识一个突发&#xff08;Burst&#xff09;传输的最后一…

requests库编写的爬虫程序没有那么难!

下文是用requests库编写的爬虫程序&#xff0c;用于爬取toutiao上的图片。程序使用了代理服务器&#xff0c;代理服务器的地址为duoip&#xff0c;端口号为8000。 import requests from bs4 import BeautifulSoup# 设置代理服务器 proxy_host duoip proxy_port 8000 proxy {…

STM32创建工程步骤

以创建led工程为例&#xff1a; 新建一个led文件夹 新建一个以led命名的工程&#xff08;用keil_uVision5&#xff09;并添加三个组。 Library文件夹里放置库函数文件。 User&#xff1a; 点亮led灯的程序&#xff1b; 直接给寄存器赋值 调用库函数。 #include "stm…

网络运维Day05

文章目录 实验环境用户与组概述用户账号创建查看用户-查创建用户-增修改用户属性-改删除用户-删 用户密码管理交互式修改密码非交互式修改密码 用户初始配置文件基本权限和归属基本权限的类别权限适用对象(归属)查看权限 修改权限设置基本权限如何判断用户对某目录所具备怎样的…

〔002〕虚幻 UE5 发送 get、post 请求、读取 json 文件

✨ 目录 🎈 安装 varest 扩展🎈 开启 varest 扩展🎈 发送 get 请求🎈 发送 post 请求🎈 读取 json 文件🎈 安装 varest 扩展 打开 虚幻商城,搜索 varest 关键字进行检索, varest 是一个 api 调用插件,支持 http/https 请求,也支持 json 文件的读取,最关键是该…

基于SSM的新闻类网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

特征融合(三):MLFPN-M2det多级特征金字塔网络

图像处理中&#xff0c;融合不同尺度的特征是提高图像效果的重要手段&#xff0c;在卷积中&#xff1a; ✅浅层特征&#xff1a;浅层特征分辨率更高&#xff0c;包含更多位置、细节信息&#xff0c;但是由于经过的卷积更少&#xff0c;其语义性更低&#xff0c;噪声更多。 ✅高…

求职者如何提高网申测评通过率?

如果是测评专业知识&#xff0c;这个帮不忙&#xff0c;靠自己了&#xff0c;这说的是素质测评&#xff0c;包括&#xff1a;心理&#xff0c;性格等方面的.....建议多刷刷这方面的题&#xff0c;也花不了多少时间&#xff0c;哪些常用的测评量表&#xff0c;可以多刷几遍。 本…

【年底不想背锅!网络工程师必收藏的排障命令大全】

网络故障排除工具是每个网络工程师的必需品。 为了提升我们的工作效率&#xff0c; 不浪费时间&#xff0c;工具的重要性显而易见 特别是每当添加新的设备或网络发生变更时&#xff0c;新的问题就会出现&#xff0c;而且很难快速确定问题出在哪里。每一位网络工程师或从事网…

Direct3D地形绘制基础

高度图 用高度图来描述地形中的丘陵和山谷,高度图其实就是一个数组,该数组每个元素都指定了地形方格中某一个特定顶点的高度值。通常将高度图视为一个矩阵,这样高度图中的元素就与地形栅格中的顶点一一对应。 高度图被保存在磁盘中,通常为其每个元素元素只分配一个字节存…

爬虫试用 | 京东商品详情搜索采集助手 – 一键批量采集下载商品详情

商品详情页&#xff08;链接中可获取商品ID&#xff09; API接口调用代码 Request address: https://api-服务器.cn/jd/item_get/?key【你的key】& &num_iid10335871600&cacheno&&langzh-CN&secret【你的密钥】 点此获取APIkey和secret 响应示例…

【微观经济学】Consumer Theory

1.Preference 1) Preferences assumption a. completeness&#xff1a;对每一个东西都有一个确定的偏好&#xff0c;不能说不确定 b. transitivity c. nonsatiation&#xff1a;more is better 2) Utility function 使用效用函数来刻画消费者的偏好 例如 拿这个效用函数…

web —— html

Web —— css基础 1. HTML2. 基本HTML结构3. HTML常用标签3.1 文本相关标签3.2 HTML图像标签3.3 HTML超链接标签3.4 HTML表&#xff0c;单3.4.1 HTML表格3.4.2 HTML表单&#xff0c;输入框&#xff08;多选框&#xff0c;单选框&#xff09;下拉框 3.5 HTML分区标签3.5.1 div标…

音频文件元数据修改:批量操作的技巧和方法

在音乐产业不断发展和数字技术日益成熟的今天&#xff0c;音频文件已经成为我们日常生活中的重要组成部分。在这些文件中&#xff0c;元数据起着至关重要的作用&#xff0c;它不仅提供了关于音频文件的基本信息&#xff0c;如艺术家、歌曲名称、专辑名称等&#xff0c;还为我们…

速学数据结构 | 我不允许还有人不会用栈实现队列!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525;个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 &#x1f308;hello&#xff01; 各位铁铁们大家好啊&#xff0c;不知道大家对栈和队列的学习都学过了吧…

LLM之幻觉(一):大语言模型幻觉解决方案综述

论文题目&#xff1a;《Cognitive Mirage: A Review of Hallucinations in Large Language Models》 ​论文链接&#xff1a;https://arxiv.org/abs/2309.06794v1 论文代码&#xff1a;https://github.com/hongbinye/cognitive-mirage-hallucinations-in-llms 一、幻觉介绍 …

【Python报错合集】Python元组tuple、张量tensor(IndexError、TypeError、RuntimeError……)~持续更新

文章目录 IndexError1. tuple index out of rangea. 示例代码b.报错原因c.解决方案 TypeError1. len() of a 0-d tensora. 示例代码b.报错原因c.解决方案 RuntimeError1. output with shape … doesnt match the broadcast shape …a. 示例代码b.报错原因c.解决方案 2. Cant ca…

【C++干货铺】内存管理new和delete

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 C语言中动态内存管理方式 malloc/calloc/realloc的区别&#xff1f; C内存管理的方式 内置类型 自定义类型 operator new 和 operator delete 函数 operato…

Premiere Pro 2024 v24.0

adobe Premiere Pro 2024 Mac版发布了吗&#xff1f;无论您是编辑社交媒体视频还是大电影&#xff0c;Premiere Pro 都可以帮助您借助工具精心创作有意义的故事。导入和编辑&#xff0c;添加效果&#xff0c;然后将素材导出到任何目标。无论您要创作什么内容&#xff0c;它都可…