本帖最后由 liupeng_hm 于 2018-2-5 16:32 编辑
第15天常用API(开发中经常用,但是面试的时候比较少问到,最多就是笔试题)今日内容介绍 [size=14.0000pt]u Object [size=14.0000pt]u String [size=14.0000pt]u StringBuilder 第1章 Java的API及Object类在以前的学习过程中,我们都在学习对象基本特征、对象的使用以及对象的关系。接下来我们开始使用对象做事情,那么在使用对象做事情之前,我们要学习一些API中提供的常用对象。首先在学习API中的Object类之前,先来学习如何使用API。 1.1 Java 的APIJava 的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就是JDK中提供给我们使用的类,这些类将底层的代码实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。 在JDK安装目录下有个src.zip文件,这个文件解压缩后里面的内容是所有Java类的源文件。可以在其中查看相对应的类的源码。 我们在每次查看类中的方法时,都打开源代码进行查看,这种方式过于麻烦。其实,我们可以通过查帮助文档的方式,来了解Java提供的API如何使用。如下图操作:查找Object类 通过帮助文档中类与方法的介绍,我们就能够使用这个类了。 1.2 Object类概述Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。所有类在创建对象的时候,最终找的父类就是Object。 在Object类众多方法中,我们先学习equals方法与toString方法,其他方法后面课程中会陆续学到。 1.3 equals方法equals方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较。Object类中的equals方法内部使用的就是==比较运算符。 在开发中要比较两个对象是否相同,经常会根据对象中的属性值进行比较,也就是在开发经常需要子类重写equals方法根据对象的属性值进行比较。如下代码演示: /* 描述人这个类,并定义功能根据年龄判断是否是同龄人 由于要根据指定类的属性进行比较,这时只要覆盖Object中的equals方法 在方法体中根据类的属性值进行比较 */ class Person extends Object{ int age ; //复写父类的equals方法,实现自己的比较方式 public boolean equals(Object obj) { //判断当前调用equals方法的对象和传递进来的对象是否是同一个 if(this == obj){ return true; } //判断传递进来的对象是否是Person类型 if(!(obj instanceof Person)){ return false; } //将obj向下转型为Perosn引用,访问其属性 Person p = (Person)obj; return this.age == p.age; } } 注意:在复写Object中的equals方法时,一定要注意public boolean equals(Object obj)的参数是Object类型,在调用对象的属性时,一定要进行类型转换,在转换之前必须进行类型判断。 1.4 toString方法toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。 由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。 class Person extends Object{ int age ; //根据Person类的属性重写toString方法 public String toString() { return "Person [age=" + age + "]"; } } 第2章 String类2.1 String类的概述查阅API中的String类的描述,发现String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 //演示字符串 String str = "itcast"; str = "传智播客";
继续查阅API发现说字符串是常量;它们的值在创建之后不能更改,这是什么意思呢?其实就是说一旦这个字符串确定了,那么就会在内存区域中就生成了这个字符串。字符串本身不能改变,但str变量中记录的地址值是可以改变的。
继续查API发现,字符串有大量的重载的构造方法。通过String类的构造方法可以完成字符串对象的创建,那么,通过使用双引号的方式创建对象与new的方式创建对象,有什么不同呢?看如下程序与图解: String s3 = "abc"; String s4 = new String("abc"); System.out.println(s3==s4);//false System.out.println(s3.equals(s4));//true, //因为String重写了equals方法,建立了字符串自己的判断相同的依据(通过字符串对象中的字符来判断)
s3和s4的创建方式有什么不同呢? l s3创建,在内存中只有一个对象。这个对象在字符串常量池中 l s4创建,在内存中有两个对象。一个new的对象在堆中,一个字符串本身对象,在字符串常量池中
2.2 String类构造方法构造方法是用来完成String对象的创建,下图中给出了一部分构造方法需要在API中找到,并能够使用下列构造方法创建对象。 String s1 = new String(); //创建String对象,字符串中没有内容
byte[] bys = new byte[]{97,98,99,100}; String s2 = new String(bys); // 创建String对象,把数组元素作为字符串的内容 String s3 = new String(bys, 1, 3); //创建String对象,把一部分数组元素作为字符串的内容,参数offset为数组元素的起始索引位置,参数length为要几个元素
char[] chs = new char[]{’a’,’b’,’c’,’d’,’e’}; String s4 = new String(chs); //创建String对象,把数组元素作为字符串的内容 String s5 = new String(chs, 0, 3);//创建String对象,把一部分数组元素作为字符串的内容,参数offset为数组元素的起始索引位置,参数count为要几个元素
String s6 = new String(“abc”); //创建String对象,字符串内容为abc 2.3 String类的方法查找String类中有很多的常用的方法,我们在学习一个类的时候,不要盲目的把所有的方法尝试去使用一遍,这时我们应该根据这个对象的特点分析这个对象应该具备那些功能,这样大家应用起来更方便。 字符串是一个对象,那么它的方法必然是围绕操作这个对象的数据而定义的。我们想想字符串中有哪些功能呢? l 字符串中有多少个字符? String str = "abcde"; int len = str.length(); System.out.println("len="+len); l 获取部分字符串。 String str = "abcde"; String s1 = str.substring(1); //返回一个新字符串,内容为指定位置开始到字符串末尾的所有字符 String s2 = str.substring(2, 4);//返回一个新字符串,内容为指定位置开始到指定位置结束所有字符 System.out.println("str="+str); System.out.println("s1="+s1); System.out.println("s2="+s2); 2.4 String类中方法查找练习前面给大家简单介绍了几个字符串中常用的方法,这个过程中主要让大家学会如何去查阅API,如何找到自己想用的方法。接下来我们来练习下字符串方法的查找。 l 字符串是否以指定字符串开头。结尾同理。 String str = "StringDemo.java"; boolean b1 = str.startsWith("Demo");//判断是否以给定字符串开头 boolean b2 = str.startsWith("String"); boolean b3 = str.endsWith("java");//判断是否以给定字符串结尾 l 字符串中是否包含另一个字符串。 String str = "abcde"; int index = str.indexOf(“bcd”); //判断是否包含指定字符串,包含则返回第一次出现该字符串的索引,不包含则返回-1 boolean b2 = str.contains("bcd");//判断是否包含指定字符串,包含返回true,不包含返回false
l 将字符串转成一个字符数组。或者字节数组。 String str = "abcde"; char[] chs = str.toCharArray(); byte[] bytes = str.getBytes();
l 判断两个字符串中的内容是否相同 String str = "abcde"; String str2 = "abcde"; String str3 = "hello"; boolean b1 = str.equals(str2); boolean b2 = str.equals(str3);
l 获取该字符串对象中的内容 String str = new String("hello"); System.out.println( str.toString() ); System.out.pintln( str ); 直接打印引用类型变量时,默认调用该类型进行重写后的toString方法
下面的需求所对应的方法,要求大家自己动手在API中查找,并进行方法使用。 l 判断该字符串的内容是否为空的字符串 l 获取给定的字符,在该字符串中第一次出现的位置 l 获取该字符串中指定位置上的字符 l 把该字符串转换成 小写字符串 l 把该字符串转换成 大写字符串 l 在该字符串中,将给定的旧字符,用新字符替换 l 在该字符串中, 将给定的旧字符串,用新字符串替换 l 去除字符串两端空格,中间的不会去除,返回一个新字符串 2.5 String类方法使用练习l 题目一:获取指定字符串中,大写字母、小写字母、数字的个数。 l 思路:1.为了统计大写字母、小写字母、数字的个数。创建3个计数的变量。 2.为了获取到字符串中的每个字符,进行字符串的遍历,得到每个字符。 3.对得到的字符进行判断,如果该字符为大写字母,则大写字母个数+1;如果该字符为小写字母,则小写字母个数+1;如果该字符为数字,则数字个数+1。 4.显示大写字母、小写字母、数字的个数 l 代码: public static void method(String str){ int bigCount = 0; //大写字母的个数 int smallCount = 0; //小写字母的个数 int numberCount = 0; //数字的个数 for (int i=0; i < str.length(); i++) { char ch = str.charAt(i); //获取指定位置上的字符 if (ch>=’A’ && ch<=’Z’) { bigCount++; } else if (ch>=’a’ && ch<=’z’) { smallCount++; } else if (ch>=’0’ && ch<=’9’) { numberCount++; } } System.out.println("大写字母个数:"+bigCount); System.out.println("小写字母个数:"+smallCount); System.out.println("数字个数:"+numberCount); }
l 题目二:将字符串中,第一个字母转换成大写,其他字母转换成小写,并打印改变后的字符串。 l 思路:1.把字符串分为两个部分,第一部分为字符串中第一个字母,第二部分为剩下的字符串。 2.把第一部分字符串转换成大写字母,把第二部分字符串转换成小写字母 3.把两部分字符串连接在一起,得到一个完整的字符串 l 代码: public static String convert(String str){ //获取第一部分为字符串 String start = str.substring(0,1); //获取第二部分为字符串 String end = str.substring(1); //把第一部分字符串转换成大写字母,把第二部分字符串转换成小写字母 String big = start.toUpperCase(); String small = end.toLowerCase(); //把两部分字符串连接在一起,得到一个完整的字符串 return big+small; }
l 题目三:查询大字符串中,出现指定小字符串的次数。如“hellojava,nihaojava,javazhenbang”中查询出现“java”的次数。 l 思路:1.在大串中,查找小串出现的位置,出现了就次数+1 2.在上次小串出现位置的后面继续查找,需要更改大串的内容为上次未查询到的字符串。 3.回到第一步,继续查找小串出现的位置,直到大串中查询不到小串为止 l 代码: public static int getCount(String big, String small){ int count = 0; //出现小串的次数 int index = -1;//出现小串的位置 /* while的循环条件三步骤: 步骤一. big.indexOf(small) 获取小串在大串中出现的位置 步骤二. 把小串出现的位置,赋值给变量index 步骤三. 判断出现的位置是否为-1, 如果位置等于-1,说明大串中已经查询不到小串了;如果位置不等于-1,那么,进行循环,完成次数累加与修改大串的操作 */ while ((index = big.indexOf(small)) != -1 ){ count++;//出现次数+1 //更改大串内容 big = big.substring(index+1); } return count; } 第3章 字符串缓冲区3.1 StringBuffer类在学习String类时,API中说字符串缓冲区支持可变的字符串,什么是字符串缓冲区呢?接下来我们来研究下字符串缓冲区。 查阅StringBuffer的API,StringBuffer又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。 原来StringBuffer是个字符串的缓冲区,即就是它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作。 3.2 StringBuffer的方法使用l 代码演示: 创建一个字符串缓冲区对象。用于存储数据。 StringBuffer sb = new StringBuffer(); sb.append("haha"); //添加字符串 sb.insert(2, "it");//在指定位置插入 sb.delete(1, 4);//删除 sb.replace(1, 4, "cast");//替换指定范围内的内容 String str = sb.toString(); l 注意:append、delete、insert、replace、reverse方法调用后,返回值都是当前对象自己,所以说,StringBuffer它可以改变字符序列的长度和内容。 3.3 StringBuffer类方法查找练习下面的需求所对应的方法,要求大家自己动手在API中查找,并进行方法使用。 l 从指定位置开始,到末尾结束,截取该字符串缓冲区,返回新字符串 l 在原有字符串缓冲区内容基础上,删除指定位置上的字符 3.4 对象的方法链式调用在我们开发中,会遇到调用一个方法后,返回一个对象的情况。然后使用返回的对象继续调用方法。这种时候,我们就可以把代码现在一起,如append方法一样,代码如下: 创建一个字符串缓冲区对象。用于存储数据。 StringBuffer sb = new StringBuffer(); 添加数据。不断的添加数据后,要对缓冲区的最后的数据进行操作,必须转成字符串才可以。 String str = sb.append(true).append("hehe").toString();
3.5 StringBuffer练习练习:int[] arr = {34,12,89,68};将一个int[]中元素转成字符串 格式 [34,12,89,68] public static String toString_2(int[] arr) { StringBuffer sb = new StringBuffer(); sb.append("["); for (int i = 0; i < arr.length; i++) { if(i!=arr.length-1){ sb.append(arr+","); }else{ sb.append(arr+"]"); } } return sb.toString(); } l 无论多少数据,数据是什么类型都不重要,只要最终变成字符串就可以使用StringBuffer这个容器 3.6 StringBuilder类查阅API发现还有一个StringBuilder类,它也是字符串缓冲区,StringBuilder与它和StringBuffer的有什么不同呢? 我们阅读StringBuilder的API说明发现,它也是一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。 目前,我们还没有涉及到线程与同步,知道结论StringBuilder比StringBuffer快即可。为什么快,我们会在学习线程时讲解。 第4章 总结4.1 知识点总结l Object: 它是所有类的超类,祖宗类。java中所有的类都直接或间接的继承这个类 l 方法 public String toString() 返回当前对象中的内容, 对于Object类默认操作来说,返回的对象的类型+@+内存地址值 public boolean equals(Object obj) 比较两个对象内容是否相同,对于Object类默认操作来说,比较的是地址值
l String: 字符串类,字符串是常量;它们的值在创建之后不能更改 l 方法 boolean equals(Object obj) 判断两个字符串中的内容是否相同 boolean equalsIgnoreCase(String str) 判断两个字符串中的内容是否相同, 忽略大小写 boolean contains(String str) 判断该字符串中 是否包含给定的字符串 boolean startsWith(String str) 判断该字符串 是否以给定的字符串开头 boolean endsWith(String str) 判断该字符串 是否以给定的字符串结尾 boolean isEmpty() 判断该字符串的内容是否为空的字符串 "" int length() 获取该字符串的长度 char charAt(int index) 获取该字符串中指定位置上的字符 String substring(int start) 从指定位置开始,到末尾结束,截取该字符串,返回新字符串 String substring(int start,int end) 从指定位置开始,到指定位置结束,截取该字符串,返回新字符串 int indexOf(int ch ) 获取给定的字符,在该字符串中第一次出现的位置 int indexOf(String str) 获取给定的字符串,在该字符串中第一次出现的位置 int indexOf(int ch,int fromIndex) 从指定位置开始,获取给定的字符,在该字符 byte[] getBytes() 把该字符串 转换成 字节数组 char[] toCharArray() 把该字符串 转换成 字符数组 String replace(char old,char new) 在该字符串中,将给定的旧字符,用新字符替换 String replace(String old,String new) 在该字符串中, 将给定的旧字符串,用新字符串替换 String trim() 去除字符串两端空格,中间的不会去除,返回一个新字符串 String toLowerCase() 把该字符串转换成 小写字符串 String toUpperCase() 把该字符串转换成 大写字符串 int indexOf(String str,int fromIndex) 从指定位置开始,获取给定的字符串,在该字符串中第一次出现的位置
l StringBuffer/StringBuilder: l 方法 public StringBuffer append(String str) 在原有字符串缓冲区内容基础上,在末尾追加新数据 public StringBuffer insert(int offset,String str) 在原有字符串缓冲区内容基础上,在指定位置插入新数据 public StringBuffer deleteCharAt(int index) 在原有字符串缓冲区内容基础上,删除指定位置上的字符 public StringBuffer delete(int start,int end) 在原有字符串缓冲区内容基础上,删除指定范围内的多个字符 public StringBuffer replace(int start,int end,String str)在原有字符串缓冲区内容基础上,将指定范围内的多个字符 用给定的字符串替换 public StringBuffer reverse() 将字符串缓冲区的内容 反转 "abc"----"cba" public String substring(int start) 从指定位置开始,到末尾结束,截取该字符串缓冲区,返回新字符串 public String substring(int start,int end) 从指定位置开始,到指定位置结束,截取该字符串缓冲区,返回新字符串 第16天常用API今日内容介绍 [size=14.0000pt]u 正则表达式 [size=14.0000pt]u Date [size=14.0000pt]u DateFormat [size=14.0000pt]u Calendar
第1章 正则表达式 1.1 正则表达式的概念正则表达式(英语:Regular Expression,在代码中常简写为regex)。 正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。 1.2 正则表达式的匹配规则参照帮助文档,在Pattern类中有正则表达式的的规则定义,正则表达式中明确区分大小写字母。我们来学习语法规则。 正则表达式的语法规则: 字符:x 含义:代表的是字符x 例如:匹配规则为 "a",那么需要匹配的字符串内容就是 ”a”
字符:\\ 含义:代表的是反斜线字符'\' 例如:匹配规则为"\\" ,那么需要匹配的字符串内容就是 ”\”
字符:\t 含义:制表符 例如:匹配规则为"\t" ,那么对应的效果就是产生一个制表符的空间
字符:\n 含义:换行符 例如:匹配规则为"\n",那么对应的效果就是换行,光标在原有位置的下一行
字符:\r 含义:回车符 例如:匹配规则为"\r" ,那么对应的效果就是回车后的效果,光标来到下一行行首
字符类:[abc] 含义:代表的是字符a、b 或 c 例如:匹配规则为"[abc]" ,那么需要匹配的内容就是字符a,或者字符b,或字符c的一个
字符类:[^abc] 含义:代表的是除了 a、b 或 c以外的任何字符 例如:匹配规则为"[^abc]",那么需要匹配的内容就是不是字符a,或者不是字符b,或不是字符c的任意一个字符
字符类:[a-zA-Z] 含义:代表的是a 到 z 或 A 到 Z,两头的字母包括在内 例如:匹配规则为"[a-zA-Z]",那么需要匹配的是一个大写或者小写字母
字符类:[0-9] 含义:代表的是 0到9数字,两头的数字包括在内 例如:匹配规则为"[0-9]",那么需要匹配的是一个数字
字符类:[a-zA-Z_0-9] 含义:代表的字母或者数字或者下划线(即单词字符) 例如:匹配规则为" [a-zA-Z_0-9] ",那么需要匹配的是一个字母或者是一个数字或一个下滑线
预定义字符类:. 含义:代表的是任何字符 例如:匹配规则为" . ",那么需要匹配的是一个任意字符。如果,就想使用 . 的话,使用匹配规则"\\."来实现
预定义字符类:\d 含义:代表的是 0到9数字,两头的数字包括在内,相当于[0-9] 例如:匹配规则为"\d ",那么需要匹配的是一个数字
预定义字符类:\w 含义:代表的字母或者数字或者下划线(即单词字符),相当于[a-zA-Z_0-9] 例如:匹配规则为"\w ",,那么需要匹配的是一个字母或者是一个数字或一个下滑线
边界匹配器:^ 含义:代表的是行的开头 例如:匹配规则为^[abc][0-9]$ ,那么需要匹配的内容从[abc]这个位置开始, 相当于左双引号
边界匹配器:$ 含义:代表的是行的结尾 例如:匹配规则为^[abc][0-9]$ ,那么需要匹配的内容以[0-9]这个结束, 相当于右双引号
边界匹配器:\b 含义:代表的是单词边界 例如:匹配规则为"\b[abc]\b" ,那么代表的是字母a或b或c的左右两边需要的是非单词字符([a-zA-Z_0-9])
数量词:X? 含义:代表的是X出现一次或一次也没有 例如:匹配规则为"a?",那么需要匹配的内容是一个字符a,或者一个a都没有
数量词:X* 含义:代表的是X出现零次或多次 例如:匹配规则为"a*" ,那么需要匹配的内容是多个字符a,或者一个a都没有
数量词:X+ 含义:代表的是X出现一次或多次 例如:匹配规则为"a+",那么需要匹配的内容是多个字符a,或者一个a
数量词:X{n} 含义:代表的是X出现恰好 n 次 例如:匹配规则为"a{5}",那么需要匹配的内容是5个字符a
数量词:X{n,} 含义:代表的是X出现至少 n 次 例如:匹配规则为"a{5, }",那么需要匹配的内容是最少有5个字符a
数量词:X{n,m} 含义:代表的是X出现至少 n 次,但是不超过 m 次 例如:匹配规则为"a{5,8}",那么需要匹配的内容是有5个字符a 到 8个字符a之间
1.3 正则表达式规则匹配练习请写出满足如下匹配规则的字符串: 规则:"[0-9]{6,12}" 该规则需要匹配的内容是:长度为6位到12位的数字。 如:使用数据"123456789"进行匹配结果为true; 使用数据"12345"进行匹配结果为false。
规则:"1[34578][0-9]{9}" 该规则需要匹配的内容是:11位的手机号码,第1位为1,第2位为3、4、5、7、8中的一个,后面9位为0到9之间的任意数字。 如:使用数据"12345678901"进行匹配结果为false; 使用数据"13312345678"进行匹配结果为true。
规则:"a*b" 该规则需要匹配的内容是:在多个a或零个a后面有个b;b必须为最后一个字符。 如:使用数据"aaaaab"进行匹配结果为true; 使用数据"abc"进行匹配结果为false。
1.4 字符串类中涉及正则表达式的常用方法
file:///C:\Users\LP\AppData\Local\Temp\ksohtml\wpsA42D.tmp.jpg l public boolean matches(String regex) //判断字符串是否匹配给定的规则 举例:校验qq号码. 1: 要求必须是5-15位数字 2: 0不能开头 代码演示: String qq = "604154942"; String regex = "[1-9][0-9]{4,14}"; boolean flag2 = qq.matches(regex);
举例:校验手机号码 1:要求为11位数字 2:第1位为1,第2位为3、4、5、7、8中的一个,后面9位为0到9之间的任意数字。 代码演示: String phone = "18800022116"; String regex = "1[34578][0-9]{9}"; boolean flag = phone.matches(regex);
l public String[] split(String regex) //根据给定正则表达式的匹配规则,拆分此字符串 举例:分割出字符串中的的数字 代码演示: String s = "18-22-40-65"; String regex = "-"; String[] result = s.split(regex); 代码演示: String s = "18 22 40 65"; String regex = " "; String[] result = s.split(regex);
l public String replaceAll(String regex,String replacement) //将符合规则的字符串内容,全部替换为新字符串 举例:把文字中的数字替换成* 代码演示: String s = "Hello12345World6789012"; String regex = "[0-9]"; String result = s.replaceAll(regex, "*"); 1.5 正则表达式练习l 匹配正确的数字 匹配规则: 匹配正整数:”\\d+” 匹配正小数:”\\d+\\.\\d+” 匹配负整数:”-\\d+” 匹配负小数:”-\\d+\\.\\d+” 匹配保留两位小数的正数:”\\d+\\.\\d{2}” 匹配保留1-3位小数的正数:”\\d+\\.\\d{1,3}”
l 匹配合法的邮箱 匹配规则: ”[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]+)+” ”\\w+@\\w+(\\.\\w+)+”
l 获取IP地址(192.168.1.100)中的每段数字 匹配规则: ”\\.”
第2章 Date2.1 Date类概述 类 Date 表示特定的瞬间,精确到毫秒。 继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期对象。 file:///C:\Users\LP\AppData\Local\Temp\ksohtml\wpsA42E.tmp.jpg //创建日期对象,把当前的毫秒值转成日期对象 Date date = new Date(1607616000000L); System.out.println(date); //打印结果:Fri Dec 11 00:00:00 CST 2020 可是将毫秒值转成日期后,输出的格式不利于我们阅读,继续查阅API,Date中有getYear、getMouth等方法,可以他们已经过时,继续往下查阅,看到了toString方法。 file:///C:\Users\LP\AppData\Local\Temp\ksohtml\wpsA43F.tmp.jpg 点开toString()方法查阅,原来上面打印的date对象就是默认调用了这个toString方法,并且在这个方法下面还有让我们参见toLocaleString方法,点进去,这个方法又过时了,从 JDK 1.1 开始,由 DateFormat.format(Date date) 取代。 既然这个方法被DateFormat.format(Date date) 取代,那么就要去查阅DateFormat类。 2.2 Date类常用方法
file:///C:\Users\LP\AppData\Local\Temp\ksohtml\wpsA440.tmp.jpg l 把日期对象转换成对应的时间毫秒值 第3章 DateFormat3.1 DateFormat类概述DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat类)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。 我们通过这个类可以帮我们完成日期和文本之间的转换。 继续阅读API,DateFormat 可帮助进行格式化并解析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳历),其代码可完全与语言环境的约定无关。 3.2 日期格式要格式化一个当前语言环境下的日期也就是日期 -> 文本),要通过下面的方法来完成。DateFormat是抽象类,我们需要使用其子类SimpleDateFormat来创建对象。 l 构造方法 file:///C:\Users\LP\AppData\Local\Temp\ksohtml\wpsA441.tmp.jpg l DateFormat类方法 file:///C:\Users\LP\AppData\Local\Temp\ksohtml\wpsA452.tmp.jpg 代码演示: //创建日期格式化对象,在获取格式化对象时可以指定风格 DateFormat df= new SimpleDateFormat("yyyy-MM-dd");//对日期进行格式化 Date date = new Date(1607616000000L); String str_time = df.format(date); System.out.println(str_time);//2020年12月11日 l DateFormat类的作用:即可以将一个Date对象转换为一个符合指定格式的字符串,也可以将一个符合指定格式的字符串转为一个Date对象。 指定格式的具体规则我们可参照SimpleDateFormat类的说明,这里做简单介绍,规则是在一个字符串中,会将以下字母替换成对应时间组成部分,剩余内容原样输出: l 当出现y时,会将y替换成年 l 当出现M时,会将M替换成月 l 当出现d时,会将d替换成日 l 当出现H时,会将H替换成时 l 当出现m时,会将m替换成分 l 当出现s时,会将s替换成秒 3.3 DateFormat类常用方法
file:///C:\Users\LP\AppData\Local\Temp\ksohtml\wpsA453.tmp.jpg l format方法,用来将Date对象转换成String l parse方法,用来将String转换成Date(转换时,该String要符合指定格式,否则不能转换)。 代码演示: 练习一:把Date对象转换成String Date date = new Date(1607616000000L);//Fri Dec 11 00:00:00 CST 2020 DateFormat df = new SimpleDateFormat(“yyyy年MM月dd日”); String str = df.format(date); //str中的内容为2020年12月11日
练习二:把String转换成Date对象 String str = ”2020年12月11日”; DateFormat df = new SimpleDateFormat(“yyyy年MM月dd日”); Date date = df.parse( str ); //Date对象中的内容为Fri Dec 11 00:00:00 CST 2020 第4章 Calendar4.1 Calendar类概念Calendar是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。 Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,将语言敏感内容处理好,再返回子类对象,如下: l Calendar类静态方法 file:///C:\Users\LP\AppData\Local\Temp\ksohtml\wpsA454.tmp.jpg Calendar c = Calendar.getInstance(); //返回当前时间
4.2 Calendar类常用方法
file:///C:\Users\LP\AppData\Local\Temp\ksohtml\wpsA455.tmp.jpg l public static Calendar getInstance() //获取日期对象 l public int get(int field) //获取时间字段值,字段参见帮助文档 l YEAR 年 l MONTH 月,从0开始算起,最大11;0代表1月,11代表12月。 l DATE 天 l HOUR 时 l MINUTE分 l SECOND秒 代码演示: Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR);
l public void add(int field,int amount) //指定字段增加某值 代码演示: Calendar c = Calendar.getInstance(); //修改当前时间为3天后 c.add(Calendar.DATE, 3); //修改当前时间为5小时后 c.add(Calendar.HOUR, 5);
l public final void set(int field,int value)//设置指定字段的值 代码演示: Calendar c = Calendar.getInstance(); //设置时间为2020年5月20日 c.set(Calendar.YEAR, 2020); c.set(Calendar.MONTH, 4); c.set(Calendar.DATE, 20);
l public final Date getTime() //获取该日历对象转成的日期对象 代码演示: Calendar c = Calendar.getInstance(); Date d = c.getTime(); 4.3 注意事项西方星期的开始为周日,中国为周一。 在Calendar类中,月份的表示是以0-11代表1-12月。 日期是有大小关系的,时间靠后,时间越大。 第5章 日期相关类练习5.1 求出自己已经出生多少天思路: 1.获取当前时间对应的天数 2.获取自己出生日期对应的天数 3.两个时间相减(当前时间天数 – 出生日期天数) 代码实现: public static void main(String[] args){ Calendar my = Calendar.getInstance(); Calendar c = Calendar.getInstance(); //设置出生年月日 1995-05-10 my.set(Calendar.YEAR, 1995); my.set(Calendar.MONTH, 4); my.set(Calendar.DATE, 10); //获取时间中的天数 int day = c.get(Calendar.DATE); int myDay = my.get(Calendar.DATE); System.out.println(day - myDay); } 5.2 求出今天距离2020年1月1日还有多少天思路: 1.获取当前时间对应的天数 2.获取2020年1月1日对应的天数 3.两个时间相减(2020年1月1日的天数 –当前时间天数) 代码实现: public static void main(String[] args){ Calendar my = Calendar.getInstance(); Calendar c = Calendar.getInstance(); //设置年月日 2020-01-01 my.set(Calendar.YEAR, 2020); my.set(Calendar.MONTH, 0); my.set(Calendar.DATE, 1); //获取时间中的天数 int day = c.get(Calendar.DATE); int myDay = my.get(Calendar.DATE); System.out.println(myDay - day); }
第6章 总结6.1 知识点总结l 正则表达式:用来定义匹配规则,匹配一系列符合某个句法规则的字符串。 正则表达式的匹配规则 请参见1.2 正则表达式的匹配规则 正则表达式的常用方法: public boolean matches(String regex) //判断字符串是否匹配给定的规则 public String[] split(String regex) //根据给定正则表达式的匹配规则,拆分此字符串 public String replaceAll(String regex,String replacement) //将符合规则的字符串内容,全部替换为新字符串
l Date: 日期/时间类 构造方法: public Date()// 系统当前日期时间 public Date(long date) 得到一个1970年1月1日 0点这个时间基础上,加上参数date 毫秒值对应的日期时间 方法: public long getTime() 获取日期所对应的毫秒值
l DateFormat:是日期/时间格式化子类的抽象类, 使用其子类SimpleDateFormat 实例化 构造方法: public SimpleDateFormat() 默认的格式化操作 public SimpleDateFormat(String pattern) 按照指定的格式,进行日期格式化 日期和时间模式 y 年 M 年中的月份 d 月份中的天数 H 一天中的小时数(0-23) m 小时中的分钟数 s 分钟中的秒数 S 毫秒数 方法: public final String format(Date date) 把日期 格式化成字符串 public Date parse(String source) 把日期字符串 转换成 日期对象
l Calendar:日历类,可获取日期中指定字段的值 方法: public static Calendar getInstance() //获取日期对象 public int get(int field) //获取时间字段值 public void add(int field,int amount) //指定字段增加某值 public final void set(int field,int value)//设置指定字段的值 public final Date getTime() //获取该日历对象转成的日期对象
|