掌握JAVA常用类,包括Scanner类,System类,String类,Arrays类,Integer类,Long类,Short类,Boolean类,Byte类,Character类,Double类,Float类,DecimalFormat类,Math类,Random类,BigInteger类,BigDecimal类
有言在先:(Scanner类,Integer类,Long类,Short类,Boolean类,Byte类,Character类,Double类),Float类这部分在一开始学习Java时已经有了了解,在此就不多进行赘述
一、字符串常用类
1.String类及其常用方法
String类
- String :字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
- String是一个final类,代表着不可变的字符序列。
- 字符串是常量,字符内容存储在一个字符数组value[ ]中。
String str = "java";
- 字符串的创建存储在公共池中,而不是new 创建的字符串对象在堆上。
String s1 = "Runoob"; // String 直接创建
String s2 = "Runoob"; // String 直接创建
String s3 = s1; // 相同引用
String s4 = new String("Runoob"); // String 对象创建
String s5 = new String("Runoob"); // String 对象创建
字符串常量存储在字符串常量池,目的是共享;
字符串非常量对象存储在堆中;
String使用陷阱:
(1) String s1 = “a”;
说明:在字符串常量池中创建了一个字面量为"a"的字符串。
(2) s1 = s1 + “b”;
说明:实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符
串s1+“b”(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本
字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响
程序的性能。 String s2 = “ab”;
说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。
(3) String s3 = “a” + “b”;
说明:s3指向字符串常量池中已经创建的"ab"的字符串。
(4)String s4 = s1.intern();
说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串
赋值给s4。
String常用方法
方法名 | 方法解释 |
---|---|
int length() | 返回字符串的长度: return value.length |
char charAt(int index) | 返回某索引处的字符return value[index] |
boolean isEmpty() | 判断是否是空字符串:return value.length == 0 |
String toLowerCase(): | 使用默认语言环境,将 String 中的所有字符转换为小写 |
String toUpperCase() | 使用默认语言环境,将 String 中的所有字符转换为大写 |
String trim() | 返回字符串的副本,忽略前导空白和尾部空白 |
boolean equals(Object obj): | 比较字符串的内容是否相同 |
boolean equalsIgnoreCase(String anotherString): | 与equals方法类似,忽略大小写 |
String concat(String str): | 将指定字符串连接到此字符串的结尾。 等价于用“+” |
int compareTo(String anotherString): | 比较两个字符串的大小 |
String substring(int beginIndex) | 返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。 |
String substring(int beginIndex, int endIndex) | 返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。 |
boolean endsWith(String suffix): | 测试此字符串是否以指定的后缀结束 |
boolean startsWith(String prefix) | 测试此字符串是否以指定的前缀开始 |
boolean startsWith(String prefix, int toffset) | 测试此字符串从指定索引开始的子字符串是否以指定前缀开始 |
boolean contains(CharSequence s) | 当且仅当此字符串包含指定的 char 值序列时,返回 true |
int indexOf(String str): | 返回指定子字符串在此字符串中第一次出现处的索引 |
int indexOf(String str, int fromIndex): | 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 |
int lastIndexOf(String str): | 返回指定子字符串在此字符串中最右边出现处的索引 |
int lastIndexOf(String str, int fromIndex) | 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索 |
String replace(char oldChar, char newChar) | 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的 |
String replaceAll(String regex, String replacement) | 使 用 给 定 的replacement 替换此字符串所有匹配给定的正则表达式的子字符串 |
String replaceFirst(String regex, String replacement) | 使 用 给 定 的replacement 替换此字符串匹配给定的正则表达式的第一个子字符串 |
boolean matches(String regex) | 告知此字符串是否匹配给定的正则表达式 |
String[] split(String regex) | 根据给定正则表达式的匹配拆分此字符串 |
String[] split(String regex, int limit) | 根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中 |
String与其他类的相互转换
-
String 和基本数据类型、包装类之间的转换:
(1).String -->基本数据类型、包装类:调用包装类的静态方法:包装类名.parseXxx(str)
(2).基本数据类型、包装类 --> String:调用String重载的valueOf(xxx) -
String 与 char[ ]之间的转换:
(1).String --> char[ ] : 调用String的toCharArray()
(2).char[ ] --> String : 调用String的构造器
【String str = new String(arr)】 -
String 与 byte[ ]之间的转换:
(1).String --> byte[ ]:调用String的getBytes()
(2).byte[ ] --> String:调用String 的构造器
2.StirngBuffer StringBuilder
- String:不可变的字符序列;底层用char[ ]数组存储。
- StringBuffer:可变的字符数列;线程安全,效率低;底层用char[ ]数组存储。
- StringBuilder:可变的字符数列;线程不安全,效率高;底层用char[ ]数组存储。
StringBuffer类
StringBuffer类不同于String,其对象必须使用构造器生成。
有三个构造器:
1)StringBuffer():初始容量为16的字符串缓冲区;
2)StringBuffer(intsize):构造指定容量的字符串缓冲区 ;
3)StringBuffer(String str):将内容初始化为指定字符串内容;
【StringBuffer中的很多方法和String相同】
下面是最常用的增、删、改、插、翻转。
方法 | 方法解释 |
---|---|
StringBuffer append(xxx) | 提供了很多的append()方法,用于进行字符串拼接 |
StringBuffer delete(int start,int end) | 删除指定位置的内容 |
StringBuffer replace(int start, int end, String str) | 把[start,end)位置替换为str |
StringBuffer insert(int offset, xxx) | 在指定位置插入xxx |
StringBuffer reverse() | 把当前字符序列逆转 |
public void test2(){
StringBuffer s1 = new StringBuffer("abc");
s1.append(3);
s1.append('2');
//System.out.println(s1); //abc32
//s1.delete(2,4); //ab2
//s1.replace(2,4,"hello"); //abhello2
//s1.insert(2,"what"); //abwhatc32
//s1.reverse(); //23cba
java.lang.String s2 = s1.substring(1,3);
System.out.println(s1);
System.out.println(s1.length()); //5
System.out.println(s2); //bc
}
StringBuilder类
StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样,在此不多加赘述。
三者的效率对比(开发中更建议使用StringBuffer 和 StringBuilder)
/*
* (对比String, StringBuffer, StringBuilder三者的效率
*/
@Test
public void test3(){
//初始设置
long startTime;
long endTime ;
java.lang.String text = "";
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder();
//开始对比
startTime = System.currentTimeMillis();
for (int i= 0; i < 20000; i++){
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i= 0; i < 20000; i++){
buffer.append(i);
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i= 0; i < 20000; i++){
builder.append(i);
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
}
可见在创建相同长度的字符串时,String类所需要的时间最多,且远远大于StringBuffer和StringBuilder;后两者所用时间相差无几;
二、日期时间API
1.JDK8之前日期时间API
(2).java.util.Date类
构造器:
Date():使用无参构造器创建的对象可以获取本地当前时间
Date(long date)
*常用方法
①getTime():返回自1970年1月1日0时0分0秒 GMT(格林威治标准时间)以此Date对象表示的毫秒数。
②toString():把此Date对象转换为以下形式的String: dowmon dd hh:mm:ss zzz yyyy 【dow 时一周中某一天( Sun,Mon,Tue,Wed,Thu,Fir,Sat),zzz是时间标准。】
1.System静态方法
java.long.System类:
- System类提供的 public static long currentTimeMillis() 用来返回当前时间与 1970年1月1日0时0分0秒之间以毫秒为单位的时间差。(此方法适用于计算时间差)
【计算世界时间的主要标准有:UTC、GMT、CST】
import org.junit.Test;
@Test
public void test1(){
long time = System.currentTimeMillis();
//当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
System.out.println(time); //时间戳 1627193907518
}
2.Date类
java.util.Date类:
- 构造器:
Date():使用无参构造器创建的对象可以获取本地当前时间
Date(long date) - 常用方法
①getTime():返回自1970年1月1日0时0分0秒 GMT(格林威治标准时间)以此Date对象表示的毫秒数。
②toString():把此Date对象转换为以下形式的String: dowmon dd hh:mm:ss zzz yyyy 【dow 时一周中某一天( Sun,Mon,Tue,Wed,Thu,Fir,Sat),zzz是时间标准。】
import org.junit.Test;
@Test
public void test2(){
/* 构造器一 */
Date date1 = new Date();
System.out.println(date1.toString()); //Sun Jul 25 14:20:34 GMT+08:00 2021
System.out.println(date1.getTime()); //1627194034199
/* 构造器二 */
Date date2 = new Date(1621750817944l);
System.out.println(date2.toString()); //Sun May 23 14:20:17 GMT+08:00 2021
/* 创建java.sql.Date */
java.sql.Date date3 = new java.sql.Date(17845476152741l);
System.out.println(date3); //2535-07-03
//将Java.util.Date对象转化为java.sql.Date对象
Date date5 = new Date();
java.sql.Date date6 = new java.sql.Date(date5.getTime());
System.out.println(date6); //2021-05-23
}
3.Calendar类
java.util.Calendar(日历)类
- 1)Calendar是一个抽象基类,主要用于完成日期字段之间互相操作的功能。
- 2)获取Caleandar实例的方法
①使用Calendar.getlnstance()方法
②调用它的子类GregorianCalendar的构造器 - 3)一个Calendar的实例是系统时间的抽象表示,通过get(intg field)方法来取得想要的时间信息。
比如 year,month,day_of_week,hour_of_day, minute,second
【注意】:
1)获取月份时:一月为0,二月为1,以此类推,十二月为11 ;
2)获取星期时:周日为1,周二为2,。。。。周六为7;
下图代码中涉及到了
get():获取时间
set():设置时间
add():添加
getTime() / setTime() :获取 / 设置
/**
* Calendar类
*/
@Test
public void test5(){
/*
实例化
方法1.创建其子类(GregorianCalendar)的对象
方法2.调用其静态方法gerInstance()
*/
GregorianCalendar calendar1 = new GregorianCalendar();
Calendar calendar2 = Calendar.getInstance();
System.out.println(calendar1);
//java.util.GregorianCalendar
// [time=1627195803489,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+08:00",
// offset=28800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],
// firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=6,
// WEEK_OF_YEAR=31,WEEK_OF_MONTH=5,DAY_OF_MONTH=25,DAY_OF_YEAR=206,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=4,
// AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=50,SECOND=3,MILLISECOND=489,ZONE_OFFSET=28800000,DST_OFFSET=0]
System.out.println(calendar2);
//java.util.GregorianCalendar
// [time=1627195803490,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+08:00",
// offset=28800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],
// firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=6,WEEK_OF_YEAR=31,WEEK_OF_MONTH=5,DAY_OF_MONTH=25,DAY_OF_YEAR=206,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=4,
// AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=50,SECOND=3,MILLISECOND=490,ZONE_OFFSET=28800000,DST_OFFSET=0]
/*
常用方法 get() set() add() getTime() setTime()
*/
int days = calendar1.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
System.out.println(calendar1.get(Calendar.DAY_OF_YEAR));
calendar1.set(Calendar.DAY_OF_MONTH,10);
days = calendar1.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
calendar1.add(Calendar.DAY_OF_MONTH,1);
days = calendar1.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
Date date = calendar1.getTime(); //日历 --> Date
System.out.println(date);
Date date1 = new Date(); //Date --> 日历
calendar1.setTime(date1);
days = calendar1.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
}
}
4.SimpleDateFormat类
java.text.SimpleDateFormat类
- 1)Date类的API不宜于国际化,java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类。
- 2)它允许进行 格式化:日期 --> 文本; 解析:文本 --> 日期
- 3)格式化:
①SimpleDateFormat():默认的模式和语言环境创建对象
②public StringDateFormat(String pattern):该构造方法可以用参数pattern指定的格式创建一个对象,
该对象调用:public String format(Date date):方法格式化时间对象date - 4)解析: public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。
/*
SimpleDateFormat 的使用
1.两个操作:
1.1 格式化 : 日期 ---> 字符串
1.2 解析:格式化的逆过程,字符串 --> 日期
*/
@Test
public void test3() throws ParseException {
//实例化SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat();
//格式化 : 日期--> 字符串
Date date = new Date();
System.out.println(date); //Sun May 23 15:30:54 GMT+08:00 2021
System.out.println(sdf); //java.text.SimpleDateFormat@ca92313f
java.lang.String format = sdf.format(date);
System.out.println(format); //2021/5/23 下午3:30
//解析:格式化的逆过程,字符串 --> 日期
java.lang.String str = "2020/3/20 上午3:22";
Date date1 = sdf.parse(str);
System.out.println(date1); //Fri Mar 20 03:22:00 GMT+08:00 2020
//***********************按照指定的方式进行格式化******************
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MMMM.dd GGG HH:mm:ss aaa");
//格式化
java.lang.String format1 = sdf1.format(date);
System.out.println(format1); //2021.五月.23 公元 15:39:41 下午
//解析:要求字符串必须符合SimpleDateFormat识别的格式(通过构造器参数体现),否则,会抛异常
Date parse = sdf1.parse("2021.五月.23 公元 15:39:41 下午");
System.out.println(parse); //Sun May 23 15:39:41 GMT+08:00 2021
}
5.LocalDate、LocalTime、LocalDateTime【了解】
- LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。
- LocalTime表示一个时间,而不是日期。
- LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。
6.Instant【了解】
1)Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。
2)在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位。
3)java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。
(1 ns = 10-9 s) 1秒 = 1000毫秒 =10^6微秒=10^9纳秒
public void test1() {
Instant instant = Instant.now();
System.out.println(instant); //2021-05-23T09:25:59.810609200Z
//时区不同,无法输出正确日期,需要进行处理,+ 8 hours
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime); //2021-05-23T17:25:59.810609200+08:00
}
7.DateTimeFormatter
java.time.format.DateTimeFormatter 类:
常用API:
- ①ofPattern(String pattern) 静态方法 ,返回一个指定字符串格式的DateTimeFormatter。
- ②format(TemporalAccessor t) 格式化一个日期、时间,返回字符串。
- ③parse(CharSequence text) 将指定格式的字符序列解析为一个日期、时间。
三、Java比较器
Java实现对象排序的方式有两种:
- ① 自然排序:java.lang.Comparable
【comparanle接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小】 - ② 定制排序:java.util.Comparator
【Comparator接口属于临时性的比较】
说明:
Java中的对象,正常情况下,只能进行比较:== 或 !=。
不能使用 > 或 <的,但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。
如何实现?使用接口中的任何一个:Compareble 或 Comparator.
1.Comparable接口
(1) Compareble接口的使用:
- ①像String,包装类等实现了Compare接口,重写了compareTo()方法,给出了比较两个对象大小的方式。
- ②像String、包装类重写了compareTo()方法以后,进行从小到大的排列;
- ③重写compareTo()的规则:
如果当前对象this大于形参对象obj,则返回正整数,
如果当前对象this小于形参对象obj,则返回负整数,
如果当前对象this等于形参对象obj,则返回零。
(2)对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写comparaTo(obj)方法。
在comparaTo(obj)方法中之明如何排序。
(3)自定义类实现Compare自然排序:
- ①Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。
- ②实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。
如果当前对象this大 于形参对象obj,则返回正整数,
如果当前对象this小于形参对象obj,则返回负整数,
如果当前对象this等于形参对象obj,则返回零。
- ③实现Comparable接口的对象列表(和数组可以通过 Collections.sort 或Arrays.sort进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
@Test
public void test1(){
java.lang.String[] arr = new java.lang.String[]{"AA","DD","CC","BB","EE"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); //[AA, BB, CC, DD, EE]
}
(4)Comparable 的典型实现:(默认都是从小到大排列的)
(1)String:按照字符串中字符的Unicode值进行比较
(2)Character:按照字符的Unicode值来进行比较
(3)数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值大小进行比较
(4)Boolean:true 对应的包装类实例大于 false 对应的包装类实例
(5)Date、Time等:后面的日期时间比前面的日期时间大
@Test
public void test2(){
Goods[] arr = new Goods[4];
arr[0] = new Goods("HP",7999);
arr[1] = new Goods("DELL",6999);
arr[2] = new Goods("ROG",9555);
arr[3] = new Goods("APPLE",10000);
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
/*[Goods{name=DELL, price=6999.0},
Goods{name=HP, price=7999.0},
Goods{name=ROG, price=9555.0},
Goods{name=APPLE, price=10000.0}] */
}
/**
* 商品类
*/
public class Goods implements Comparable{
private java.lang.String name;
private double price;
public Goods(){
}
public Goods(java.lang.String name, double price) {
this.name = name;
this.price = price;
}
public java.lang.String getName() {
return name;
}
public void setName(java.lang.String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public java.lang.String toString() {
return "Goods{" +
"name=" + name +
", price=" + price +
'}';
}
/*
* 指明商品比较大小的方式:按照价格由低到高
*/
@Override
public int compareTo(Object o) {
if (o instanceof Goods){
Goods good = (Goods)o;
if (this.price > good.price){
return 1;
}else if (this.price < good.price){
return -1;
}else {
//当价格相同时,根据名字进行排序
return this.name.compareTo(good.name);
}
//方法二:
//Double.compare(this.price, good.price);
}
// return 0;
throw new RuntimeException("传入的数据类型不一致 !");
}
}
2.Comparator接口
实现定制排序:java.util.Comparator
- (1)当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排序的比较。
- (2)重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
如果方法返回正整数,则表示o1大于o2;
如果返回0,表示相等;
如果返回负整数,表示o1小于o2。
- (3)可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。
- (4)还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。
@Test
public void test3(){
java.lang.String[] arr = new java.lang.String[]{"AA","DD","CC","BB","EE"};
Arrays.sort(arr,new Comparator(){
//定制
@Override
public int compare(Object o1,Object o2){
if (o1 instanceof java.lang.String && o2 instanceof java.lang.String){
java.lang.String s1 = (java.lang.String) o1;
java.lang.String s2 = (java.lang.String) o2;
return s1.compareTo(s2);
}
//return 0;
throw new RuntimeException("输入数据类型不一致 !");
}
});
System.out.println(Arrays.toString(arr)); //[AA, BB, CC, DD, EE]
}
可以理解为重写compare方法中的方法
四、System类
代表系统,系统级的很多属性和控制方法都放置在该类的内部。
1)成员方法:
native long currentTimeMillis(): 该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
void exit(int status): 该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等
void gc(): 该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。
String getProperty(String key): 该方法的作用是获得系统中属性名为key的属性对应的值。
import org.junit.Test;
public class SystemTest {
@Test
public void test1(){
java.lang.String javaVersion = System.getProperty("java.version");
System.out.println("java的version:" + javaVersion); //java的version:15.0.2
java.lang.String javaHome = System.getProperty("java.home");
System.out.println("java的home:" + javaHome); //java的home:C:\Program Files\Java\jdk-15.0.2
java.lang.String osName = System.getProperty("os.name");
System.out.println("os的name:" + osName); //os的name:Windows 10
java.lang.String osVersion = System.getProperty("os.version");
System.out.println("os的version:" + osVersion); //os的version:10.0
java.lang.String userName = System.getProperty("user.name");
System.out.println("user的name:" + userName); //user的name:符工爱奇
java.lang.String userHome = System.getProperty("user.home");
System.out.println("user的home:" + userHome); //user的home:C:\Users\符工爱奇
java.lang.String userDir = System.getProperty("user.dir");
System.out.println("user的dir:" + userDir); //user的dir:D:\IdeaProjects\常用类
}
}
五、math类
- Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。
- Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。
abs 绝对值
acos,asin,atan,cos,sin,tan 三角函数
sqrt 平方根
pow(doublea,doble b) a的b次幂
log 自然对数
exp e为底指数
max(double a,double b) 最大值
min(double a,double b) 最小值
random() 返回0.0到1.0的随机数
long round(double a) double型数据a转换为long型(四舍五入)
toDegrees(double angrad) 弧度—>角度
toRadians(double angdeg) 角度—>弧度
六、BigInteger 和 BigDecimal【高精准的数字】
1)BigInteger类:
- (1)Integer类作为int的包装类,能存储的最大整型值为2^31-1 ,Long类也是有限的,最大为2^63-1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类都无能为力,更不用说进行运算了。
- (2)java.math包的BigInteger可以表示不可变的任意精度的整数。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
- (3)构造器 BigInteger(String val):根据字符串构建BigInteger对象
2)BigInteger常见的方法:绝对值、加减乘除、取整、
方法 | 方法解释 |
---|---|
public BigInteger abs() | 返回此 BigInteger 的绝对值的 BigInteger。 |
BigInteger add(BigInteger val) | 返回其值为 (this + val) 的 BigInteger 。 |
BigInteger subtract(BigInteger val) | 返回其值为 (this - val) 的 BigInteger 。 |
BigInteger multiply(BigInteger val) | 返回其值为 (this * val) 的 BigInteger。 |
BigInteger divide(BigInteger val) | 返回其值为 (this / val) 的 BigInteger。整数相除只保留整数部分。 |
BigInteger remainder(BigInteger val) | 返回其值为 (this % val) 的 BigInteger。 |
BigInteger[ ] divideAndRemainder(BigInteger val) | 返回包含 (this / val) 后跟(this % val) 的两个 BigInteger 的数组。 |
BigInteger pow(int exponent) | 返回其值为 (thisexponent) 的 BigInteger。 |
通过代码体会一下高精准度
import org.junit.Test;
import java.math.BigDecimal;
import java.math.BigInteger;
public class BigInteger_BIgDecimal {
@Test
public void test() {
BigInteger bi = new BigInteger("12433241123");
BigDecimal bd = new BigDecimal("12435.351");
BigDecimal bd2 = new BigDecimal("11");
System.out.println(bi); //12433241123
// System.out.println(bd.divide(bd2));
System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP ));
//1130.486
System.out.println(bd.divide(bd2, 15, BigDecimal.ROUND_HALF_UP));
//1130.486454545454545
}
}
3)BigDecimal类:
(1)一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中,要求数字精度比较高,故用java.math.BigDecimal 类。
(2)igDecimal类支持不可变的、任意精度的有符号十进制定点数。
(3)构造器 public BigDecimal(double val) public BigDecimal(String val)
(4)常用方法(加减乘除):
方法 | 方法解释 |
---|---|
public BigDecimal add(BigDecimal augend) | 同上表BigIntrger |
public BigDecimal subtract(BigDecimal subtrahend) | 同上表BigIntrger |
public BigDecimal multiply(BigDecimal multiplicand) | 同上表BigIntrger |
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) | 同上表BigIntrger |
小结
对于Java的常用类,没有必要全部清清楚楚,但是应该对此有些了解,当开发时遇到问题时,能够想起在这个类中,有某个能够用到的方法即可,忘记就去百度,这样可以大大节省开发时间。