一、Java基础类库

Java以基础类库JFC(Java Foundation Class)的形式为程序员提供编程接口API,类库中的类按照用途归属于不同的包中。

1、Java.lang包

Java最常用的包都属于该包,程序不需要注入此包,就可以使用该包中的类,利用这些类可以设计最基本的Java程序。   

(1)、String类,提供了字符串连接、比较、字符定位、字符串打印等处理方法。   

(2)、StringBuffer类,提供字符串进一步的处理方法,包括子字符串处理、字符添加插入、字符替换等。   

(3)、System类,提供对标准输入、输出设备io的读写方法,包括键盘、屏幕的in/out控制。常用的System.out.print()、System.out.println()都是该类的静态变量输出流out所提供的方法

(4)、Thread类,提供Java多线程处理方法,包括线程的悬挂、睡眠、终止和运行等。   

(5)、Math类,提供大量的数学计算方法

(6)、Object类,这是Java类的祖先类,该类为所有Java类提供了调用Java垃圾回收对象方法以及基于对象线程安全的等待、唤醒方法等。

(7)、Throwable类,该类是Java错误、异常类的祖先类,为Java处理错误、异常提供了方法。

2、java.awt包

该包中的类提供了图形界面的创建方法,包括按钮、文本框、列表框、容器、字体、颜色和图形等元素的建立和设置。

3、javax.swing包

该包提供100%Java编写的图形界面创建类,利用该包的类建立的界面元素可调整为各种操作系统的界面风格,支持各种操作平台的界面的开发。此外,swing包还提供了树形控件、标签页控件、表格控件的类。Java.swing包中的很多类都是从java.awt包的类继承而来,Java保留使用java.awt包是为了保持技术的兼容性,但应尽量地使用javax.swing包来开发程序界面。

4、java.io包

该包的类提供数据流方式的系统输入输出控制、文件和对象的读写串行化处理,比较常用的类包括:BufferInputStream、BufferOutputStream、BufferedReader、BufferedWriter、DataInputStream、DataOutputStream、File、FileReader、FileWriter、FileInputStream和FileOutputStream等。

5、java.util包

该包提供时间日期、随机数以及列表、集合、哈希表和堆栈等创建复杂数据结构的类,比较常见的类有:Date、Timer、Random和LinkedList等。

6、java.net包

该包提供网络开发的支持,包括封装了Socket套接字功能的服务器Serversocket类、客户端Socket类以及访问互联网上的各种资源的URL类。

7、java.applet包

此包只有一个Applet类,用于开发或嵌入到网页上的Applet小应用程序,使网页具有更强的交互能力以及多媒体、网络功能。

二、与用户互动的类库

1、运行Java程序的参数

main()方法分析

  • public修饰符:Java类由JVM调用,为了让JVM可以自由调用这个main()方法,所以使用public修饰符把这个方法暴露出来

  • static修饰符:JVM调用这个主方法时,不会先创建该类的对象,然后通过对象来调用该主方法。JVM直接通过该类来调用主方法,因此用static修饰该主方法

  • void返回值:因为主方法被JVM调用,该方法的返回值将返回给JVM,这没有任何意义,因此main()方法没有返回值

2、使用Scanner获取键盘输入

Scanner类可以获取键盘输入,是一个基于正则表达式的文本扫描器,可以从文件、输入流、字符串中解析出基本类型值和字符串值

Scanner主要提供以下两个方法来扫描输入:

  • 在默认情况下,Scanner使用空白(包括键盘、Tab空白、回车)作为多个输入项之间的分隔符

  • Scanner使用useDelimiter(String pattern)作为分隔符设置

Scanner提供以下两个方法逐行读取:

public static void main(String[] args){// System.in代表标准输入,就是键盘输入Scanner sc = new Scanner(System.in);// 增加下面一行将只把回车作为分隔符// sc.useDelimiter("\n");// 判断是否还有下一个输入项while(sc.hasNext()){// 输出输入项System.out.println("键盘输入的内容是:" + sc.next());}
}

同时Scanner还可以读取文件输入,只需要传入File对象作为参数即可

public static void main(String[] args)throws Exception{// 将一个File对象作为Scanner的构造器参数,Scanner读取文件内容Scanner sc = new Scanner(new File("ScannerFileTest.java"));System.out.println("ScannerFileTest.java文件内容如下:");// 判断是否还有下一行while(sc.hasNextLine()){// 输出文件中的下一行System.out.println(sc.nextLine());}
}

三、系统相关的类库

1、System类

System类代表当前Java程序的运行平台,程序不能创建System类的对象,System类提供了一些类变量和类方法,允许直接通过System类来调用这些类变量和类方法。可以获取依稀系统相关信息

public static void main(String[] args) throws Exception{// 获取系统所有的环境变量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 props = System.getProperties();// 将所有系统属性保存到props.txt文件中props.store(new FileOutputStream("props.txt"), "System Properties");// 输出特定的系统属性System.out.println(System.getProperty("os.name"));
}
  • System的计时方法:currentTimeMillis()(毫秒)和nanoTime()(纳秒),相对于1970年

  • System的输入输出:in,out,err,提供了setInt()、setOut()、setErr()方法

  • System类提供一个identityHashCode(Object x),返回指定对象的精确hash Code值,根据对象地址的到,可以唯一标识一个对象

public static void main(String[] args){// 下面程序中s1和s2是两个不同对象String s1 = new String("Hello");String s2 = new String("Hello");// String重写了hashCode()方法——改为根据字符序列计算hashCode值,// 因为s1和s2的字符序列相同,所以它们的hashCode方法返回值相同System.out.println(s1.hashCode() + "----" + s2.hashCode());// s1和s2是不同的字符串对象,所以它们的identityHashCode值不同System.out.println(System.identityHashCode(s1) + "----" + System.identityHashCode(s2));String s3 = "Java";String s4 = "Java";// s3和s4是相同的字符串对象,所以它们的identityHashCode值相同System.out.println(System.identityHashCode(s3) + "----" + System.identityHashCode(s4));
}

2、Runtime类

Runtime类代表Java程序的运行时环境,每个Java程序都有一个与之对应的Runtime实例。应用程序不能创建自己的Runtime实例,但是可以通过getRuntime()方法获取与之关联的Runtime对象

与System类似,Runtime提供了gc()和runFinalization(),并提供了load(String filename)和loadLibrary(String libname)来加载文件和动态链接库

Runtime可以访问JVM的相关信息:

public static void main(String[] args){ // 获取Java程序关联的运行时对象 Runtime rt = Runtime.getRuntime(); System.out.println("处理器数量:" + rt.availableProcessors()); System.out.println("空闲内存数:" + rt.freeMemory()); System.out.println("总内存数:" + rt.totalMemory()); System.out.println("可用最大内存数:" + rt.maxMemory());
}

Runtime来可以直接单独启动一个进程来运行操作系统命令

public static void main(String[] args) throws Exception{Runtime rt = Runtime.getRuntime();// 运行记事本程序rt.exec("notepad.exe");
}

四、常用类

1、Object类

Object是所有类,数组,枚举类的父类。也就是说Java允许把任何类型的变量赋给Object类型的变量 Object提供了如下几个常用方法:

  • boolean equals(Object obj):判断指定对象与该对象是否相等

  • protected void finalize():当系统中没有引用变量引用到该对象时,垃圾回收器调用此方法来清理该对象的资源

  • Class<?> getClass():返回该对象的运行时类

  • int hashCode():返回该对象的hashCode值

  • String toString():返回该对象的字符串表示

  • wait(),notify(),notifyAll()

Object还提供了protected修饰的clone()方法,用于得到一个当前对象的副本,而且二者之间完全隔离。实现“自我克隆”的步骤如下:

  • 自定义类实现Coneable接口,此为标记行接口,里面没有定义任何方法

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

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

class Address{String detail;public Address(String detail){this.detail = detail;}
}
// 实现Cloneable接口
class User implements Cloneable{int age;Address address;public User(int age){this.age = age;address = new Address("广州天河");}// 通过调用super.clone()来实现clone()方法public User clone() throws CloneNotSupportedException{return (User)super.clone();}
}
public class CloneTest{public static void main(String[] args) throws CloneNotSupportedException{User u1 = new User(29);// clone得到u1对象的副本。User u2 = u1.clone();// 判断u1、u2是否相同System.out.println(u1 == u2);      //false// 判断u1、u2的address是否相同System.out.println(u1.address == u2.address);     //true}
}

2、Java7新增的Object类

若不确定一个对象是否为null就用toString()则可能引起空指针异常,而Object提供的toString(Object o)则不会,若为空,则返回null字符串

// 定义一个obj变量,它的默认值是null
static ObjectsTest obj;
public static void main(String[] args)
{// 输出一个null对象的hashCode值,输出0System.out.println(Objects.hashCode(obj));// 输出一个null对象的toString,输出nullSystem.out.println(Objects.toString(obj));// 要求obj不能为null,如果obj为null则引发异常System.out.println(Objects.requireNonNull(obj , "obj参数不能是null!"));
}

3、String、StringBuffer和StringBuilder类

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

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

  • StringBuilder从JDK1.5开始使用,与StringBuffer类似,不同的是StringBuffer是线程安全的,而StringBuilder没有线程安全,性能略高。通常考虑StringBuilder类

4、Math类

Java提供Math工具完成复杂的运算,Math是一个工具类,其构造器修饰符为private,因此无法创建对象。提供了大量静态方法和PI、E

public static void main(String[] args){/*---------下面是三角运算---------*/// 将弧度转换角度System.out.println("Math.toDegrees(1.57):" + Math.toDegrees(1.57));// 将角度转换为弧度System.out.println("Math.toRadians(90):" + Math.toRadians(90));// 计算反余弦,返回的角度范围在 0.0 到 pi 之间。System.out.println("Math.acos(1.2):" + Math.acos(1.2));// 计算反正弦;返回的角度范围在 -pi/2 到 pi/2 之间。System.out.println("Math.asin(0.8):" + Math.asin(0.8));// 计算反正切;返回的角度范围在 -pi/2 到 pi/2 之间。System.out.println("Math.atan(2.3):" + Math.atan(2.3));// 计算三角余弦。System.out.println("Math.cos(1.57):" + Math.cos(1.57));// 计算值的双曲余弦。System.out.println("Math.cosh(1.2 ):" + Math.cosh(1.2 ));// 计算正弦System.out.println("Math.sin(1.57 ):" + Math.sin(1.57 ));// 计算双曲正弦System.out.println("Math.sinh(1.2 ):" + Math.sinh(1.2 ));// 计算三角正切System.out.println("Math.tan(0.8 ):" + Math.tan(0.8 ));// 计算双曲正切System.out.println("Math.tanh(2.1 ):" + Math.tanh(2.1 ));// 将矩形坐标 (x, y) 转换成极坐标 (r, thet));System.out.println("Math.atan2(0.1, 0.2):" + Math.atan2(0.1, 0.2));/*---------下面是取整运算---------*/// 取整,返回小于目标数的最大整数。System.out.println("Math.floor(-1.2 ):" + Math.floor(-1.2 ));// 取整,返回大于目标数的最小整数。System.out.println("Math.ceil(1.2):" + Math.ceil(1.2));// 四舍五入取整System.out.println("Math.round(2.3 ):" + Math.round(2.3 ));/*---------下面是乘方、开方、指数运算---------*/// 计算平方根。System.out.println("Math.sqrt(2.3 ):" + Math.sqrt(2.3 ));// 计算立方根。System.out.println("Math.cbrt(9):" + Math.cbrt(9));// 返回欧拉数 e 的n次幂。System.out.println("Math.exp(2):" + Math.exp(2));// 返回 sqrt(x2 +y2)System.out.println("Math.hypot(4 , 4):" + Math.hypot(4 , 4));// 按照 IEEE 754 标准的规定,对两个参数进行余数运算。System.out.println("Math.IEEEremainder(5 , 2):" + Math.IEEEremainder(5 , 2));// 计算乘方System.out.println("Math.pow(3, 2):" + Math.pow(3, 2));// 计算自然对数System.out.println("Math.log(12):" + Math.log(12));// 计算底数为 10 的对数。System.out.println("Math.log10(9):" + Math.log10(9));// 返回参数与 1 之和的自然对数。System.out.println("Math.log1p(9):" + Math.log1p(9));/*---------下面是符号相关的运算---------*/// 计算绝对值。System.out.println("Math.abs(-4.5):" + Math.abs(-4.5));// 符号赋值,返回带有第二个浮点数符号的第一个浮点参数。System.out.println("Math.copySign(1.2, -1.0):" + Math.copySign(1.2, -1.0));// 符号函数;如果参数为 0,则返回 0;如果参数大于 0,// 则返回 1.0;如果参数小于 0,则返回 -1.0。System.out.println("Math.signum(2.3):" + Math.signum(2.3));/*---------下面是大小相关的运算---------*/// 找出最大值System.out.println("Math.max(2.3 , 4.5):" + Math.max(2.3 , 4.5));// 计算最小值System.out.println("Math.min(1.2 , 3.4):" + Math.min(1.2 , 3.4));// 返回第一个参数和第二个参数之间与第一个参数相邻的浮点数。System.out.println("Math.nextAfter(1.2, 1.0):" + Math.nextAfter(1.2, 1.0));// 返回比目标数略大的浮点数System.out.println("Math.nextUp(1.2 ):" + Math.nextUp(1.2 ));// 返回一个伪随机数,该值大于等于 0.0 且小于 1.0。System.out.println("Math.random():" + Math.random());
}

5、Java7的ThreadLocalRandom与Random

ThreadLocalRandom类是Java7新增的一个类,是Random的增强版。在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少线程资源竞争,最终保证系统具有更好的线程安全性。与Random用法类似。提供了一个静态的current()方法获取ThreadLocalRandom对象,获取到该对象之后即可调用各种nextXxx()方法来获取伪随机数

ThreadLocalRandom与Random都比Math的random()方法提供了更多的方式生成各种伪随机数,可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机数,还可以指定生成随机数的范围

Random类专门用于生成一个伪随机数,拥有两个构造器:一个构造器使用默认种子(以当前时间作为种子),另一个构造器显式传入一个long型整数的种子

public static void main(String[] args){Random rand = new Random();System.out.println("rand.nextBoolean():" + rand.nextBoolean());byte[] buffer = new byte[16];rand.nextBytes(buffer);System.out.println(Arrays.toString(buffer));// 生成0.0~1.0之间的伪随机double数System.out.println("rand.nextDouble():" + rand.nextDouble());// 生成0.0~1.0之间的伪随机float数System.out.println("rand.nextFloat():" + rand.nextFloat());// 生成平均值是 0.0,标准差是 1.0的伪高斯数System.out.println("rand.nextGaussian():" + rand.nextGaussian());// 生成一个处于int整数取值范围的伪随机整数System.out.println("rand.nextInt():" + rand.nextInt());// 生成0~26之间的伪随机整数System.out.println("rand.nextInt(26):" + rand.nextInt(26));// 生成一个处于long整数取值范围的伪随机整数System.out.println("rand.nextLong():" +  rand.nextLong());
}

一般使用时间作为种子Random rand = new Random(System.currentTimeMillis());

ThreadLocalRandom用法实例:

ThreadLocalRandom rand = ThreadLocalRandom.current();
//生成一4~20之间的伪随机数
int val1 = rand.nextInt(4,20);
//生成一个2.0~10.0的伪随机数
int val2 = rand.nextDouble(2.0,10.0);

6、BigDecimal类

浮点数的精确计算,使用String而不是double

public static void main(String[] args){BigDecimal f1 = new BigDecimal("0.05");BigDecimal f2 = BigDecimal.valueOf(0.01);BigDecimal f3 = new BigDecimal(0.05);System.out.println("使用String作为BigDecimal构造器参数:");System.out.println("0.05 + 0.01 = " + f1.add(f2));System.out.println("0.05 - 0.01 = " + f1.subtract(f2));System.out.println("0.05 * 0.01 = " + f1.multiply(f2));System.out.println("0.05 / 0.01 = " + f1.divide(f2));System.out.println("使用double作为BigDecimal构造器参数:");System.out.println("0.05 + 0.01 = " + f3.add(f2));System.out.println("0.05 - 0.01 = " + f3.subtract(f2));System.out.println("0.05 * 0.01 = " + f3.multiply(f2));System.out.println("0.05 / 0.01 = " + f3.divide(f2));
}

代码:

public class Arith{// 默认除法运算精度private static final int DEF_DIV_SCALE = 10;// 构造器私有,让这个类不能实例化private Arith()  {}// 提供精确的加法运算。public static double add(double v1,double v2){BigDecimal b1 = BigDecimal.valueOf(v1);BigDecimal b2 = BigDecimal.valueOf(v2);return b1.add(b2).doubleValue();}// 提供精确的减法运算。public static double sub(double v1,double v2){BigDecimal b1 = BigDecimal.valueOf(v1);BigDecimal b2 = BigDecimal.valueOf(v2);return b1.subtract(b2).doubleValue();}// 提供精确的乘法运算。public static double mul(double v1,double v2){BigDecimal b1 = BigDecimal.valueOf(v1);BigDecimal b2 = BigDecimal.valueOf(v2);return b1.multiply(b2).doubleValue();}// 提供(相对)精确的除法运算,当发生除不尽的情况时.// 精确到小数点以后10位的数字四舍五入。public static double div(double v1,double v2){BigDecimal b1 = BigDecimal.valueOf(v1);BigDecimal b2 = BigDecimal.valueOf(v2);return b1.divide(b2 , DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();}public static void main(String[] args){System.out.println("0.05 + 0.01 = " + Arith.add(0.05 , 0.01));System.out.println("1.0 - 0.42 = " + Arith.sub(1.0 , 0.42));System.out.println("4.015 * 100 = " + Arith.mul(4.015 , 100));System.out.println("123.3 / 100 = " + Arith.div(123.3 , 100));}
}

五、Java8的日期、时间表

1、Date类(尽量少用)

Java提供了Date类来处理时间、日期,Date既包含日期也包含时间

Date提供了了六个构造器,其中四个已经不再推荐使用,剩下两个如下:

  • Date():生成一个代表当前日期时间的Date对象,改构造器底层调用System.currentTimeMillis()获得long整数作为日期参数

  • Date(long date):根据指定的long型整数来生成一个Date对象

Date的大部分方法也已经不再推荐使用

  • boolean after(Date when):测试该日期是否在指定日期when之后

  • boolean before(Date when):测试该日期是否在指定日期when之前

  • long getTime():返回该时间对应的long型整数

  • void setTime(long time):设置该Date对象的时间

public static void main(String[] args){Date d1 = new Date();// 获取当前时间之后100ms的时间Date d2 = new Date(System.currentTimeMillis() + 100);System.out.println(d2);System.out.println(d1.compareTo(d2));System.out.println(d1.before(d2));
}

2、Calendar类

为了弥补Date设计上的缺陷,Java提供了Calendar类

Calendar是一个抽象类,所以不能用构造器来创建Calendar对象。但是提供了几个静态getInstance()方法来获取Calendar对象,这些方法根据TimeZone、Locale类来获取特定的Calender。如果不指定TimeZone、Locale,则使用默认的TimeZone、Locale来创建Calendar

//创建一个默认的Calendar对象
Calendar calendar = Calendar.getInstance();
//从Calendar对象中取出Date对象
Date date = calendar.getTime();
//通过Date对象获得对应的Calendar对象
//因为Calendar/GregorianCalendar没有构造器方法可以接收Date对象
//所以必须先获得一个Calendar实例,然后再调用其setTime()方法
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date);

Calendar提供了大量访问、修改日期时间的方法:

  • void add(int field,int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量

  • int get(int field):返回指定日历字段的值

  • int getActualMaximum(int field):返回指定日历字段可能拥有的最大值

  • int getActualMinimum(int field):返回指定日历字段可能拥有的最小值

  • void roll(int field,int amount):与add()方法类似,区别在于加上amount后超过了该字段所能表示的最大范围时,也不会向上一个字段进位

  • void set(int filed,int value):将给定的日历字段设置为给定值

  • void set(int filed,int month,int date):设置Calenser对象的年、月、日三个字段的值

  • void set(int year,int month,int date,int hourOfDay,int minute,int second):设置Calendar对象的年、月、日、时、分、秒6个字段的值

public static void main(String[] args){Calendar c = Calendar.getInstance();// 取出年System.out.println(c.get(YEAR));// 取出月份System.out.println(c.get(MONTH));// 取出日System.out.println(c.get(DATE));// 分别设置年、月、日、小时、分钟、秒c.set(2003 , 10 , 23 , 12, 32, 23); //2003-11-23 12:32:23System.out.println(c.getTime());// 将Calendar的年前推1年c.add(YEAR , -1); //2002-11-23 12:32:23System.out.println(c.getTime());// 将Calendar的月前推8个月c.roll(MONTH , -8); //2002-03-23 12:32:23System.out.println(c.getTime());
}

add与roll的区别

  • add(int field,int amount)主要用于改变Calendar的特定字段的值。如果要增加,则amount为正数,减少则为负数

    • 当被修改的字段超出它的允许范围时,会发生进位,即上一级字段也会增大。

Calendar cal1 = Calendar.getInstance();
cal1.set(2003, 7, 23, 0, 0 , 0); // 2003-8-23
cal1.add(MONTH, 6); //2003-8-23 => 2004-2-23
System.out.println(cal1.getTime());
  • 如果下一字段也需要改变,那么该字段会修正到变化最小的值

Calendar cal2 = Calendar.getInstance();
cal2.set(2003, 7, 31, 0, 0 , 0); // 2003-8-31
// 因为进位到后月份改为2月,2月没有31日,自动变成29日
cal2.add(MONTH, 6); // 2003-8-31 => 2004-2-29
System.out.println(cal2.getTime());

roll()规则与add()的处理规则不同:

  • 当被修改的字段超出它的允许范围时,上一级不会增大。

Calendar cal3 = Calendar.getInstance();
cal3.set(2003, 7, 23, 0, 0 , 0); //2003-8-23 // MONTH字段“进位”,但YEAR字段并不增加
cal3.roll(MONTH, 6); //2003-8-23 => 2003-2-23
System.out.println(cal3.getTime());
  • 下一级字段的处理规则与add()相似

Calendar cal4 = Calendar.getInstance();
cal4.set(2003, 7, 31, 0, 0 , 0); //2003-8-31
// MONTH字段“进位”后变成2,2月没有31日,
// YEAR字段不会改变,2003年2月只有28天
cal4.roll(MONTH, 6); //2003-8-31 => 2003-2-28
System.out.println(cal4.getTime());

设置Calendae的兼容性

  • 当传入一个非法的参数设置值的时候可以用setLenient(false)关闭容错性,让其进行严格的参数检查

public static void main(String[] args){Calendar cal = Calendar.getInstance();// 结果是YEAR字段加1,MONTH字段为1(二月)cal.set(MONTH , 13);   //①System.out.println(cal.getTime());// 关闭容错性cal.setLenient(false);// 导致运行时异常cal.set(MONTH , 13);   //②System.out.println(cal.getTime());
}

set()方法延迟修改

  • set(f,value)方法将日历字段f改为value,此外还设置了一个内部成员变量,以指示日历字段f已经被更改。f的修改时立即更改的,但该Calendar所代表的时间却不会立即修改,知道下次调用get()、getTime()、getTimeInMillis()、add()或roll()时才会重新计算日历的时间。这称之为set()方法的延迟修改。也就不会因多次调用set()而产生多次计算

public static void main(String[] args){Calendar cal = Calendar.getInstance();cal.set(2003 , 7 , 31);  //2003-8-31// 将月份设为9,但9月31日不存在。// 如果立即修改,系统将会把cal自动调整到10月1日。cal.set(MONTH , 8);// 下面代码输出10月1日//System.out.println(cal.getTime());    //不使之生效// 设置DATE字段为5cal.set(DATE , 5);    //②System.out.println(cal.getTime());    //2003-9-5
}

六、Java8新增的日期、时间包

Java8专门新增了一个java.time包,该包包含了如下的常用类:

  • Clock:用于获取指定时区的当前日期、时间

  • Duration:代表持续时间

  • Instant:代表一个精确时刻,可以精确到纳秒。静态方法new(),new(Clock clock),minusXxx(),plusXxx()

  • LocalDate:代表不带时区的日期。静态方法new(),new(Clock clock),minusXxx(),plusXxx()

  • LocalTime:代表不带时区的时间。静态方法new(),new(Clock clock),minusXxx(),plusXxx()

  • LocalDateTime:代表不带时区的日期、时间。静态方法new(),new(Clock clock),minusXxx(),plusXxx()

  • MonthDay:仅代表月日。静态方法new(),new(Clock clock)

  • Year:仅代表年。静态方法new(),new(Clock clock),minusYears(),plusYears()

  • YearMonth:仅代表月年。静态方法new(),new(Clock clock),minusXxx(),plusXxx()

  • ZonedDateTime:代表一个时区化的日期、时间

  • ZoneId:代表一个时区

  • DayOfWeek:定义了周日到周六的枚举类

  • Month:定义了一月到十二月的枚举类

七、正则表达式

正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。String类里也提供了如下特殊方法:

  • boolean matches(String regex):判断该字符串是否匹配指定的正则表达式

  • String replaceAll(String regex,String replacement):将该字符串中所有匹配regex的子串替换成replacement

  • String replaceFirst(String regex,String replacement):将该字符串中第一个匹配regex的子串替换成replacement

1、创建正则表达式

  • 创建正则表达式实质上就是创建一个特殊的字符串。

  • 正则表达式支持的合法字符有如下几种,特殊字符也有一些

x

字符x(x可代表任意合法字符)

\0mnn

八进制数0mnn所表示的字符

\xhh

十六进制值0xhh所表示的数

\uhhhh

十六进制值0xhhhh所表示的Unicode字符

\t

制表符('\u0009')

\n

新行(换行)符('\u000A')

\r

回车符('\u000D')

\f

换页符('\u000C')

\a

报警(bell)符('\u0007')

\e

Escape符('\u001B')

\cx

x对应的控制符(e.g \cM 匹配Ctrl+M)

$

匹配一行的结尾

\$

^

匹配一行的开头

\^

(&emsp;)

标记子表达式的开始和结束位置

\(&emsp;\)

[&emsp;]

用于确定中括号表达式的开始和结束位置

\[&emsp;\]

{&emsp;}

用于标记前面子表达式的出现频率

\{&emsp;\}

*

指定前面子表达式可以出现零次或多次

\*

+

指定前面子表达式可以出现一次或多次

\+

?

指定前面子表达式可以出现零次或一次

\?

.

匹配除换行符\n之外的任何单字符

\.

\\

用于转义下一个字符,或指定八进制,十六进制字符

\\

|

指定两项之间任选一项

|

将上面的多个字符拼接起来,就可以创建一个正则表达式了。

e.g:

"\u0041\\" //匹配A\

"\u0061\t" //匹配a<制表符>

"\?\[" //匹配?[

以上正则表达式只能匹配单个字符,正则表达式还有通配符,也就是预定义字符,用来匹配多个字符

.

可以匹配任意字符

\d

匹配0~9的所有数字

\D

匹配非数字

\s

匹配所有的空白字符,包括空格,制表符,回车符,换页符,换行符等

\S

匹配所有的非空白符

\w

匹配所有的单词字符,包括0~9所有数字,26个英文字母和下划线( _ )

\W

匹配所有的非单词字符

  • 记忆诀窍:d-digit,代表数字。s-space,代表空白。w-word,代表单词

比之前更加强大的表达式得以创建

e.g:

c\wt //可以匹配cat,cbt,cct,c0t,c9t等一批字符串\d\d\d-\d\d\d-\d\d\d\d //匹配如000-000-0000形式的电话号码

为了匹配字母段,以及非字母段,就需要适用方括号表达式了

表示枚举

[abc]表示a、b、c其中的任意一个字符

表示范围:-

[a-d]表示ad范围内的任意字符,可以和枚举一起使用,`[a-fx-z]`表示af、x-z范围的任意字符

表示求否:^

[^abc]表示非a、b、c的任意字符,[^a-f]表示非a~f范围内的任意字符

表示“与”运算:&&

[a-z&&[def]表示a~z与[def]的交集,表示d、e或f,[a-z&&[^bc]]即为[ad-z]

表示“并”运算

并运算与枚举类似,[a-d[m-p]]即为[a-dm-p]

圆括号表达式:用于将多个表达式组成一个子表达式,圆括号中可用或运算符(|) e.g."((a)|(b)|(c))"

边界匹配符

^

行的开头

$

行的结尾

\b

单词的边界

\B

非单词的边界

\A

输入的开头

\G

前一个匹配的结尾

\Z

输入的结尾,仅用于最后的结束符

\z

输入的结尾

正则表达式的数量标识符,贪婪模式(Greedy):一直匹配。勉强模式(Reluctant),用问号后缀(?)表示,只会匹配最少的字符。占有模式(Possessive),用加号后缀(+)表示

2、使用正则表达式

  • 一旦程序中定义了正则表达式,就可以使用Pattern和Matcher来使用正则表达式。Pattern对象是正则表达式编译后在内存中的表现形式,故正则表达式会被先编译为Pattern对象,然后利用该Pattern对象创建对应的Matcher对象,执行匹配所涉及的结果保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象,Pattern是不可变类,可供多个并发线程安全使用。由此得到典型的调用顺序如下:

//将一个字符串编译成Pattern对象
Pattern p = Pattern.compile("a*b");
//使用Pattern对象创建Matcher对象
Matcher m = p.matcher("aaaaab");
boolean b = m.matches(); //返回true

以上定义的Pattern对象可以多次重复使用,若只使用一次,可以调用Pattern类的静态方法matcher()

boolean b = Pattern.matches("a*b","aaaaab"); //返回true

Matcher类提供了如下几个常用方法:

  • find():返回目标字符串中是否包含与Pattern匹配的字串

  • find(int i):从索引i处向下搜索,返回目标字符串中是否包含与Pattern匹配的字串

  • group():返回上一次与Pattern匹配的字串

  • start():返回上一次与Pattern匹配的字串在目标字符串中的开始位置

  • end():返回上一次与Pattern匹配的字串在目标字符串中的结束位置+1

  • lookingAt():返回目标字符串前面部分与Pattern是否匹配

  • matches():返回整个目标字符串与Pattern是否匹配

  • reset():将现有的Matcher对象应用于一个新的字符序列

public class FindGroup{public static void main(String[] args){// 使用字符串模拟从网络上得到的网页源码String str = "我想求购一本《疯狂Java讲义》,尽快联系我13500006666"+ "交朋友,电话号码是13611125565"+ "出售二手电脑,联系方式15899903312";// 创建一个Pattern对象,并用它建立一个Matcher对象// 该正则表达式只抓取13X和15X段的手机号,// 实际要抓取哪些电话号码,只要修改正则表达式即可。Matcher m = Pattern.compile("((13\\d)|(15\\d))\\d{8}").matcher(str);// 将所有符合正则表达式的子串(电话号码)全部输出while(m.find()){System.out.println(m.group());}}
}public class StartEnd{public static void main(String[] args){// 创建一个Pattern对象,并用它建立一个Matcher对象String regStr = "Java is very easy!";System.out.println("目标字符串是:" + regStr);Matcher m = Pattern.compile("\\w+").matcher(regStr);while(m.find()){System.out.println(m.group() + "子串的起始位置:"+ m.start() + ",其结束位置:" + m.end());}}
}public class MatchesTest{public static void main(String[] args){String[] mails ={"kongyeeku@163.com" ,"kongyeeku@gmail.com","ligang@crazyit.org","wawa@abc.xx"};String mailRegEx = "\\w{3,20}@\\w+\\.(com|org|cn|net|gov)";Pattern mailPattern = Pattern.compile(mailRegEx);Matcher matcher = null;for (String mail : mails){if (matcher == null){matcher = mailPattern.matcher(mail);}else{matcher.reset(mail);}String result = mail + (matcher.matches() ? "是" : "不是")+ "一个有效的邮件地址!";System.out.println(result);}}
}

八、自动拆装箱

(1)、自动装箱

将基本数据类型转换成包装类型

(2)、自动拆箱

将包装类型转换成基本数据类型

//自动装箱
Integer total = 99;
//自动拆箱
int totalprim = total;

javaSE——Java基础类库相关推荐

  1. Java面试题系列之Java基础类库(一)

    Java程序员面试题大全系列之Java基础类库(一)                                                                           ...

  2. 【Java程序设计】Java基础类库简介

    Java基础类库简介 文章目录 Java基础类库简介 一.Java基础类库介绍 二.语言包(java.lang) (1)数据类型包裹类 1.生成数据类型包裹类对象的方法 2.得到基本数据类型数据的方法 ...

  3. 《疯狂Java讲义》读书笔记(四):Java基础类库

    第七章 Java基础类库 ①使用Scanner获取键盘输入:Scanner类提供了多个构造器,不同构造器可以接收文件.输入流.字符串作为数据源,主要提供了2个方法:hasNextXXX()是否还有下一 ...

  4. 第七章 Java基础类库

    前言:如果你真正学习到了这里,那么先容许我夸赞一下你,太棒了!哪怕你对前面六篇文章的掌握度达到50%也是非常了不起的了,关于后面的文章学习我只能说,非常简单,只是我们文章会非常详细的介绍实现原理和一些 ...

  5. Java基础类库笔记

    基础类库 概念: java大师为了提高程序员的开发效率 在jre中定义的一个类库 学习方法: 1:学会使用api 2:反复多做每个类的练习题 3:熟悉每个类的作用+常用方法 api applicati ...

  6. JavaSE——Java基础语法(二进制、变量、方法(函数)、运算符、转义字符)

    第2节 基础语法 一.二进制 1.1 二进制介绍 计算机中的数据都以二进制数字保存. 二进制 :逢二进一,即只有0.1两个值.如十进制的10在计算机内保存为二进制的1010. 计算机中信息的存储单位: ...

  7. [JAVA基础类库] String类 ○ StringBuffer类 ○ StringBuilder类

    引言 字符串就是一连串的字符序列,Java提供了String.StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象. String类是不可变类的: ...

  8. [JAVA基础类库] Objec类

    引言 Object类是所有类.数组的父类,位于java.lang 包下也就是说,Java允许把所有任何类型的对象赋给Object类型的变量.当定义一个类时没有使用extends关键字为它显式指定父类, ...

  9. java基础类库——java数据库编程,JDBC连接(原生数据库连接)(十)

    java数据库编程,JDBC连接(原生数据库连接) JDBC严格来讲不属于一门技术,它属于一种服务.所有的操作流程都是固定的.JDBC是java提供的数据库操作的一个标准(它就是一组相关的标准接口), ...

最新文章

  1. 0058-简单的阶乘
  2. 【转载】OSPF网络类型
  3. 网络设备中的linux,理解linux虚拟网络设备veth
  4. LeetCode 552. 学生出勤记录 II(动态规划)
  5. interface接口——公共规范标准
  6. Java 集合 Collection、Iterator
  7. Android 实现两个控件水平居中
  8. 阿里云的yum源配置
  9. 医院排队系统排队叫号系统
  10. PPT模板 | 红色学术风论文答辩PPT模板
  11. CTC Loss和Focal CTC Loss
  12. sqlserver 汉字转拼音(转载)
  13. 探索变量之间的关系(python3)
  14. APISpace 笑话大全API
  15. buu-[ACTF新生赛2020]Universe_final_answer
  16. gitlab安装及配置
  17. c++ Linux windows学习路线
  18. Redis如何保存数组和对象
  19. 苹果最新发布iOS 5 全部机型都有 下载吧
  20. 标准曲线制作、SEM检验、使用知识大全

热门文章

  1. win7 计算机 其他 删除,Win7系统多余的本地连接2怎么删除?
  2. ————python———— 用bs4和re快速获取琉璃神社资源
  3. c#未能加载基类System
  4. 学习笔记——数据格式的变更和自定义
  5. 习题3-3 出租车计价
  6. 可视化大屏赋能智慧医疗
  7. CentOS 8软件包管理命令DNF
  8. 如何批量去除PDF水印
  9. 惊爆GitHub!腾讯T14级SQL首席专家开源分布式数据库架构实践手册
  10. 张秋民老师6月9号给海油集团讲授《金字塔思维与公文写作》圆满结束