Java中常用类的方法

简介: Java中常用类的方法

一.System

1.概念

  在API中system类介绍的比较简单,我们给出定义,system中代表程序所在系统,提供了对应的一些系统属性信息和系统操作。

  注意,system类不能手动创建对象,因为构造方法被私有化(即被private关键字修饰),组织外界创建对象(即不能用new关键字生成一个对象)。System类中的都是静态方法(static关键字修饰),类名访问即可。在JDK中,有许多这样的类。在 System 类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。

2.常用方法

  • 获取系统当前毫秒值(public static long currentTimeMillis())

  获取当前系统时间与1970年01月01日00:00点之前的毫秒差值,我们可以用它来测试程序的执行时间。代码如下:

package cn.org.yinzhengjie.demo;
 public class SystemDemo {
     public static void main(String[] args) {
         long start = System.currentTimeMillis();
         for(int i=1;i<=9;i++) {
             for(int j=1;j<=i;j++) {
                 System.out.printf("%d x %d = %d \t",j,i,(j*i));
             }
             System.out.println();
         }
         long end = System.currentTimeMillis();
         System.out.printf("程序运行时间为[%d]毫秒!",(end-start));
     }
}
 /*
 以上代码执行结果如下:
 1 x 1 = 1     
 1 x 2 = 2     2 x 2 = 4     
 1 x 3 = 3     2 x 3 = 6     3 x 3 = 9     
 1 x 4 = 4     2 x 4 = 8     3 x 4 = 12     4 x 4 = 16     
 1 x 5 = 5     2 x 5 = 10     3 x 5 = 15     4 x 5 = 20     5 x 5 = 25     
 1 x 6 = 6     2 x 6 = 12     3 x 6 = 18     4 x 6 = 24     5 x 6 = 30     6 x 6 = 36     
 1 x 7 = 7     2 x 7 = 14     3 x 7 = 21     4 x 7 = 28     5 x 7 = 35     6 x 7 = 42     7 x 7 = 49     
 1 x 8 = 8     2 x 8 = 16     3 x 8 = 24     4 x 8 = 32     5 x 8 = 40     6 x 8 = 48     7 x 8 = 56     8 x 8 = 64     
 1 x 9 = 9     2 x 9 = 18     3 x 9 = 27     4 x 9 = 36     5 x 9 = 45     6 x 9 = 54     7 x 9 = 63     8 x 9 = 72     9 x 9 = 81     
 程序运行时间为[42]毫秒!
 */
复制代码
  • 结束正在运行的Java程序(public staitc void exit(int status))

 参数传入一个数字即可。通常传入0记为正常状态,其它为异常状态。

public class SystemDemo {
     public static void main(String[] args) {
         int counts = 0;
         while(true) {
             System.out.println("yinzhengjie");
             if(counts==5) {
                 System.exit(0);
             }
             counts++;
         }
     }
 }
 /*
 以上代码执行结果如下:
 yinzhengjie
 yinzhengjie
 yinzhengjie
 yinzhengjie
 yinzhengjie
 yinzhengjie
 */
复制代码
  • 垃圾回收器(public static void gc())

  用来运行JVM中的垃圾回收器,完成内存中垃圾的清除。

class Student{
     //清除垃圾时,会默认调用被清空对象的finalize方法。
     public void finalize() {    
         System.out.println("垃圾已经被收取啦!");
     }
 }
 public class SystemDemo {
     public static void main(String[] args) {
         new Student();
         new Student();
         new Student();
         new Student();
         new Student();
         System.gc();    
     }
 }
 /*
 以上代码执行结果如下:(输出结果不一定是三行,有可能是0行或者5行哟!每次运行的结果几乎是不一致的)
 垃圾已经被收取啦!
 垃圾已经被收取啦!
 垃圾已经被收取啦!
 */
复制代码
  • 确定当前的系统属性(public static getProperties getProperties() )
  • 获取单个属性(getProperties(String key))
public class SystemDemo {
     public static void main(String[] args) {
         System.out.println(System.getProperties());
     }
 }
 /*
 以上代码执行结果如下:
 {sun.desktop=windows, awt.toolkit=sun.awt.windows.WToolkit, java.specification.version=9, file.encoding.pkg=sun.io, sun.cpu.isalist=amd64, sun.jnu.encoding=GBK, java.class.path=D:\10.Java\JavaSE\eclipse\Myprogram\workspace\Day6\bin, java.vm.vendor=Oracle Corporation, sun.arch.data.model=64, user.variant=, java.vendor.url=http://java.oracle.com/, user.timezone=, os.name=Windows 7, java.vm.specification.version=9, sun.java.launcher=SUN_STANDARD, user.country=CN, sun.boot.library.path=D:\10.Java\jdk-9.0.4\bin, sun.java.command=cn.org.yinzhengjie.demo.SystemDemo, jdk.debug=release, sun.cpu.endian=little, user.home=C:\Users\Administrator, user.language=zh, java.specification.vendor=Oracle Corporation, java.home=D:\10.Java\jdk-9.0.4, file.separator=\, java.vm.compressedOopsMode=Zero based, line.separator=
 , java.vm.specification.vendor=Oracle Corporation, java.specification.name=Java Platform API Specification, java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment, user.script=, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, java.runtime.version=9.0.4+11, user.name=Administrator, path.separator=;, os.version=6.1, java.runtime.name=Java(TM) SE Runtime Environment, file.encoding=GBK, java.vm.name=Java HotSpot(TM) 64-Bit Server VM, java.vendor.url.bug=http://bugreport.java.com/bugreport/, java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\, java.version=9.0.4, user.dir=D:\10.Java\JavaSE\eclipse\Myprogram\workspace\Day6, os.arch=amd64, java.vm.specification.name=Java Virtual Machine Specification, java.awt.printerjob=sun.awt.windows.WPrinterJob, sun.os.patch.level=Service Pack 1, java.library.path=D:\10.Java\jdk-9.0.4\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;D:/10.Java/jdk-9.0.4/bin/server;D:/10.Java/jdk-9.0.4/bin;D:\10.Java\jdk-9.0.4\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\04.Python\python3.6.5\Scripts\;D:\04.Python\python3.6.5\;D:\10.Java\JavaSE\eclipse\Myprogram\eclipse;;., java.vm.info=mixed mode, java.vendor=Oracle Corporation, java.vm.version=9.0.4+11, sun.io.unicode.encoding=UnicodeLittle, java.class.version=53.0}
 */
复制代码

 各个属性关系对应图如下:  

  • System类方法复制数组
  • (public static notive void arraycopy(Object src, int srcPos, Object dest, int destPos, int length))【notive 是可以调用当前操作系统来实现数组拷贝的】 用来实现将源数组部分元素复制到目标数组的指定位置。各个参数功能如下:

  Object src:要复制的原数组;

  Int srcPos:数组源的起始索引;

  Object dest:复制后的目标数组;

  int destPos:目标数组起始索引;

  int length,指定复制的长度;

public class SystemDemo {
     public static void main(String[] args) {
         int[] src = {1,22,333,4444,5555,666666,7777777};
         int[] dest = {10,20,30};
         System.arraycopy(src, 2, dest, 0, 2);
         for(int i=0;i<dest.length;i++) {
             System.out.println(dest[i]);
         }
     }
 }
 /*
 以上代码执行结果如下:
 333
 4444
 30
 */
复制代码

二、Math

常用值和函数

Math.PI 记录的圆周率 Math.E 记录e的常量 Math中还有一些类似的常量,都是一些工程数学常用量。

Math.abs 求绝对值 Math.sin 正弦函数 Math.asin 反正弦函数 Math.cos 余弦函数 Math.acos 反余弦函数 Math.tan 正切函数 Math.atan 反正切函数 Math.atan2 商的反正切函数 Math.toDegrees 弧度转化为角度 Math.toRadians 角度转化为弧度 Math.ceil 得到不小于某数的最大整数 Math.floor 得到不大于某数的最大整数 Math.IEEEremainder 求余 Math.max 求两数中最大 Math.min 求两数中最小 Math.sqrt 求开方 Math.pow 求某数的任意次方, 抛出ArithmeticException处理溢出异常 Math.exp 求e的任意次方 Math.log10 以10为底的对数 Math.log 自然对数 Math.rint 求距离某数最近的整数(可能比某数大,也可能比它小) Math.round 同上,返回int型或者long型(上一个函数返回double型) Math.random 返回0,1之间的一个随机数

用法实例: double s=Math.sqrt(7); double x=Math.pow(2,3) //计算2的3次方

三、BigDecimal

1.简介

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

2.构造器

BigDecimal(int)       创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
BigDecimal(long)    创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
复制代码

这几个都是常用的构造器,他们返回的对象都是BigDecimal对象。换而言之, 将各个类型的值转换为BigDecimal对象,就是通过构造器。

反过来说,将BigDecimal对象转换为其他类型的对象,我们通过以下几种:

toString()                将BigDecimal对象的数值转换成字符串。
doubleValue()          将BigDecimal对象中的值以双精度数返回。
floatValue()             将BigDecimal对象中的值以单精度数返回。
longValue()             将BigDecimal对象中的值以长整数返回。
intValue()               将BigDecimal对象中的值以整数返回。
复制代码

3.常用方法

BigDecimal b1 = new BigDecimal("20");
BigDecimal b2 = new BigDecimal("30");
b1.add(b2) :加法,求两个BigDecimal类型数据的和。
b1.subtract(b2):减法,求两个BigDecimal类型数据的差。
b1.multiply(b2):乘法,求两个BigDecimal类型数据的积。
b1.remainder(b2):求余数,求b1除以b2的余数。
b1.max(b2) : 最大数,求两个BigDecimal类型数据的最大值
b1.min(b2) : 最小数,求两个BigDecimal类型数据的最小值。
bi.abs():绝对值,求BigDecimal类型数据的绝对值。
b1.negate():相反数,求BigDecimal类型数据的相反数。
复制代码

除法单独拿出来

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
复制代码

除法 divide有三个参数的方法,第一参数表示除数,第二个参数表示小数点后保留位数,第三个参数表示取舍规则。只有在作除法运算或四舍五入时才用到取舍规则。 因为BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。所以当我们用三参数的除法方法时,规定了保留几位小数以及你的保留方式,就可以避免异常。

几个取舍规则:

ROUND_CEILING //向正无穷方向舍入
ROUND_DOWN //向零方向舍入
ROUND_FLOOR //向负无穷方向舍入
ROUND_HALF_DOWN  //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN  //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP  //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6
ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式
ROUND_UP //向远离0的方向舍入
复制代码

我们最常用的四舍五入应该是 ROUND_HALF_UP

源码中的注释也解释了这一点。

这里说下除法里的第三个参数,

a.divide(b,2,RoundingMode.HALF_UP)
复制代码

这里RoundingMode其实是个枚举类,点进去源码可以看到其实他就是匹配到几种取舍规则

UP(BigDecimal.ROUND_UP),
DOWN(BigDecimal.ROUND_DOWN),
CEILING(BigDecimal.ROUND_CEILING),
FLOOR(BigDecimal.ROUND_FLOOR),
HALF_UP(BigDecimal.ROUND_HALF_UP),
HALF_DOWN(BigDecimal.ROUND_HALF_DOWN),
HALF_EVEN(BigDecimal.ROUND_HALF_EVEN),
UNNECESSARY(BigDecimal.ROUND_UNNECESSARY);
复制代码

而最常用的就是 HALF_UP 也就是四舍五入。

那如果我们在乘法或者加法减法中也要保留几位或者四舍五入,该怎么操作呢?

四舍五入 BigDecimal中有一个setScale()方法

第一个参数就是你要保留几位,第二个可填的参数就是取舍规则,图中的两种殊途同归。如果你第二个参数不加,仅仅想保留几位,他在源码中会自动帮你选择默认的规则

public BigDecimal setScale(int newScale) {
    return setScale(newScale, ROUND_UNNECESSARY);
}
/**
 * Rounding mode to assert that the requested operation has an exact
 * result, hence no rounding is necessary.  If this rounding mode is
 * specified on an operation that yields an inexact result, an
 * {@code ArithmeticException} is thrown.
 */
public final static int ROUND_UNNECESSARY =  7;
复制代码

源码中提及,当我们需要精确结果的时候,可以用这种取舍方式,但是如果你的结果不精确就会抛出异常。例子

BigDecimal b1 = new BigDecimal("3.5");    
BigDecimal b2 = new BigDecimal("7.7");
b1.divide(b2).setScale(2);
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
    at java.math.BigDecimal.divide(BigDecimal.java:1690)
复制代码

四、java.util.Objects

  1. Objects.equals(Object a,Object b)方法,对比对象地址值是否相等,而且还是用equals方法进行比较,而且不用关心a,b对象是否为空
public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}
复制代码
  1. Objects.deepEquals(Object a,Object b)方法,深度比较,就是可以比较数组内容是否相等
public static boolean deepEquals(Object a, Object b) {
    if (a == b)
        return true;
    else if (a == null || b == null)
        return false;
    else
        return Arrays.deepEquals0(a, b);
}
复制代码
  1. Objects.hashCode(Object 0),这个直接看代码
public static int hashCode(Object o) {
    return o != null ? o.hashCode() : 0;
}
Object.hashCode(Object...values)上一个方法的重载
public static int hash(Object... values) {
    return Arrays.hashCode(values);
}
复制代码
  1. Objects.toString(Object o),Objects.toString(Object o,String nullDefault),直接上代码
public static String toString(Object o) {
    return String.valueOf(o);
public static String toString(Object o, String nullDefault) {
    return (o != null) ? o.toString() : nullDefault;
}
复制代码
  1. Objects.compare(T a,T b,Comparator<? extends T> c),地址值相同则返回0,具体排序规则自定定义
public static <T> int compare(T a, T b, Comparator<? super T> c) {
    return (a == b) ? 0 :  c.compare(a, b);
}
复制代码
  1. Objects.requireNonNull(T obj),Objects.requireNonNull(T obj,String message),校验参数是否为空,否则抛出异常,jdk1.8后本方法允许将消息的创建延迟,直到空检查结束之后。虽然在非空例子中这可能会带来性能优势, 但是决定调用本方法时应该小心,创建message supplier的开销低于直接创建字符串消息。
public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}
public static <T> T requireNonNull(T obj, String message) {
    if (obj == null)
        throw new NullPointerException(message);
    return obj;
}
public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
    if (obj == null)
        throw new NullPointerException(messageSupplier.get());
    return obj;
}
复制代码
  1. Objects.isNull(Object obj)判断对象是否为空,相对应的有nonNull方法
public static boolean isNull(Object obj) {
    return obj == null;
}
public static boolean nonNull(Object obj) {
    return obj != null;
}
复制代码

五、java.util.Collections

  1. 返回一个空的列表,不可变,开发中尽量避免返回null,还可以返回空map,set等
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
复制代码
  1. 不可变,任何对它的更改,都会导致UnsupportedOperationException,因此,此list的容量始终为1
public static <T> List<T> singletonList(T o) {
    return new SingletonList<>(o);
}
复制代码
  1. 返回指定映射的不可修改视图

试图修改返回的映射(不管是直接修改还是通过其 collection 视图进行修改)将导致抛出 UnsupportedOperationException。如果指定映射是可序列化的,则返回的映射也将是可序列化的。

private final Map<? extends K, ? extends V> m;
UnmodifiableMap(Map<? extends K, ? extends V> m) {
    if (m==null)
        throw new NullPointerException();
    this.m = m;
}


目录
相关文章
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
79 9
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
160 57
|
11天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
65 8
|
2月前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
46 4
|
2月前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
53 4
|
2月前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
27 1
|
2月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
76 17
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。