Java09-常用类

NiuMT 2020-06-03 20:58:30
Java

字符串相关的类

String

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
    /** Cache the hash code for the string */
    private int hash; // Default to 0

image-20201018211859914

image-20201018212802765

结论:

  1. 常量与常量的拼接结果在常量池 。 且常量池中不会存在相同内容的常量 。
  2. 只要其中有一个是变量,结果就在堆中;
  3. 如果拼接的结果调用 intern() 方法,返回值就在常量池中

String转换

image-20201018222436139

StringBuffer

image-20201018225650616

String、StringBuffer、StringBuilder的异同

源码分析:

String str1 = new String();// char[] value = new char[0];
String str2 = new String("abc");//char[] value = new char[]{'a','b','c'};

StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建长度是16的数组
StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length+16];

sb2.length为3
扩容问题:长度扩容为原来长度*2+2,同时将原有数组赋值到新的数组中

开发中建议:使用 StringBuffer(int capacity)或 StringBuilder(int capacity)

常用方法:

StringBuilder

StringBuilder 和 StringBu ffer 非常类似,均代表可变的字符序列 而且提供相关功能的方法也一样

互相转换

日期时间API

image-20201019104444415

java.lang.System

System
类提供的 public static long currentTimeMillis() 用来返回当前时间与 1970 年 1 月 1 日 0 时 0 分 0 秒之间以==毫秒==为单位的时间差。此方法适于计算时间差。

java.util.Date 类

java.util.Date 类
    |---java.sql.Date类  // 继承关系

1.两个构造器的使用

2.两个方法的使用

3.java.sql.Date对应数据库中的日期类型的对象

java.text.SimpleDateFormat 类

Date 类的 API 不易于国际化,大部分被废弃了 java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体 类。

它允许进行格式化:日期—>文本 、 解析:文本—>日期

// 1. 实例化,使用默认构造器
SimpleDateFormat sdf = new SimpleDateFormat();
// 2. 格式化:日期-->字符串
Date date = new Date();
System.out.println(date);

String format = sdf.format(date);
System.out.println(format);
// 3. 解析:字符串-->日期
String str = "19-12-28 上午11:21";
Data data1 = sdf.parse(str);
System.out.println(date1);


/*按照指定方式格式化和解析*/
// 4. 实例化,使用带参构造器
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// 5. 格式化:日期-->字符串
String format = sdf.format(date);
System.out.println(format);
// 6. 解析:字符串-->日期
Data data1 = sdf.parse("2020-01-21 12:45:55");// 格式符合构造器中的格式
System.out.println(date1);

image-20201019150125078

java.util.Calendar 日历类(抽象类)

// 1.实例化
// 方式一:创建其子类(GregorianCalendar)对象
// 方式二:调用其静态方法getInstance()
Calendar calendar = Calendar.getInstance();
// 2. 常用方法
// get()
int days = calendar.get(Calendar.DAY_OF_MONTH);// 返回当前时间是这个月的第几天
int days = calendar.get(Calendar.DAY_OF_YEAR);//  返回当前时间是这一年的第几天

// set()
calendar.set(Calendar.DAY_OF_MONTH, 22);// 修改当前时间为这个月的第几天,修改了calendar
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));// 22

// add()
calendar.add(Calendar.DAY_OF_MONTH, 3);// 天数可以为负数 如:-3
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));// 25

// getTime()   日历类--->Date
Date date = calendar.getTime();

// setTime()   Date--->日历类
Date date = new Date();
calendar.setTime(date);

注意

以下是JDK8新日期时间API

可变性:像日期和时间这样的类应该是不可变的。

偏移性:
Date 中的年份是从 1900 开始的,而月份都从 0 开始。

格式化:格式化只对
Date 有用, Calendar 则不行。
此外,它们也不是线程安全的;不能处理闰秒等。

LocalDate、LocalTime、LocalDateTime

LocalDate 、 LocalTime 、 LocalDateTime 类是其中较重要的几个类,它们的实例是==不可变==的对象。

方法 描述
now() /* now(ZoneId zone) 静态方法,根据当前时间创建对象指定时区的对象
of() 静态方法,根据指定日期时间创建对象
getDayOfMonth()/getDayOfYear() 获得月份天数1-31/获得年份天数 1-366
getDayOfWeek() 获得星期几 (返回一个DayOfWeek 枚举值)
getMonth() 获得月份 (返回一个 Month 枚举值)
getMonthValue() /getYear() 获得月份1-12/获得年份
getHour()/getMinute()/getSecond() 获得当前对象对应的小时、 分钟 、 秒
withDayOfMonth()/withDayOfYear()/withMonth()/withYear() 将月份天数、 年份天数 、 月份 、 年份修改为指定的值并返回新 的对象
plusDays(), plusWeeks(),plusMonths(), plusYears(),plusHours() 向当前对象添加几天 、 几周 、 几个月 、 几年 、 几小时
minusMonths()/minusDays()/minusYears()/minusHours() 从当前对象减去 几 月 、 几周 、 几 天 、 几年 、 几小时

Instant

java.time 包通过值类型 Instant 提供机器视图,不提供处理人类意义上的时间单位。 Instant 表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲, 它只是简单的表示自 1970 年 1 月 1 日 0 时 0 分 0 秒( UTC )开始的秒数。 因为 java.time 包是基于纳秒计算的,所以 Instant 的精度可以达到纳秒级。1秒=1000毫秒=10^6微吗秒=10^9纳秒

时间戳是指格林威治时间
1970 年 01 月 01 日 00 时 00 分 00 秒 (北京时间 1970 年 01 月 01
日 08 时 00 分 00 秒)起至现在的总秒数。

方法 描述
now() 静态方法返回默认 UTC 时区的 Instant 类的对象
ofEpochMilli (long epochMilli) 静态方法返回在 1970-01-01 00:00:00 基础上加上指定毫秒数之后的 Instant 类的对象
atOffset(ZoneOffset offset) 结合即时的偏移来创建一个OffsetDateTime
toEpochMilli() 返回1970-01-01 00:00:00 到当前时间的毫秒数, 即为时间戳

image-20201019165631359

java.time.format.DateTimeFormatter 类

其他API

image-20201019171917701

Java比较器

Java 实现对象排序的方式有两种:

自然排序 java.lang.Comparable

像String、包装类等实现了Comparable接口,重写了compareTo()方法。

重写compareTo(obj)方法的规则:

  1. 如果当前对象this大于形参对象obj,则返回正整数;
  2. 如果当前对象this小于形参对象obj,则返回负整数;
  3. 如果当前对象this等于形参对象obj,则返0

    对于自定义类来说,如果需要排序,我们可以让==自定义类实现Comparable接口,重写compareTo(obj)方法。在compareTo(obj)方法中指明如何排序==。

实现 Comparable 接口的对象列表(和数组)可以通过 Collections.sort 或
Arrays.sort 进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

Comparable 的典型 实现 默认都是从小到大排列的

  1. String :按照字符串中字符的 Unicode 值进行比较
  2. Character :按照字符的 Unicode 值来进行比较
  3. 数值类型对应的包装类以及 BigInteger 、 BigDecimal :按照它们对应的数值大小进行比较
  4. Boolean true 对应的包装类实例大于 false 对应的包装类实例
  5. Date 、 Time 等:后面的日期时间比前面的日期时间大

定制排序 java.util.Comparator

当元素的类型没有实现 java.lang.Comparable 接口而又不方便修改代码,或者实现了java.lang.Comparable 接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序强行对多个对象进行 整体 排序的比较。

重写 compare(Object o1,Object o2) 方法,比较 o1 和 o2 的大小: 如果方法返回正整数,则表示 o1 大于 o2 ;如果返回 0 ,表示相等;返回负整数,表示o1 小于 o2 。

可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort) 从而允许在排序顺序上实现精确控制。

还可以使用 Comparator 来控制某些数据结构(如有序 set 或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序 。

image-20201019192126283

System类

Math类

java.lang.Math
提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为 double 型。

BigInteger 与 BigDecimal

BigInteger

java.math 包的 BigInteger 可以表示==不可变==的任意精度的整数 。 BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外, BigInteger 还提供以下运算:模算术、 GCD 计算、质数测试、素数生成、位操作以及一些其他操作。

构造器: BigInteger (String val)根据字符串构建 BigInteger 对象;

常用方法

BigDecimal

一般的 Float 类和 Double 类可以用来做科学计算或工程计算,但在商业计算中,要求数字精度比较高,故用到 java.math.BigDecimal 类 。

BigDecimal 类支持不可变的、任意精度的有符号十进制定点数 。

构造器

常用方法