在以上的文章中我们看了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 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-8u91-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 输出一个爱心_java基础 之 几个常用的类相关推荐

  1. java web定义数组_Java基础之数组--数组常用操作

    3.2一维数组 3.2.1声明数组 数组类型[] 数组名称:int[] username; 或者 数组类型 数组名称[];int username[]; 3.2.2初始化一维数组 一维数组初始化有两种 ...

  2. 用java写一个爱心

    你可以使用ASCII字符在控制台上输出一个爱心的图形. 例如: public class Heart {public static void main(String[] args) {System.o ...

  3. 用python输出一个爱心

    可以使用 Python 的字符串格式化功能来输出一个爱心. 下面是一个示例代码: print("\n".join(["%s%s%s" % (" &qu ...

  4. Java IO流大闯关--IO流的常用实现类

    这个系列的博客主要是对Java高级编程中IO流相关的知识点做一个梳理,内容主要包括File类.IO流原理及流的分类.文件流.缓冲流.转换流.标准输入输出流.打印流.数据流.对象流.随机存取文件流.NI ...

  5. java输出一个空心的爱心

    在 Java 中,你可以使用字符串和循环语句来输出一个空心的爱心. 下面是一个例子: public class EmptyHeart {public static void main(String[] ...

  6. JAVA 输出一个会动的爱心

    以下是 Java 代码,可以在控制台输出一个会动的爱心: public class Love {public static void main(String[] args) throws Interr ...

  7. java输出五行菱形_Java打印一个菱形

    打印出如下图案 (行数为奇数n的菱形) * *** ***** ******* ***** *** * 代码: public static void main(String[] args) { int ...

  8. java输入一个数字输出_java 输入一个数字,反转输出这个数字的值(实现方法)

    如下所示: package 第四天; import java.util.Scanner; public class 数字反转 { public static void main(String[] ar ...

  9. java io流 教程_Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...

最新文章

  1. jquery.datatable能返回数据绑不上_地磁场可以影响人体机能吗?解释有多种,但都不理想...
  2. uboot引导kernel - 2- uboot/kernel需要放在DDR什么位置的问题
  3. 编程入门:准备学Python入门编程 为什么前辈一直劝我不行?
  4. Worktile完成新一轮融资,将发力研发管理赛道
  5. IT常说的协议指的是什么?—Vecloud微云
  6. docker可以把应用及其相关的_Docker相关命令应用
  7. 64位指针膨胀 java_Java 程序优化知识笔记
  8. Kubernetes应用部署模型解析(原理篇)
  9. 二十一、PHP框架Laravel学习笔记——模型的访问器和修改器
  10. 华为主题包hwt下载_华为主题 | 黑白人物
  11. java跳转控制语句有哪些_Java语言基础学习之流程控制语句和跳转控制语句实例分析...
  12. MySQL中修改root密码的方法
  13. [原创]C#之探索发现:在WinForm上写的一个模拟分页小程序
  14. 使用keras和tensorflow进行minst数据集图像分类
  15. Quartz开发-插件开发
  16. 2015年高教社杯全国大学生数学建模A题太阳影子定位(Matlab代码)
  17. Redis的安装启动,菜鸟使用(windows)
  18. Windows 10 开启代理软件代理流量之后,系统的某些自带软件无法联网
  19. 解决python运行selenium程序执行完后,Chrome浏览器自动关闭的问题
  20. Pytorch使用CPU

热门文章

  1. Excel里如何更改坐标轴起始位置使图落在正中心
  2. luogu p1652 圆
  3. Kettle资源库-元数据
  4. java Http消息传递之POST和GET两种方法--通过实用工具类来获取服务器资源
  5. Fade out transition effect using CSS3
  6. Android -- 写xml到SD卡中
  7. [转载] kotlin 字符串_Kotlin基本类型字符串
  8. Linux文件上传下载sz 和 rz 命令
  9. JupterNoteBook
  10. JavaScript:判断当前浏览器是否为微信浏览器