三石说:java中常用的几个类

createh53周前 (12-10)技术教程16

在以上的文章中我们看了Java的一些基础的使用,今天我们主要学习一下Java的几个常用的类

java操作系统底层Sytem类:

System类代表当前Java程序的运行平台,程序不能创建System类的对象,System类提供了一些类Field和类方法,允许直接通过System类来调用这些Field和方法。System类提供了代表标准输入、标准输出和错误输出的类Field,并提供了一些静态方法用于访问环境变量、系统属性的方法,还提供了加载文件和动态链接库的方法。下面程序通过System类来访问操作的环境变量和系统属性

加载文件和动态链接库主要对native方法有用,对于一些特殊的功能(如访问操作系统底层硬件设备等)Java程序无法实现,必须借助C语言来完成,此时需要使用C语言为Java方法提供实现。其实现步骤如下:

  1. Java程序中声明native()方法,类似于abstract方法,只有方法签名,没有实现。编译该Java程序,生成一个class文件。
  2. 用javah编译第1步生成的class文件,将产生一个.h文件。
  3. 写一个.cpp文件实现native方法,其中需要包含第2步产生的.h文件(.h文件中又包含了JDK带的jni.h文件)。
  4. 将第3步的.cpp文件编译成动态链接库文件。
  5. 在Java中用System类的loadLibrary..()方法或Runtime类的loadLibrary()方法加载第4步产生的动态链接库文件,Java程序中就可以调用这个native()方法了。

System类提供了通知系统进行垃圾回收的gc()方法,以及通知系统进行资源清理的runFinalization()方法。System类还有两个获取系统当前时间的方法:currentTimeMillis()和nanoTime(),它们都返回一个long型整数。实际上它们都返回当前时间与UTC1970年1月1日午夜的时间差,前者以毫秒作为测量单位,后者以纳秒作为测量单位。必须指出的是,这两个方法的返回值的粒度取决于底层操作系统,可能所在的操作系统根本不支持以毫秒、纳秒作为计时单位。

例如,许多操作系统以几十毫秒为单位测量时间,currentTimeMillis()方法不可能返回精确的毫秒数;而nanoTime()方法很少用,因为大部分操作系统都不支持使用纳秒作为计时单位。

除此之外,System类的in、out和err分别代表系统的标准输入(通常是键盘)、标准输出(通常是显示器)和错误输出流,并提供了setIn、setOut和setErr方法来改变系统的标准输入、标准输出和标准错误输出流。

public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
        Map<String, String> env = System.getenv();
        for (String name : env.keySet()) {
            System.out.println(name + "-->" + env.get(name));
        }        
        // 获取指定的环境变量的值		
        System.out.println(System.getenv("JAVA_HOME"));		
        // 获取所有的系统属性		
        Properties properties =System.getProperties();		
        // 将所有的properties保持到prop.txt文件		
        properties.store(new FileOutputStream("props.txt"),"System Porpertis");		
        //输出特定的系统属性		
        System.out.println(System.getProperties());	
    }//输出
//输出
        USERDOMAIN_ROAMINGPROFILE-- > DESKTOP - KJ16LKS
        LOCALAPPDATA-- > C:\Users\BlueEarth\AppData\Local
        ChocolateyLastPathUpdate-- > 132478206462499485
        PROCESSOR_LEVEL-- > 23
        USERDOMAIN-- > DESKTOP - KJ16LKS
        FPS_BROWSER_APP_PROFILE_STRING-- > Internet Explorer
        LOGONSERVER-- >\\DESKTOP - KJ16LKS
        JAVA_HOME-- > D:\jdk - 8 u91 - windows - x64
        SESSIONNAME-- > Console
        ALLUSERSPROFILE-- > C:\ProgramData
        PROCESSOR_ARCHITECTURE-- > AMD64
        PSModulePath-- > C:\Program Files\WindowsPowerShell\Modules;
        C:\Windows\system32\WindowsPowerShell\v1 .0\Modules
        SystemDrive-- > C:
        MAVEN_HOME-- > D:\Program Files\apache - maven - 3.5 .2
        OneDrive-- > C:\Users\BlueEarth\OneDrive
        APPDATA-- > C:\Users\BlueEarth\AppData\Roaming
        USERNAME-- > BlueEarth
    }


System类还提供了一个identityHashCode(Object x)方法,该方法返回指定对象的精确hashCode值,也就是根据该对象的地址计算得到的hashCode值。当某个类的hashCode()方法被重写后,该类实例的hashCode()方法就不能唯一地标识该对象;但通过identityHashCode()方法返回的hashCode值,依然是根据该对象的地址计算得到的hashCode值。所以,如果两个对象的identityHashCode值相同,则两个对象绝对是同一个对象。如下程序所示

public void test(){		String s1=new String("Hello");		String s2= new String("Hello");		// String 重写了hashcode方法,因为s1和s2的字符序列相同,所以他们的hashCode()方法返回值相同。		System.out.println(s1.hashCode()+"______"+ s2.hashCode());
		// s1和s2是不同的字符串对象,所以他们的identityHashCode值相同		System.out.println(System.identityHashCode(s1)+"------" + 	System.identityHashCode(s2));}
// 输出:
69609650______69609650
792791759------1191747167

java中获取当地时间:

public class LocaleList {

    public static void main(String[] args) {

        // 返回Java所支持的全部国家和语言的数组
        Locale[] localeList = Locale.getAvailableLocales();
        // 遍历数组的每个元素,依次获取所支持的国家和语言
        for (int i = 0; i < localeList.length; i++) {
            // 输出所支持的国家和语言
            System.out.println(localeList[i].getDisplayCountry()
                    + "=" + localeList[i].getCountry() + " "
                    + localeList[i].getDisplayLanguage()
                    + "=" + localeList[i].getLanguage());

        }

    }

}

Object类:

Object类是所有类、数组、枚举类的父类,也就是说,Java允许把任何类型的对象赋给Object类型的变量。当定义一个类时没有使用extends关键字为它显示指定父类,则该类默认继承Object父类。

因为所有的Java类都是Object类的子类,所以任何Java对象都可以调用Object类的方法。Object类提供了如下几个常用方法。

  • boolean equals(Object obj):判断指定对象与该对象是否相等。此处相等的标准是,两个对象是同一个对象,因此该equals()方法通常没有太大的实用价值。
  • protected void finalize():当系统中没有引用变量引用到该对象时,垃圾回收器调用此方法来清理该对象的资源。
  • Class getClass():返回该对象的运行时类。
  • int hashCode():返回该对象的hashCode值。在默认情况下,Object类的hashCode()方法根据该对象的地址来计算(即与System.identityHashCode(Object x)方法的计算结果相同)。但很多类都重写了Object类的hashCode()方法,不再根据地址来计算其hashCode()方法值
  • String toString():返回该对象的字符串表示,当我们使用System.out.println()方法输出一个对象,或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的toString()方法返回该对象的字符串表示。Object类的toString()方法返回“运行时类名@十六进制hashCode值”格式的字符串,但很多类都重写了Object类的toString()方法,用于返回可以表述该对象信息的字符串。

Java还提供了一个protected修饰的clone()方法,该方法用于帮助其他对象来实现“自我克隆”,所谓“自我克隆”就是得到一个当前对象的副本,而且二者之间完全隔离。由于Object类提供的clone()方法使用了protected修饰,因此该方法只能被子类重写或调用。自定义类实现“克隆”的步骤如下。

(1)自定义类实现Cloneable接口。这是一个标记性的接口,实现该接口的对象可以实现“自我克隆”,接口里没有定义任何方法。

(2)自定义类实现自己的clone()方法。

(3)实现clone()方法时通过super.clone();调用Object实现的clone()方法来得到该对象的副本,并返回该副本。

String,StringBuffer和StringBuilder类

字符串就是一连串的字符序列,Java提供了String和StringBuffer两个类来封装字符串,并提供了一系列方法来操作字符串对象。

String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。

从JDK 1.5开始出现的StringBuilder类,也代表字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是,StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用StringBuilder类。

String常用方法:

  • String substring(int beginIndex):获取从beginIndex位置开始到结束的子字符串。
  • String substring(int beginIndex, int endIndex):获取从beginIndex位置开始到endIndex位置的子字符串。
  • char[] toCharArray():将该String对象转换成char数组。
  • String toLowerCase():将字符串转换成小写。
  • String toUpperCase():将字符串转换成大写。
  • char charAt(int index):获取字符串中指定位置的字符。其中,参数index指的是字符串的序数,字符串的序数从0开始到length()-1
  • int compareTo(String anotherString):比较两个字符串的大小。如果两个字符串的字符序列相等,则返回 0;不相等时,从两个字符串第 0个字符开始比较,返回第一个不相等的字符差。另一种情况,较长字符串的前面部分恰巧是较短的字符串,则返回它们的长度差
  • String concat(String str):将该String对象与str连接在一起。与Java提供的字符串连接运算符“+”的功能相同
  • boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。
  • String replaceAll(String regex, String replacement):将该字符串中所有匹配regex的子串替换成replacement。
  • String replaceFirst(String regex, String replacement):将该字符串中第一个匹配regex的子串替换成replacement。
  • String[] split(String regex):以regex作为分隔符,把该字符串分割成多个子串。

因为String是不可变的,所以会额外产生很多临时变量,使用StringBuffer或StringBuilder就可以避免这个问题。StringBuilder提供了一系列插入、追加、改变该字符串里包含的字符序列的方法。而StringBuffer与其用法完全相同,只是StringBuffer是线程安全的。

StringBuilder、StringBuffer有两个属性:length和capacity,其中length属性表示其包含的字符序列的长度。与String对象的length不同的是,StringBuilder、StringBuffer的length是可以改变的,可以通过length()、setLength(int len)方法来访问和修改其字符序列的长度。capacity属性表示StringBuilder的容量,capacity通常比length大,程序通常无须关心capacity属性.

Math类:

Java提供了基本的+、-、*、/、%等基本算术运算的运算符。Java提供了Math工具类来完成这些复杂的运算,Math类是一个工具类,它的构造器被定义成private的,因此无法创建Math类的对象;Math类中的所有方法都是类方法,可以直接通过类名来调用它们。Math类除了提供了大量静态方法之外,还提供了两个静态Field:PI和E,正如它们名字所暗示的,它们的值分别等于π和e

Random类:

Random类专门用于生成一个伪随机数,它有两个构造器:一个构造器使用默认的种子(以当前时间作为种子),另一个构造器需要程序员显式传入一个long型整数的种子。ThreadLocalRandom类是Java 7新增的一个类,它是Random的增强版。

在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有较好的性能。提示:关于多线程编程的知识,

ThreadLocalRandom类的用法与Random类的用法基本相似,它提供了一个静态的current()方法来获取ThreadLocalRandom对象,获取该对象之后即可调用各种nextXxx()方法来获取伪随机数了。ThreadLocalRandom与Random都比Math的random()方法提供了更多的方式来生成各种伪随机数,可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机数,还可以指定生成随机数的范围

BigDecimal类

BigDecimal(double val)构造器的详细说明时,可以看到不推荐使用该构造器的说明,主要是因为使用该构造器时有一定的不可预知性。当程序使用new BigDecimal(0.1)来创建一个BigDecimal对象时,它的值并不是0.1,它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为double浮点数,所以传入BigDecimal构造器的值不会正好等于0.1(虽然表面上等于该值)。

如果使用BigDecimal(String val)构造器的结果是可预知的——写入newBigDecimal("0.1")将创建一个BigDecimal,它正好等于预期的0.1。因此通常建议优先使用基于String的构造器。

如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将该double浮点数作为构造器参数创建BigDecimal对象,而是应该通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象。

BigDecimal类提供了add()、subtract()、multiply()、divide()、pow()等方法对精确浮点数进行常规算术运算

创建BigDecimal对象时,不要直接使用double浮点数作为参数来调用BigDecimal构造器,否则同样会发生精度丢失的问题。

Date类与DateFormat类

Java提供了Date类来处理日期、时间(此处的Date是指java.util包下的Date类,而不是java.sql包下的Date类),Date对象既包含日期,也包含时间。Date类从JDK 1.0起就开始存在了。但正因为它历史悠久,所以它的大部分构造器、方法都已经过时,不再推荐使用了。Date类提供了6个构造器,其中4个已经Deprecated(Java不再推荐使用,使用不再推荐的构造器时编译器会提出警告信息,并导致程序性能、安全性等方面的问题),剩下的两个构造器如下所示。

  • Date():生成一个代表当前日期时间的Date对象。该构造器在底层调用System.currentTimeMillis()获得long整数作为日期参数。
  • Date(long date):根据指定的long型整数来生成一个Date对象。该构造器的参数表示创建的Date对象和GMT 1970年1月1日00:00:00之间的时间差,以毫秒作为计时单位。

方法:

  • boolean after(Date when):测试该日期是否在指定日期when之后。
  • boolean before(Date when):测试该日期是否在指定日期when之前。
  • int compareTo(Date anotherDate):比较两个日期的大小,后面的时间大于前面的时间时返回-1,否则返回1。
  • boolean equals(Object obj):当两个时间表示同一时刻时返回true。
  • long getTime():返回该时间对应的long型整数,即从GMT 1970-01-0100:00:00 到该Date对象之间的时间差,以毫秒作为计时单位。
  • void setTime(long time):设置该Date对象的时间

DateFormat:

  • getDateInstance():返回一个日期格式器,它格式化后的字符串只有日期,没有时间。该方法可以传入多个参数,用于指定日期样式和Locale等参数;如果不指定这些参数,则使用默认参数。[插图]
  • getTimeInstance():返回一个时间格式器,它格式化后的字符串只有时间,没有日期。该方法可以传入多个参数,用于指定时间样式和Locale等参数;如果不指定这些参数,则使用默认参数。[插图]
  • getDateTimeInstance():返回一个日期、时间格式器,它格式化后的字符串既有日期,也有时间。该方法可以传入多个参数,用于指定日期样式、时间样式和Locale等参数;如果不指定这些参数,则使用默认参数

DateFormat的parse()方法可以把一个字符串解析成Date对象,但它要求被解析的字符串必须符合日期字符串的要求,否则可能抛出ParseException异常

Pattern与Matcher类

Pattern对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象

Matcher类提供了如下几个常用方法。[插图]

  • find():返回目标字符串中是否包含与Pattern匹配的子串。
  • group():返回上一次与Pattern匹配的子串。
  • start():返回上一次与Pattern匹配的子串在目标字符串中的开始位置。
  • end():返回上一次与Pattern匹配的子串在目标字符串中的结束位置加1。
  • lookingAt():返回目标字符串前面部分与Pattern是否匹配。
  • matches():返回整个目标字符串与Pattern 是否匹配
  • reset(),将现有的Matcher对象应用于一个新的字符序列。

Properties类:

Properties 继承于 Hashtable。表示一个持久的属性集,属性列表以key-value的形式存在,key和value都是字符串。

Properties 类被许多Java类使用。例如,在获取环境变量时它就作为System.getProperties()方法的返回值。我们在很多需要避免硬编码的应用场景下需要使用properties文件来加载程序需要的配置信息,比如JDBC、MyBatis框架等。Properties类则是properties文件和程序的中间桥梁,不论是从properties文件读取信息还是写入信息到properties文件都要经由Properties类。

public static void main(String[] args) throws Exception {
        Properties props = new Properties();
		//向Properties中添加属性        
  props.setProperty("username", "yeeku");        
  props.setProperty("password", "123456");		
  //将Properties中的key-value对保存到a.ini文件中       
  props.store(new FileOutputStream("a.ini"), "comment line");		
  //①//新建一个Properties对象        
  Properties props2 = new Properties();		
  //向Properties中添加属性       
  props2.setProperty("gender", "male");		
  //将a.ini文件中的key-value对追加到props2中        
  props2.load(new FileInputStream("a.ini"));		//②       
  System.out.println(props2);
    }
// 加载获取
Connection public Connection getConnection() throws Exception{    
  Properties info=new Properties();     
  info.load(this.getClass().getClassLoader().getResourceAsStream("jdbc.properties"));           
  String  driver=info.getProperty("driver");           
  String jdbcUrl=info.getProperty("jdbcUrl");        
  String user=info.getProperty("user");          
  String password=info .getProperty("password");         
  Class.forName(driver);          
  Connection connection=DriverManager.getConnection(jdbcUrl,user,password);        
  return connection;     
}


可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入属性文件中,也可以把属性文件中的“属性名=属性值”加载到Map对象中。由于属性文件里的属性名、属性值只能是字符串类型,所以Properties里的key、value都是字符串类型。该类提供了如下三个方法来修改Properties里的key、value值。

更多参看Properties类的使用:https://www.cnblogs.com/leeego-123/p/11535967.html

这篇文章主要分析了几个常见的类,其这些类仍需要我们在下面反复的练习,才能够达到效果。

相关文章

一文搞懂Java动态代理:为什么Mybatis Mapper不需要实现类?

在学习Java动态代理之前,我想让大家先思考这样几个问题。JDK动态代理为什么不能对类进行代理?Mybatis Mapper接口为什么不需要实现类?如果你还不知道上述问题的答案,那么这篇文章一定能消除...

Java基础:Object类

Object类概述Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的;当一个类没有直接继承某个类时,默认继承Object类,也就是说任何类都直接或间接继承Object类,Ob...

详细介绍一下Java中的类加载过程?

在Java中类的加载过程是Java虚拟机将类的字节码加载到内存中、进行验证、然后解析和初始化的过程。在这个过程中涉及多个步骤和执行阶段。Java的类加载机制是动态的,即类在运行时才会被加载。这种机制为...

一文弄懂-Java:类的加载过程

0 文由其一,工欲善其事,必先利其器。编程语言是软件开发工作中基础的基础。其二,学习的两重境界,知其然,知其所以然。前者回答了“是什么”,后者回答“为什么”。笔者力求在这两方面“雨露均沾”。其三,因此...

这一次,彻底搞懂Java并发包中的Atomic原子类

一、初始Atomic并发包从JDK1.5开始,Java在java.util.concurrent.atomic包下引入了一些Atomic相关的原子操作类,这些类避免使用加锁来实现同步,从而更加方便、高...

深度理解Java动态代理:为何MyBatis Mapper接口无需实现类?

引言Java动态代理是一个强大的特性,它允许在运行时动态生成代理类来拦截和处理方法调用。因此,它在诸如MyBatis这样的持久层框架中得到了广泛应用,使得我们能够通过简单的Mapper接口来进行数据库...