System、Integer、Math类的总结

**

System类

即系统。故主要操作也与系统信息相关。System类内部包含in、out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。
该类位于java.lang包,因System类内部的构造函数时私有的,在外部不能访问,所以System不能被实例化。
它的主要功能
(1)系统信息的访问,如外部属性和环境变量等
(2)垃圾回收相关操作
(3)标准输入输出
(4)比较常用的其他操作,如数组拷贝
在这里插入图片描述
在这里插入图片描述
常见操作
1.拷贝数组arraycopy
在这里插入图片描述
2.获取系统时间
在这里插入图片描述
3.垃圾回收相关操作
System.gc
这句话表明运行了垃圾回收器。java虚拟机会回收一下系统垃圾,比如说没有使用的对象。
在这里插入图片描述
我们看一下运行结果再来分析
在这里插入图片描述
我们可以看到,在进行完垃圾回收之后,再输入User相关信息时由于找不到对象,因此报了空指针异常。
我们进入到System.gc内部看一下,看看内部执行什么操作
在这里插入图片描述
在这里我们可以看到其实是执行了Runtime的垃圾回收操作。我们在进入会发现其实垃圾回收就是Runtime做的。

功能演示
1、获取设置属性方法
也就是说我们的System如何获取系统的属性,或者说是调用哪个方法获取属性。
(1)contains(Object value)、containsKey(Object key):判断给定的参数或属性关键字在属性表中有定义,返回True或者False;
(2)getProperty(String key)、getProperty(String key, String default):根据参数获取属性
(3)list(PrintStream s)、list(PrintWriter w): 在输出流中输出属性表内容;
(4)size():返回当前属性表中定义的属性关键字个数。
我们当然可以设置属性:
(1)put(Object key, Object value) :向属性表中追加属性关键字和关键字的值;
(2)remove(Object key) :从属性表中删除关键字。
2、获取系统属性
上面我们可以直接使用System.contains等方法来调用,下面我们可以输入以下参数来获取系统信息。
在这里插入图片描述
初始化
首先映入眼帘的就是一个静态块:

/* register the natives via the static initializer.
 *
 * VM will invoke the initializeSystemClass method to complete
 * the initialization for this class separated from clinit.
 * Note that to use properties set by the VM, see the constraints
 * described in the initializeSystemClass method.
 */
private static native void registerNatives();
static {
    registerNatives();
}

native不用看了,本机方法。这是可以猜得到的,因为System类要使用输入和输出流可能会用到和操作系统相关的一些本机方法。那么在static块中调用了registerNatives()方法,这个方法是本地方法我们看不到具体实现。但是注释说了:“VM will invoke the initializeSystemClass method to complete the initialization for this class separated from clinit”。

那么JVM调用的initializeSystemClass方法是怎么实现的呢?

private static void initializeSystemClass() {

    props = new Properties();
    initProperties(props); 

    sun.misc.VM.saveAndRemoveProperties(props);

    lineSeparator = props.getProperty("line.separator");
    sun.misc.Version.init();

    FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
    FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
    FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
    setIn0(new BufferedInputStream(fdIn));
    setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
    setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding")));

    loadLibrary("zip");

    Terminator.setup();

    sun.misc.VM.initializeOSEnvironment();

    Thread current = Thread.currentThread();
    current.getThreadGroup().add(current);

    setJavaLangAccess();
    sun.misc.VM.booted();
}

这个方法就在System类中,但是刚才没有介绍,因为是private的方法,只是用来自己做注册使用。这个方法的大概意思是说:1.初始化Properties 2.初始化输入、输出、错误流 3.进行一大堆配置。

Integer类

Integer类是基本数据类型int的包装器类,是抽象类Number的子类,位于java.lang包中。
Integer类在对象中包装了一个基本类型int的值,也就是每个Integer对象包含一个int类型的字段。在Integer源码中如下定义:private final int value;
字段:
[static int] MAX_VALUE:值为 231-1 的常量,它表示 int 类型能够表示的最大值。
[static int] MIN_VALUE:值为 -231 的常量,它表示 int 类型能够表示的最小值。
[static int] SIZE: 用来以二进制补码形式表示 int 值的比特位数。
[static Class] TYPE:表示基本类型 int 的 Class 实例。
[static int] BYTES:返回int值所占的字节数。
构造方法:

Integer类提供了两种构造方法:它们都会返回一个Integer对象
(1)Integer(int value);
(2)Integer(String s); //要注意的是字符串不能包含非数字字符,否则会抛出NumberFormatException
(3)除此之外,还可以给Integer对象直接赋值,如:Integer a = 10;
在这里插入图片描述
特别注意:

(1)“”和equals()方法:在Integer类中,“”用来比较对象地址是否相同,并且Integer类重写了equals(Object obj)方法,在equals(Object obj)方法中,会先判断参数中的对象obj是否是Integer类型的对象,如果是则判断值是否相同,值相同则返回true,值不同则返回false,如果obj不是Integer类的对象,则返回false。需要注意的是:当参数是基本类型int时,编译器会给int自动装箱成Integer类,然后再进行比较。
在这里插入图片描述
(2)Integer直接赋值和valueOf()方法,下面来看下面两段代码的不同:
在这里插入图片描述
我们可以看到上面两段代码只是赋给对象的值不同,但是在判断”i02 == i03“时得到的结果却不同,这是为何:当使用直接赋值如”Integer i01 = 59“的时候,会调用Integer的valueOf()方法,这个方法就是返回一个Integer对象,但是在返回前,作了一个判断,判断要赋给对象的值i是否在[-128,127]区间中,且IntegerCache(是Integer类的内部类,里面有一个Integer对象数组,用于存放已经存在的且范围在[-128,127]中的对象)中是否存在此对象,如果存在,则直接返回引用,否则,创建一个新对象返回。那么我们就可以知道,200这个数字不在[-128,127]中,所以会直接创建一个新对象返回,i02和i03就是两个不同的对象。而59属于[-128,127]中,当创建i03时,会直接返回引用,此时i02和i03都指向同一个地址。
以第一段代码为例:”Integer i02 = 59":因为程序初次运行,没有59,所以直接创建一个对象返回;“Integer i03 = Integer.valueOf(59)”:因为IntegerCache中已经存在59,所以直接返回引用;“Integer i04 = new Integer(59)”:直接创建一个新对象。
JVM中一个字节一下的整型数据(即[128,127])会在JVM启动时加载进内存,除非用new Integer()显示的创建对象,否则都是同一对象。
在这里插入图片描述

Math类

Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数。
与StrictMath类的一些数字方法不同,Math类的StrictMath所有Math都没有定义为返回比特位相同的结果。 这种放松允许在不需要严格再现性的情况下执行更好的实现。

默认情况下,许多Math方法只需调用中的对应方法是StrictMath组织落实。 鼓励代码生成器使用平台特定的本机库或微处理器指令(如果可用),以提供Math方法的Math实现。 这种更高性能的实现仍然必须符合Math的Math 。

实施规范的质量有两个属性,返回结果的准确性和方法的单调性。 的浮点精度Math方法在ULPS,单位在最后的地方来衡量。 对于给定的浮点格式, ulp特定实数值的是两个浮点值包围该数值之间的距离。 当讨论整个方法的准确性而不是一个具体的参数时,引用的ulps的数量是任何参数的最坏情况错误。 如果方法总是出现小于0.5 ulps的错误,则该方法总是返回最接近精确结果的浮点数; 这种方法是正确的四舍五入 。 一个正确舍入的方法通常是一个最好的浮点近似可以; 然而,对于许多浮点方法来说,这是不切实际的。 相反,对于Math类,某些方法允许更大的1或2 Math的误差范围。 非正式地,使用1 ul的错误限制,当确切的结果是可表示的数字时,应该将精确的结果作为计算结果返回; 否则,可以返回包含确切结果的两个浮点值之一。 对于大量的精确结果,支架的端点之一可能是无限大的。 除了个人论证的准确性之外,维持不同论点的方法之间的适当关系也很重要。 因此,绝大多数0.5 ulp误差的方法都是半单调的 :每当数学函数不减小时,数学函数也是不减少的,同样地,当数学函数不增加时,浮点数近似也是如此点近似。 并非所有具有1 ulp精度的近似值将自动满足单调性要求。
基本运算的方法
(1)public static double abs(double a) :返回 double 值的绝对值。

double d1 = Math.abs(‐5); //d1的值为5
double d2 = Math.abs(5); //d2的值为5

(2)public static double ceil(double a) :返回大于等于参数的最小的整数。

double d1 = Math.ceil(3.3); //d1的值为 4.0
double d2 = Math.ceil(‐3.3); //d2的值为 ‐3.0
double d3 = Math.ceil(5.1); //d3的值为 6.0

(3)public static double floor(double a) :返回小于等于参数最大的整数。

double d1 = Math.floor(3.3); //d1的值为3.0
double d2 = Math.floor(‐3.3); //d2的值为‐4.0
double d3 = Math.floor(5.1); //d3的值为 5.0

(4)public static long round(double a) :返回最接近参数的 long。(相当于四舍五入方法)

long d1 = Math.round(5.5); //d1的值为6.0
long d2 = Math.round(5.4); //d2的值为5.0

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值