三石说:java中常用的几个类
在以上的文章中我们看了Java的一些基础的使用,今天我们主要学习一下Java的几个常用的类
java操作系统底层Sytem类:
System类代表当前Java程序的运行平台,程序不能创建System类的对象,System类提供了一些类Field和类方法,允许直接通过System类来调用这些Field和方法。System类提供了代表标准输入、标准输出和错误输出的类Field,并提供了一些静态方法用于访问环境变量、系统属性的方法,还提供了加载文件和动态链接库的方法。下面程序通过System类来访问操作的环境变量和系统属性
加载文件和动态链接库主要对native方法有用,对于一些特殊的功能(如访问操作系统底层硬件设备等)Java程序无法实现,必须借助C语言来完成,此时需要使用C语言为Java方法提供实现。其实现步骤如下:
- Java程序中声明native()方法,类似于abstract方法,只有方法签名,没有实现。编译该Java程序,生成一个class文件。
- 用javah编译第1步生成的class文件,将产生一个.h文件。
- 写一个.cpp文件实现native方法,其中需要包含第2步产生的.h文件(.h文件中又包含了JDK带的jni.h文件)。
- 将第3步的.cpp文件编译成动态链接库文件。
- 在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
这篇文章主要分析了几个常见的类,其这些类仍需要我们在下面反复的练习,才能够达到效果。