当前位置: 首页 > news >正文

学习笔记——《Java面向对象程序设计》-常用实用类

参考教材:

Java面向对象程序设计(第3版)微课视频版 清华大学出版社

1、String类

java.lang包中的String类为final类,因此用户不能扩展String类,即String类不能有子类。

(1)构造String对象

String常量:用双引号括起来的字符序列,例如"hello"、"12.97"等。

String对象(变量)

String s;
s = new String("We are Student");
//s中存放着引用,s的实体是字符序列:We are Student

String常量也是对象,Java把用户程序的String常量放入常量池。String常量也有自己的引用和实体。

String s1,s2;
//s1 s2对象的实体相同,都为"student"
s1="student";
s2="student";
public class Test {public static void main(String[] args) {String s;s=new String("student");//显式通过new在堆内存中创建了一个新的String对象//s1 = "student"; 和 s2 = "student"; 是通过字面量赋值。Java会将字符串字面量存储在字符串常量池中。当直接使用字面量时,JVM会从池中复用已有的对象(若存在),因此 s1 和 s2 指向同一个对象,s1 == s2 为 true。   s1和s2具有相同的引用,因此具有相同的实体。String s1,s2;s1="student";s2="student";//== 比较的是对象的引用(内存地址)是否相同System.out.println(s == s1);System.out.println(s2 == s1);System.out.println(s); //等效于s.toString()}
}/*执行结果:falsetruestudent
*/

2、String类常用方法

(1)public boolean equals(String s)

 String对象调用equals(String s)方法,比较当前String对象的字符序列是否与参数s指定的String对象的字符序列相同。

public class Test {public static void main(String[] args) {String tom = new String("We are students");String boy = new String("You are students");String jerry = new String("We are students");System.out.println(tom.equals(boy));System.out.println(tom.equals(jerry));		}
}/*falsetrue
*/

在程序中可以通过“==”和equals()两种方式对字符串进行比较,但这两种方式有明显的区别。equals()方法用于比较两个字符串中的字符序列是否相等;==用于比较两个字符串对象的地址是否相同。

String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2);  // 结果为false,因为str1和str2是两个对象,地址不同
System.out.println(str1.equals(str2)); // 结果为true,因为str1和str2字符序列内容相同

(2)public int indexOf(String s)

String对象调用方法indexOf(String s),从当前String对象的字符串索引位置0开始检索,并返回首次出现s的字符序列的位置,若没有检索到,则返回值-1。

(3)int lastIndexOf(String str)

返回指定子字符串str在此字符串中最后一次出现位置的索引

(4)int length()

返回此字符串的长度

(5)char charAt(int index)

返回字符串中index位置上的字符,其中index的取值范围是0~(字符串长度-1)

public class Example02 {public static void main(String[] args) {String s = "ababcdedcba"; // 定义字符串s// 获取字符串长度,即字符个数System.out.println("字符串的长度为:" + s.length());System.out.println("字符串中第一个字符:" + s.charAt(0));System.out.println("字符c第一次出现的位置:" + s.indexOf('c'));System.out.println("字符c最后一次出现的位置:" + s.lastIndexOf('c'));System.out.println("子字符串ab第一次出现的位置:" + s.indexOf("ab"));System.out.println("子字符串ab字符串最后一次出现的位置:" + s.lastIndexOf("ab"));}
}/*字符串的长度为:11字符串中第一个字符:a字符c第一次出现的位置:4字符c最后一次出现的位置:8子字符串ab第一次出现的位置:0子字符串ab字符串最后一次出现的位置:2
*/

(6)char[] toCharArray()

将此字符串转换为一个字符数组

(7)static String valueOf(int i)

将int变量i转换成字符串

(8)String toLowerCase()

使用默认语言环境的规则将String中的所有字符都转换为小写

(9)String toUpperCase()

使用默认语言环境的规则将String中的所有字符都转换为大写

public class Example03 {public static void main(String[] args) {String str = "abcd";System.out.print("将字符串转为字符数组后的结果:");char[] charArray = str.toCharArray(); // 字符串转换为字符数组for (int i = 0; i < charArray.length; i++) {if (i != charArray.length - 1) {System.out.print(charArray[i] + ",");} else {			System.out.println(charArray[i]);}}System.out.println("将int值转换为String类型之后的结果:" + String.valueOf(12));System.out.println("将字符串转换成大写之后的结果:" + str.toUpperCase());System.out.println("将字符串转换成小写之后的结果:" + str.toLowerCase());}
}/*将字符串转为字符数组后的结果:a,b,c,d将int值转换为String类型之后的结果:12将字符串转换成大写之后的结果:ABCD将字符串转换成小写之后的结果:abcd
*/

(10)String replace(CharSequence oldstr, CharSequence newstr)

返回一个新的字符串,它是通过用 newstr替换此字符串中出现的所有oldstr得到的

(11)String trim()

返回一个新字符串,去除了原字符串首尾的空格。

trim()方法只能去除两端的空格,不能去除中间的空格。若想去除字符串中间的空格,需要调用String类的replace()方法。

public class Example04 {public static void main(String[] args) {String s = "itcast";// 字符串替换操作System.out.println("将it替换成cn.it的结果:" + s.replace("it", "cn.it"));// 字符串去除空格操作String s1 = "     i t c a s t     ";System.out.println("去除字符串两端空格后的结果:" + s1.trim());System.out.println("去除字符串中所有空格后的结果:" + s1.replace(" ", ""));}
}/*将it替换成cn.it的结果:cn.itcast去除字符串两端空格后的结果:i t c a s t去除字符串中所有空格后的结果:itcast
*/

(12)boolean startsWith(String s)

判断字符串是否以指定的字符串开始

(13)boolean endWith(String s)

判断字符串是否以指定的字符串结束

(14)boolean contains(String s)

判断字符串是否包含指定字符串s

(15)boolean isEmpty()

判断字符串是否为空

public class Example05 {public static void main(String[] args) {String s1 = "String"; String s2 = "Str";System.out.println("判断是否以字符串Str开头:" + s1.startsWith("Str"));System.out.println("判断是否以字符串ng结尾:" + s1.endsWith("ng"));System.out.println("判断是否包含字符串tri:" + s1.contains("tri"));System.out.println("判断字符串是否为空:" + s1.isEmpty());System.out.println("判断两个字符串是否相等" + s1.equals(s2));}
}/*判断是否以字符串Str开头:true判断是否以字符串ng结尾:true判断是否包含字符串tri:true判断字符串是否为空:false判断两个字符串是否相等false
*/

(16)substring()和split()

substring()方法用于截取字符串的一部分,split()方法用于将字符串按照某个字符进行分割。

public class Example06 {public static void main(String[] args) {String str = "石家庄-武汉-哈尔滨";System.out.println("从第5个字符截取到末尾的结果:" + str.substring(4));System.out.println("从第5个字符截取到第6个字符的结果:" + str.substring(4, 6));System.out.print("分割后的字符串数组中的元素依次为:");String[] strArray = str.split("-"); //将字符串转换为字符串数组for (int i = 0; i < strArray.length; i++) {if (i != strArray.length - 1) {System.out.print(strArray[i] + ",");} else {System.out.println(strArray[i]);}}}
}/*从第5个字符截取到末尾的结果:武汉-哈尔滨从第5个字符截取到第6个字符的结果:武汉分割后的字符串数组中的元素依次为:石家庄,武汉,哈尔滨
*/

3、正则表达式与元字符

(1)正则表达式

正则表达式:一个正则表达式是含有一些具有特殊意义字符的字符序列。这些特殊字符称作正则表达式中的元字符。

例如,"\\dhello"中的\\d就是具有特殊意义的元字符,代表0到9中的任何一个。因此,"9hello"、"3hello"都是和正则表达式:\\dhello匹配的字符序列之一。

(2)String对象调用

public boolean matches(String regex)方法可以判断当前String对象的字符序列是否和参数regex指定的正则表达式相匹配。(简称:String对象的字符序列和regex相匹配)

public class Test {public static void main(String[] args) {String regex = "\\dhello";String str = "8hello";System.out.println(str.matches(regex));	//true}
}

(3)元字符

方括号与元字符:在正则表达式中可以用方括号括起若干字符来表示一个元字符,该元字符代表方括号中的任何一个字符。

例如:String regex = "[159]ABC",那么"1ABC"、"5ABC"和"9ABC"都和regex相匹配。

[abc]:代表a、b、c中的任何一个

[^abc]:代表除了a、b、c以外的任何字符

[a-zA-Z]:代表英文字母中的任何一个

[a-d]:代表a至d中的任何一个

限定符

/*X?  X出现0次或1次X*   X出现0次或多次X+   X出现1次或多次X{n} X恰好出现n次X{n,} X至少出现n次X{n,m} X出现n次至m次XY   X的后缀是YX|Y   X或Y
*/public class Test {public static void main(String[] args) {String regex = "[0-9]?hello";  //0~9中的任何一个数字出现0次或1次System.out.println("8hello".matches(regex)); //true 出现1次System.out.println("hello".matches(regex));  //true 出现0次System.out.println("123hello".matches(regex));  //flaseString regex1 = "[0-9]*hello";//0~9中的任何一个数字出现0次或多次System.out.println("hello".matches(regex1)); //trueSystem.out.println("789120hello".matches(regex1)); //true}
}

(4)常用的正则表达式

/*-?     负号出现一次或零次[1-9]  1~9之间的数字必须出现一次\\d+   任何一次数字出现一次以上
*/
String regex = "-?[1-9]\\d+"; //整数
/*-?     负号出现一次或零次[0-9]  0~9之间的数字必须出现一次[0-9]* 0~9之间的数字出现零次或多次[.]    小数点(也可以写成 \\.)[0-9]+  0~9之间的数字出现一次以上
*/
String regex = "-?[0-9][0-9]*[.][0-9]+" ;   //浮点数
/*\\w+    单词字符:[a-zA-Z_0-9]出现一次以上\\.     小数点(也可以写成[.])[a-z]+   a~z之间的任意字母出现一次以上(\\.[a-z]+)?    (小数点 a~z出现一次以上)出现一次或零次
*/
String regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?";   //email
/*[1-9]            1~9间的数字出现一次[0-9]{16}        0~9之间的数字恰好出现16次a-zA-Z0-9]{1}    a~z或A~Z或0~9恰好出现一次
*/
String regex = "[1-9][0-9]{16}[a-zA-Z0-9]{1}";   //18位身份证号码
/* year     四位,第一位不能是0month   (0可以不出现,1~9出现一次)或者(1出现一次,0或1或2出现一次)day     (0可以不出现,1~9出现一次)或(1或2出现一次,0~9出现一次)或(3出现一次,0或1至少出现一次)[-./]    -或.或/      
*/
String year = "[1-9][0-9]{3}";
String month = "((0?[1-9])|(1[012]))";
String day = "((0?[1-9])|([12][0-9])|(3[01]?))";
String regex = year+"[-./]"+month+"[-./]"+day;   //日期,不考虑二月份特殊情况

4、字符序列的替换与分解

(1)String replaceAll(String regex, String replacement)

方法返回一个新的String对象,返回对象的字符序列是把当前String对象字符序列中,所有和参数regex相匹配的字符序列都替换成replacement制定的字符序列。

(2)String[] split(String regex)

String对象调用该方法时,使用参数指定的正则表达式regex做为分割标记,分解出String对象的字符序列中的单词,并将分解出的单词放到String数组中。

public class Example08{public static void main(String[] args) {String str = "A1B22DDS34DSJ9D".replaceAll("\\d+","_");System.out.println("字符替换后为:"+str);boolean te = "321123as1".matches("\\d+");System.out.println("字符串是否匹配:"+te);String s [] ="SDS45d4DD4dDS88D".split("\\d+");System.out.print("字符串拆分后为:");for(int i=0;i<s.length;i++){System.out.print(s[i]+"  ");}}
}/*字符替换后为:A_B_DDS_DSJ_D字符串是否匹配:false字符串拆分后为:SDS  d  DD  dDS  D  
*/

5、StringTokenizer类

java.util包中的StringTokenizer类的对象可分解字符序列。

StringTokenizer对象不使用正则表达式做分隔标记。该类有2个构造方法:

(1)StringTokenizer(String s):构造一个StringTokeizer对象,比如fenxi。fenxi使用默认的分隔标记(空格符、换行符、回车符、Tab符、进纸符)分解出参数s的字符序列中的单词,即这些单词成为fenxi中的数据。

(2)StringTokenizer(String s, String delim):构造一个StringTokeizer对象,比如fenxi,fenxi用参数dilim的字符序列中的字符的任意排列作为分隔标记,分解出参数s的字符序列中的单词,即这些单词成为fenxi中的数据。

注意:分隔标记的任意组合仍然是分隔标记。

StringTokenizer类常用方法

(1)String nextToken()

fenxi调用String nextToken()方法逐个获取fenxi中的单词,每当nextToken()返回一个单词(即一个String对象,该String对象的字符序列是单词),fenxi就自动删除该单词。

(2)boolean hasMoreToken()

fenxi调用boolean hasMoreToken()方法可以放回一个boolean值,只要fenxi中还有单词,就返回true,否则返回false。

(3)int countTokens()

fenxi调用countTokens()方法可以返回当前fenxi中单词的个数

public class Example11 {public static void main(String[] args) {String s = "we are stud,ents";//用空格和逗号的任意组合做为分隔标记StringTokenizer fenxi = new StringTokenizer(s," ,");int num = fenxi.countTokens();System.out.println("当前字符串中单词个数为:"+num);while(fenxi.hasMoreTokens()){String str = fenxi.nextToken();System.out.println(str);System.out.println("还剩"+fenxi.countTokens()+"个单词");		}System.out.println("s共有单词:"+num+"个");}
}/*当前字符串中单词个数为:4we还剩3个单词are还剩2个单词stud还剩1个单词ents还剩0个单词s共有单词:4个
*/

6、Scanner类

使用Scanner类的对象从字符序列中解析程序所需要的数据。例如,String s = "telephone cost 876 dollar.Computer cost 2398.89 dollar.";

Scanner scanner = new Scanner(s);

scanner 默认使用空格做为分隔标记来解析s的字符序列中的单词。也可以让scanner对象调用方法:scanner .useDelimiter(正则表达式)将正则表达式做为分隔标记。

特点如下:

(1)scanner对象调用next()方法依次返回s的字符序列中的单词,如果最后一个单词已经被next()返回,scanner调用hasNext()将返回flase。

(2)对于s的字符序列中的数字型单词,比如876,329.24等,scanner可以用nextInt()或nextDouble()来代替next()方法,即scanner对象可以调用nextInt()或nextDouble()方法将数字型单词转化为int或double数据返回。

(3)若单词不是数字型单词,则不能调用nextInt()或nextDouble()方法,否则会发生InputMismatchException异常。

public class Example12 {public static void main(String[] args) {String cost = "话费清单:市话费76.89元,长途话费167.38元,短信费12.68元。";Scanner scanner = new Scanner(cost);scanner.useDelimiter("[^0123456789.]+");//设置分隔标记double sum = 0;while(scanner.hasNext()){try {double price = scanner.nextDouble();sum = sum + price;System.out.println(price);}catch(InputMismatchException e) {String t = scanner.next();System.out.println(t);}}System.out.println("总费用:"+sum+"元"); scanner.close();}
}/*76.89167.3812.68总费用:256.95元
*/

StringTokenizer类和Scanner类的区别

(1)StringTokenizer类把分解出的全部单词都存放到StringTokenizer对象的实体中,因此,StringTokenizer对象能较快速度地获得单词,即StringTokenizer对象的实体占用较多的内存。(多占内存空间提升速度,相当于生活中把单词记忆在大脑中)

(2)Scanner类不把单词存放到Scanner对象中,而是仅仅存放怎样获取单词的分隔标记,因此Scanner对象获得单词的速度较慢,但Scanner对象节省内存空间(减慢速度节省内存空间,相当于生活中把单词放到字典里,大脑只记忆查字典的规则)

(3)如果字符序列存放在磁盘中,并且形成的文件比较大,那么用Scanner对象分解字符序列中的单词就可以节省内存。

7、Pattern类和Matcher类(java.util.regex包)

Match类的对象直接检索出和Pattern类的对象匹配的String对象,因此,在某些应用中,Match和Pattern类更容易解决某些检索问题。

常用方法

(1)boolean find()

matcher依次调用该方法,检索input的字符序列中和regex匹配的子字符序列

(2)int start()、end()

检索匹配到的初始位置和结束位置

(3)String group()

返回String对象,其中的字符序列为input中满足regex的子字符序列、

public class Test {public static void main(String[] args) {String input = "悟空的电子邮箱是sunwukong@163.com,八戒的email是bajie@sina.com.cn";//使用正则表达式regex做参数得到一个称为模式的Pattern类的实例patternString regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?";Pattern pattern = Pattern.compile(regex); //封装正则表达式//得到可用于检索input的Matcher类的实例matcher(称为匹配对象)Matcher matcher = pattern.matcher(input);while(matcher.find()) {int startN = matcher.start();int endN = matcher.end();String str = matcher.group();System.out.printf("%d,%d:%s\n",startN,endN,str);}}
}/*8,25:sunwukong@163.com35,52:bajie@sina.com.cn
*/
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example10 {public static void main(String[] args) {Pattern p=Pattern.compile("\\d+");Matcher m=p.matcher("22bb23");System.out.println("字符串是否匹配:"+ m.matches());  Matcher m2=p.matcher("2223");System.out.println("字符串是否匹配:"+ m2.matches());System.out.println("对前面的字符串匹配结果为"+ m.lookingAt());Matcher m3=p.matcher("aa2223");System.out.println("对前面的字符串匹配结果为:"+m3.lookingAt());m.find();//返回trueSystem.out.println("字符串任何位置是否匹配:"+ m.find());m3.find();//返回trueSystem.out.println("字符串任何位置是否匹配:"+ m3.find());Matcher m4=p.matcher("aabb");System.out.println("字符串任何位置是否匹配:"+ m4.find());Matcher m1=p.matcher("aaa2223bb");m1.find();//匹配2223System.out.println("上一个匹配的起始索引::"+  m1.start());System.out.println("最后一个字符匹配后的偏移量"+  m1.end());System.out.println("匹配到的子字符串:"+  m1.group());}
}/*字符串是否匹配:false字符串是否匹配:true对前面的字符串匹配结果为true对前面的字符串匹配结果为:false字符串任何位置是否匹配:false字符串任何位置是否匹配:false字符串任何位置是否匹配:false上一个匹配的起始索引::3最后一个字符匹配后的偏移量7匹配到的子字符串:2223
*/

8、StringBuffer类

前面学习的String类是final类,而且String类不提供修改字符序列的方法,即String对象不能修改、删除或替换字符序列中的某个字符。String对象一旦创建,那么实体不会再发生变化,称这样的对象为“不可变对象”。

StringBuffer类对象的实体内存空间可以自动的改变大小,便于存放一个可变的字符序列。

如StringBuffer buffer = new StringBuffer ("我喜欢学习");

buffer.append("数学");

StringBuffer类常用方法

(1)StringBuffer insert(int index,String str)

将参数str指定的字符序列插入到参数index指定的位置,并返回当前对象的引用

(2)StringBuffer reverse()

reverse()方法将该对象实体中的字符翻转,并返回当前对象的引用。

(3)StringBuffer delete(int startIndex,int endIndex)

删除StringBuffer对象中指定范围的字符或字符串序列

(4)StringBuffer replace(int startIndex,int endIndex,String str)

将当前StringBuffer 对象的startIndex到endIndex-1的字符序列替换成参数str指定的字符序列,并返回当前StringBuffer 对象的引用。

(5)void setCharAt(int index, char ch)

修改指定位置index处的字符序列

public class Example01 {public static void main(String[] args) {System.out.println("1、添加------------------------");add();System.out.println("2、删除------------------------");remove();System.out.println("3、修改------------------------");alter();}public static void add() {StringBuffer sb = new StringBuffer(); // 定义一个字符串缓冲区sb.append("abcdefg"); // 在末尾添加字符串System.out.println("append添加结果:" + sb);sb.insert(2, "123"); // 在指定位置插入字符串System.out.println("insert添加结果:" + sb);}public static void remove() {StringBuffer sb = new StringBuffer("abcdefg");sb.delete(1, 5); // 指定范围删除System.out.println("删除指定位置结果:" + sb);sb.deleteCharAt(2); // 指定位置删除System.out.println("删除指定位置结果:" + sb);sb.delete(0, sb.length()); // 清空缓冲区System.out.println("清空缓冲区结果:" + sb);}public static void alter() {StringBuffer sb = new StringBuffer("abcdef");sb.setCharAt(1, 'p'); // 修改指定位置字符System.out.println("修改指定位置字符结果:" + sb);sb.replace(1, 3, "qq"); // 替换指定位置字符串或字符System.out.println("替换指定位置字符(串)结果:" + sb);System.out.println("字符串翻转结果:" + sb.reverse());}
}/*1、添加------------------------append添加结果:abcdefginsert添加结果:ab123cdefg2、删除------------------------删除指定位置结果:afg删除指定位置结果:af清空缓冲区结果:3、修改------------------------修改指定位置字符结果:apcdef替换指定位置字符(串)结果:aqqdef字符串翻转结果:fedqqa
*/

9、StringBiuld类

StringBuilder类也可以对字符串进行修改,StringBuffer类和StringBuilder类的对象都可以被多次修改,并不产生新的未使用对象,StringBuilder类是JDK5中新加的类,它与StringBuffer之间最大不同在于StringBuilder的方法是线程安全的,也就是说StringBuffer不能被同步访问,而StringBuilder可以。

StringBuilder类和StringBuffer类、String类有很多相似之处,初学者在使用时很容易混淆。简单归纳一下三者的不同。

(1)String类表示的字符串是常量,一旦创建后,内容和长度都是无法改变的。而StringBuilder和StringBuffer表示字符容器,其内容和长度可以随时修改。在操作字符串时,如果该字符串仅用于表示数据类型,则使用String类即可,但是如果需要对字符串中的字符进行增删操作,则使用StringBuffer与StringBuilder类。如果有大量字符串拼接操作,不要求线程安全的情况下,采用StringBuilder更高效。相反如果需要线程安全则需要使用StringBuffer。

(2)对于euals()方法的使用我们已经有所了解,但是在StringBuffer类与StringBuilder类中并没有被Object类的equals()方法覆盖,也就是说,equals()方法对于StringBuffer类与StringBuilder类来言并不起作用。

(3)String类对象可以用操作符“+”进行连接,而StringBuffer类对象之间不能。

public class Example12_2{private static final int TIMES = 100000;public static void main(String[] args) {Example12_2.testString();Example12_2.testStringBuffer();Example12_2.testStringBuilder();}//String时间效率测试public static void testString() {long startTime = System.currentTimeMillis();String str = "";for (int i = 0; i < TIMES; i++) {str += "test";}long endTime = System.currentTimeMillis();System.out.println("String test usedtime: " + (endTime - startTime));}//StringBuffer时间效率测试(线程安全)public static void testStringBuffer() {long startTime = System.currentTimeMillis();StringBuffer str = new StringBuffer();for (int i = 0; i < TIMES; i++) {str.append("test");}long endTime = System.currentTimeMillis();System.out.println("StringBuffer test usedtime:  " + (endTime-startTime));}//StringBuffer时间效率测试(非线程安全)public static void testStringBuilder() {long startTime = System.currentTimeMillis();StringBuilder str = new StringBuilder();for (int i = 0; i < TIMES; i++) {str.append("test");}long endTime = System.currentTimeMillis();System.out.println("StringBuilder test usedtime: " + (endTime-startTime));}
}/*String test usedtime: 12726StringBuffer test usedtime:  5StringBuilder test usedtime: 2
*/

10、日期与时间

Java SE 8开始,提供java.time包,该包中有专门处理日期和时间的类,而早起的java.util包中的Data类成为过期的API。

LocalData,LocalDataTime和LocalTime类的对象封装了和日期、时间有关的数据(如年月日、时分秒、纳秒和星期等),这三个类都是final类,而且不提供修改数据的方法,即这些类的对象的实体是不可再发生变换,属于不可变对象(和String类似)

(1)LocalData类

LocalData类仅用来表示日期。通常表示的是年份和月份,该类不能代表时间线上的即时信息,只是日期的描述。在LocalData类中提供了两个获取日期对象的方法now()和of(int year, int month, int dayOfMonth)

LocalData还提供了日期格式化、增减年月日等一系列的常用方法。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;public class Example12_3 {public static void main(String[] args) {//获取日期时分秒LocalDate now = LocalDate.now();System.out.println("LocalData的获取及格式化的相关方法--------");//getYear()获取年份字段System.out.println("从LocalData实例获取的年份为:"+now.getYear());//getMonthValue()获取月份字段的值System.out.println("从LocalData实例获取的月份:"+now.getMonthValue());//getDayOfMonth()获取当月第几天System.out.println("从LocalData实例获取当天在本月的第几天:"+now.getDayOfMonth());//format()使用指定的格式化程序格式化此日期System.out.println("将获取到的Loacaldata实例格式化为:"+now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));System.out.println("LocalData判断的相关方法----------------");LocalDate of = LocalDate.of(2025, 5, 2);System.out.println("判断日期of是否在now之前:"+of.isBefore(now));System.out.println("判断日期of是否在now之后:"+of.isAfter(now));System.out.println("判断日期of和now是否相等:"+now.equals(of));System.out.println("判断日期of是否时闰年:"+ of.isLeapYear());System.out.println("LocalData解析以及加减操作的相关方法---------");String dateStr="2020-02-01";System.out.println("把日期字符串解析成日期对象后为"+LocalDate.parse(dateStr));System.out.println("将LocalData实例年份加1为:"+now.plusYears(1));System.out.println("将LocalData实例天数减10为:"+now.minusDays(10));System.out.println("将LocalData实例指定年份为2014:"+now.withYear(2014));}
}/*LocalData的获取及格式化的相关方法--------从LocalData实例获取的年份为:2025从LocalData实例获取的月份:4从LocalData实例获取当天在本月的第几天:30将获取到的Loacaldata实例格式化为:2025年04月30日LocalData判断的相关方法----------------判断日期of是否在now之前:false判断日期of是否在now之后:true判断日期of和now是否相等:false判断日期of是否时闰年:falseLocalData解析以及加减操作的相关方法---------把日期字符串解析成日期对象后为2020-02-01将LocalData实例年份加1为:2026-04-30将LocalData实例天数减10为:2025-04-20将LocalData实例指定年份为2014:2014-04-30
*/

(2)LocalTime类与LocalDataTime类

LocalTime类用来表示时间,通常表示的是小时分钟秒。与LocalData类一样,该类不能代表时间线上的即时信息,只是时间的描述。在LocalTime类中提供了获取时间对象的方法,与LocalData用法类似。 同时LocalTime类也提供了与日期类相对应的时间格式化、增减时分秒等常用方法,这些方法与日期类相对应。

public class Example12_4 {public static void main(String[] args) {LocalTime time = LocalTime.now();LocalTime of = LocalTime.of(9,23,23);System.out.println("从LocalTime获取的小时为:"+time.getHour());System.out.println("将获取到的LoacalTime实例格式化为:"+time.format(DateTimeFormatter.ofPattern(" HH:mm:ss")));System.out.println("判断时间of是否在now之前:"+of.isBefore(time));System.out.println("将时间字符串解析为时间对象后为:"+ LocalTime.parse("12:15:30"));System.out.println("从LocalTime获取当前时间,不包含毫秒数:"+time.withNano(0));}
}/*从LocalTime获取的小时为:9将获取到的LoacalTime实例格式化为: 09:43:09判断时间of是否在now之前:true将时间字符串解析为时间对象后为:12:15:30从LocalTime获取当前时间,不包含毫秒数:09:43:09
*/

LocalDataTime类是LocalData类与LocalTime类的综合,它即包含日期也包含时间。LocalDataTime类中的方法包含了LocalData类与LocalTime类的方法。

LocalDateTime默认的格式是 2020-02-29T21:23:26.774,经常和DateTimeFormatter一起使用指定格式,除了LocalData与LocalTime类中的方法,额外提供了转换的方法。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class Example12_5 {public static void main(String[] args) {//获取当前年月日,时分秒LocalDateTime now = LocalDateTime.now();System.out.println("获取的当前日期时间为:"+now);System.out.println("将目标LocalDateTime转换为相应的LocalDate实例:"+ now.toLocalDate());System.out.println("将目标LocalDateTime转换为相应的LocalTime实例:"+ now.toLocalTime());//指定格式DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");System.out.println("格式化后的日期时间为:"+now.format(ofPattern));}
}/*获取的当前日期时间为:2025-04-30T09:46:34.854将目标LocalDateTime转换为相应的LocalDate实例:2025-04-30将目标LocalDateTime转换为相应的LocalTime实例:09:46:34.854格式化后的日期时间为:2025年04月30日 09时46分34秒
*/

11、Math类、Biginteger类、Random类

(1)Math类提供了很多静态方法,如计算一个数的平方根、绝对值、获取一个随机数等等。java.lang包中的Math类包含许多用来进行科学计算的类方法,这些方法可以直接通过类名调用。

(2)处理任意大的整数,java.math包中的BigInteger类提供任意精度的整数运算。

(3)Java的java.util包中有一个Random类,它可以在指定的取值范围内随机产生数字。Random类中提供了两个构造方法。

Random():构造方法,用于创建一个伪随机数生成器。用当前计算机的时间做种子。

Random(long seed):构造方法,使用一个long型的seed参数种子创建伪随机数生成器。

import java.util.Random;public class Example12_6 {public static void main(String[] args) {Random r = new Random();//当前计算机的时间做种子int x = r.nextInt();//返回一个整数System.out.println(x);//若想返回一个[0,m)的随机数,可调用nextInt(m)方法,参数m必须为正整数值x = r.nextInt(100);System.out.println(x);//注意:对于具有相同种子的两个Random对象,二者依次调用nextInt()方法获取的随机数序列相同}	
}/*-191817004517
*/

相关文章:

  • 复刻低成本机械臂 SO-ARM100 材料齐活篇
  • 欧拉计划 Project Euler61(循环的多边形数)题解
  • Java中的多态与继承
  • 共筑数字经济新生态 共绘数字中国新蓝图 ——思特奇受邀出席2025年第八届数字中国建设峰会
  • 动画震动效果
  • Java 未来技术栈:从云原生到 AI 融合的企业级技术演进路线
  • PCB设计工艺规范(四)安规要求
  • 1254. 【动态规划】单词的划分
  • 动态规划 -- 子数组问题
  • Java大师成长计划之第8天:Java线程基础
  • 农产品园区展示系统——仙盟创梦IDE开发
  • Kotlin与Jetpack Compose的详细使用指南
  • React 第三十六节 Router 中 useParams 的具体使用及详细介绍
  • 力扣hot100——98.验证二叉搜索树
  • Python 数据智能实战 (4):智能用户分群 - 融合行为
  • libevent详解
  • Kubernetes Service 详解
  • 《Ultralytics HUB:开启AI视觉新时代的密钥》
  • 复杂度和顺序表(双指针方法)
  • HOW - 经典详情页表单内容数据填充(基于 Antd 组件库)
  • “网约摩托”在部分县城上线:起步价五六元,专家建议纳入监管
  • 来上海喝云南咖啡!上海国际咖啡文化节助力咖啡产业破圈出海
  • 三大猪企一季度同比均实现扭亏为盈,营收同比均实现增长
  • 工业富联一季度净利增长25%,云计算业务营收增长超50%
  • 上海市十六届人大常委会第二十一次会议表决通过有关人事任免事项
  • 今年一季度全国城镇新增就业308万人,就业形势保持总体稳定