java基础类库

接收输入

Scanner类。有scanner构造函数,可以选择标准输入system.in,也可以选择文件。

scanner的hasnext方法返回Boolean,表示是否还有输入。next返回出输入。

系统相关

加载文件和动态链接库,针对native方法。如需完成操作系统底层硬件设备,需要借助c语言实现。

1.声明native方法,类似于abstract方法,只有方法签名。使用带-h选项的javac命令,编译该程序。将生产一个.class和一个.h文件。

2.写一个.cpp文件实现native方法,需要包含.h文件(这个文件中包含了jdk带的jni.h)

3将cpp文件编译成动态链接库文件。

4在java中用System类的loadLibrary..()方法或者Runtime类的loadLibrary()方法加载动态链接库,java程序就能够调用这个native方法了。

java9以前,javac没有-h选项,jdk提供了javah命令。java10删除了javah,javac的-h选项代替了javah

String类不可变类,StringBuffer代表可变字符串,提供了各种方法改变字符串,然后生成最终的String对象。用tostring

StringBuilder是jkd1.5新增类,也是可变字符串。但是线程不安全。比StringBuffer块。

java9以前,使用字符数组来保存字符串。I因此每个字符占2个字节。

java9以后,采用byte数组再加一个encoding-flag字段来保存字符,因此每个字符只占1个字节。

java8的日期、时间类

java.util包下提供了Date类,这个类从jdk1.0就有,因此十分古老,不推荐使用。提供的六个构造器目前java只推荐两个。

Date()生成代表当前的date对象。

Date(long Date)使用指定的long生成date对象。

import java.util.Date;
import java.time.*;
public class DataEx {
    public static void main(String[] args) {
        var dl=new Date();
      var d2=new Date(System.currentTimeMillis()+100);
        System.out.println(dl);
        System.out.println(d2);
        System.out.println(dl.compareTo(d2));
        System.out.println(dl.before(d2));
    }
}

Sat Mar 07 10:57:14 CST 2020
Sat Mar 07 10:57:14 CST 2020
-1
true

  尽量少用Date类,对日期进行加减运算,获取指定时间的date,可以使用calendar类

Calendar类

Calendar类是抽象类,不能通过构造函数创建对象。可以通过getInstance获得一个实例。然后调用Calendar的实例方法。也可以使用它的子类,例如格里高利日历类(表示公历)当然也可以自定义日历类作为其子类。

其中,表示年,月,日的类字段,其int值是从0开始,所以如果想赋值7月,则需赋值6.

add(int field ,int amount)功能非常强大。会自动进位,并且字段会自动修正到变化最小的值。

  var cl= Calendar.getInstance();
        //返回一个Date类型对象。
        var data=cl.getTime();
        var c2=Calendar.getInstance();
        //使用Data对象,为Calendar对象赋值。
        c2.setTime(data);
        System.out.println(data);

        System.out.println(c2);
        var c3=Calendar.getInstance();
        //使用set方法为Calendar对象赋值,其中7位八月
        c3.set(2019,7,31,0,0,0);
        var data2=c3.getTime();
        System.out.println(data2);
        //加6月,add会自动修正到改变最小的
        c3.add(Calendar.MONTH,6);
        var data3=c3.getTime();
        System.out.println(data3);


Sat Mar 07 11:32:11 CST 2020
java.util.GregorianCalendar[time=1583551931473,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=29,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH=2,WEEK_OF_YEAR=10,WEEK_OF_MONTH=1,DAY_OF_MONTH=7,DAY_OF_YEAR=67,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=32,SECOND=11,MILLISECOND=473,ZONE_OFFSET=28800000,DST_OFFSET=0]
Sat Aug 31 00:00:00 CST 2019
Sat Feb 29 00:00:00 CST 2020

  而使用roll时,则不会进位。

可以设置,setLenient(fals )来取消容错性。这样当加13个月时,会出错,而不取消时,会自动加一年一个月。

因为Calendar有两种模式,一种是lenient另一种是non-lenient模式,如果是前一种,则每个字段会接收超出他允许范围的值,自动修正。而设置false后,会报异常。

set方法有延迟性

例如7.31将set将月设置为9,程序不会立即计算,再设置天为4,如果在设置为9以后,就输出,因为没有9.31,所以会输出10.1,如果在设置4以后再输出,会输出9.4.这是因为,只有再调用gettime之类方法时,set才会计算。

新的日期时间包

java8新增了一个java.time包。

 包含以下类,分别有静态方法,方便对日期进行操作。

java的日期类分别有 util包下的Date,Calendar(抽象类),Date类的子类,处于java.sql包下的sql.Date类。还有新增的java.time包下的各个类。

正则表达式

正则表达式就是一个用于匹配字符串的模板。

可以使用Pattern和Matcher使用正则。

Pattern对象时正则表达式编译后在内存中的表达形式,所以需要将正则表达式先编译成Pattern对象。

Pattern p=Pattern.compile("a*b);

然后再用Patern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可以用一个Pattern对象。

String类也有正则表达式方法。

String类的matches,replaceFirst,replaceAll,split等方法。

变量处理和方法处理

MethodHandle是java增加了方法引用功能。类似于函数指针。

使用MethodType类的静态方法methodType,返回一个函数类型。类似于得到一个委托。即规定了函数的返回值,参数类型。

使用MethodHandles的lookup静态类,中的findStatic方法或者findVirtual方法,得到函数指针。

使用invoke执行函数。

java9增加的VarHandle

同样是使用MethodHandles的lookup静态类。使用findVarHandle方法,得到实例变量,或者类变量。然后通过实例变量或者类变量来操作实例变量或类变量。类变量不用传入对象作为参数。

他们都是动态机制。当获取成员变量时,需要字符串名称,而这个字符串名称也是可以为动态的。因此十分灵活。

java11 改进的国际化与格式化

国际化是指应用程序运行时,可以根据客户端请求来自的国际和地区,语言的不同而显示不同的界面。

国际化的目的是为了提供自适应更友好的用户界面,并不需要改变程序逻辑功能。

国际化的简称为I18N。

国际化的程序,在不同的地方,可以很好实现本地化。L10N。

java11国际化支持升级到了Unicode10.0字符集。对于不同国家不同语言的支持。具有了国际化和本地化的特征及API。

java语言将程序中的标签,提示等信息放在资源文件中,资源文件是key-value对。。资源文件命名有固定的方法。读取对应的资源文件,来改变value。达到国际化。

如果要获取java所支持的国家和语言,可以调用Locale类的方法。返回一个local数组。包含了所有支持的国家和语言。

 MessageFormat处理包含占位符的字符串

对于输出动态内容的信息,使用占位符,使用MessageFormat的静态方法format可以输出站位符的东西,根据format的参数顺序。

可以使用类文件代替资源文件

类文件优先使用

类名必须与属性文件名相同

必须继承ListRoesourceBundle,并重写getContents方法。该方法返回objedt数组,其每一项都是key-value对。

java9新增的日志API

开发者可以将日志消息路由到各种主流的日志框架。SLF4J,Log4J等。否则使用util.logging。

调用System类的getLOgger方法。获取logger对象。

使用对象的log方法输出日志。

可以给变日志基本。来实现是否输出日志。

 MessageFormat是抽象类Format的子类

 NumberFormat和DateFormat也是他的子类

其中NumberFormat,也是抽象基类,无法通过构造函数来创建对象。提供了类方法创建对象。

创建对象后,可以调用format和parse方法来格式化数值和将格式化的数值转换为数值。

DateFormat也是抽象类,也是通过类方法构造对象。有日期,时间,日期时间格式器

以上方法可以指定日期样式,时间样式参数。他们是DateFormat类的四个静态常量。这样可以将Date对象,转换为对应格式的日期,时间 

获得了对象之后,还可以调用parse方法,将字符串解析成Date对象。但是还要注意字符串的类型。如果类型出错,将会抛出异常。

SimpleDateFormat类是DateFormat的子类

他可以通过构造器来构造对象,构造器接收一个日期模板字符串。调用对象的format方法将date对象转换为特定的字符串。至于日期模板,对应的API有介绍。

java8新增了日期时间格式器

 DateTimeFormatter格式器类,相当于前面两个格式器的合体。也是可以字符串和日期互相转换。

可以使用静态常量,不同风格的枚举值,还有日期模 板,来创建对象。

然后data.format(对象)来,将date转换为字符串

如果解析日期字符串。

则需要先调用.ofPattern(日期模板)创建对象,然后使用locatime.parse(str,对象)来实现日期字符串转换为locatime时间对象。

原文地址:https://www.cnblogs.com/tomato190/p/12419468.html