java常用类

字符串相关的类 String
介绍
  • String类:: 代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作
    为此类的实例实现
  • String是一个final类,代表不可变的字符序列
  • 字符串是常量,用双引号引起来表示。他们的值在创建之后不能更改
  • String对象的字符内容是存储在一个字符数组value[]中的
内存解析

问题:String str1 = “abc”; 与String str2 = new String(“abc”);的区别

练习

String与基本数据类型转换
  • 字符串 -> 基本数据类型、包装类
    • Integer包装类的public static int parseInt(String s):可以将由“数字”字
      符组成的字符串转换为整型
    • 类似地,使用java.lang包中的Byte、Short、Long、Float、Double类调相应
      的类方法可以将由“数字”字符组成的字符串,转化为相应的基本数据类型
  • 基本数据类型、包装类 -> 字符串
    • 调用String类的public String valueOf(int n)可将int型转换为字符串
    • 相应的valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(double
      d)、valueOf(boolean b)可由参数的相应类型到字符串的转换
  • 字符数组 -> 字符串
    • String 类的构造器:String(char[]) 和 和 String(char[] ,int offset ,int
      length) 分别用字符数组中的全部字符和部分字符创建字符串对象
  • 字符串 -> 字符数组
    • public char[] toCharArray() :将字符串中的全部字符存放在一个字符数组
      中的方法
    • public void getChars(int srcBegin, int srcEnd, char[] dst,
      int dstBegin):提供了将指定索引范围内的字符串存放到数组中的方法
  • 字节数组 -> 字符串

    • String(byte[]) :通过使用平台的默认字符集解码指定的 byte 数组,构
      造一个新的 String
    • String(byte[] ,int offset ,int length) :用指定的字节数组的一部分,
      即从数组起始位置offset开始取length个字节构造一个字符串对象
  • 字符串 -> 字节数组

    • public byte[] getBytes() :使用平台的默认字符集将此 String 编码为
      byte 序列,并将结果存储到一个新的 byte 数组中
    • public byte[] getBytes(String charsetName) :使用指定的字符集将
      此 String 编码到 byte 序列,并将结果存储到新的 byte 数组
StringBuffer 类
  • 介绍:StringBuffer 类不同于String ,其对象必须使用构造器生成。有三个构造器:

    • StringBuffer() :初始容量为16的字符串缓冲区
    • StringBuffer(int size) :构造指定容量的字符串缓冲区
    • StringBuffer(String str) :将内容初始化为指定字符串内容
  • StringBuffer和String的区别

  • 常用方法

    1
    2
    3
    4
    5
    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() :把当前字符序列逆转
StringBuilder 类
  • 简介StringBuilder 和 和 StringBuffer 非常类似,均代表可变的字符序列 , 而且
    提供相关功能的方法也一样
对比String 、StringBuffer 、StringBuilder
  • String(JDK1.0):不可变字符序列
  • StringBuffer(JDK1.0):可变字符序列、效率低、线程安全
  • StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全
经典题
1
2
3
4
5
6
7
String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str);
System.out.println(sb.length());//4 看源码 会将 "null"这个字符串append
System.out.println(sb);//null
StringBuffer sb1 = new StringBuffer(str);
System.out.println(sb1);//报异常
JDK8之前日期时间API
java.lang.System类
  • System类提供的public static long currentTimeMillis()用来返回当前时
    间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
java.util.Date 类
  • 含义:表示特定的瞬间,精确到毫秒
  • 构造器
    • Date():使用无参构造器创建的对象可以获取本地当前时间
    • Date(long date)
  • 常用方法
    • getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象
      表示的毫秒数
    • toString():把此 Date 对象转换为以下形式的 String: dow mon dd
      hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue,
      Wed, Thu, Fri, Sat),zzz是时间标准 (Sun Apr 05 10:04:51 CST 2020
java.text.SimpleDateFormat 类
  • 说明: Date类的API不易于国际化,大部分被废弃了java.text.SimpleDateFormat
    类是一个不与语言环境有关的方式来格式化和解析日期的具体类

  • 格式化:

    • SimpleDateFormat() :默认的模式和语言环境创建对象
    • public SimpleDateFormat(String pattern) :该构造方法可以用参数pattern
      指定的格式创建一个对象,该对象调用
    • public String format(Date date) :方法格式化时间对象date
  • 解析:

    • public Date parse(String source): :从给定字符串的开始解析文本,以生成
      一个日期
  • 时间格式参照图

  • Demo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Date date = new Date();
    //产生一个formater格式化的对象
    SimpleDateFormat formater = new SimpleDateFormat();
    //打印默认输出的格式
    System.out.println(formater.format(date)); //20-4-5 上午10:19
    //指定格式
    SimpleDateFormat formater2 = new SimpleDateFormat("yyyy年MM月dd日 EEE HH:mm:ss");
    System.out.println(formater2.format(date)); //2020年04月05日 星期日 10:19:27

    // 实例化一个指定的格式对象
    Date date2 = null;
    try {
    date2 = formater2.parse("2008年08月08日 星期一 08:08:08");
    } catch (ParseException e) {
    e.printStackTrace();
    }
    // 将指定的日期解析后格式化按指定的格式输出
    System.out.println(date2.toString()); //Fri Aug 08 08:08:08 CST 2008
java.util.Calendar 类
  • 简介: Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能

  • 获取Calender实例

    • 使用Calendar.getInstance()方法
    • 调用它的子类GregorianCalendar的构造器
  • 说明:一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想
    要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、
    MINUTE、SECOND

  • 注意

    • 获取月份时:一月是0,二月是1,以此类推,12月是11
    • 获取星期时:周日是1,周二是2 , 。。。。周六是7
  • 几个方法

    • public void set(int field,int value)
    • public void add(int field,int amount)
    • public final Date getTime()
    • public final void setTime(Date date)
  • Demo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Date date = new Date();
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    System.out.println(calendar.getTime()); //Sun Apr 05 10:41:45 CST 2020
    calendar.set(Calendar.DAY_OF_MONTH, 8);
    System.out.println("当前时间日设置为8后,时间是:" + calendar.getTime()); //Wed Apr 08 10:41:45 CST 2020
    calendar.add(Calendar.HOUR, 2);
    System.out.println("当前时间加2小时后,时间是:" + calendar.getTime()); //Wed Apr 08 12:41:45 CST 2020
    calendar.add(Calendar.MONTH, -2);
    System.out.println("当前日期减2个月后,时间是:" + calendar.getTime()); //Sat Feb 08 12:41:45 CST 2020
JDK8中新日期时间API
之前日期类的问题
  • 如果我们可以跟别人说:“我们在1502643933071见面,别晚了!”那么就再简单不
    过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了。JDK 1.0中包含了
    一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用
    。而Calendar并不比Date好多少。它们面临的问题是:
    • 可变性:像日期和时间这样的类应该是不可变的
    • 偏移性:Date中的年份是从1900开始的,而月份都从0开始
    • 格式化:格式化只对Date有用,Calendar则不行
    • 安全性:不是线程安全的
新时间日期API–java.time API
  • 简介Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。
    新的 java.time 中包含了所有关于本地日期(LocalDate)、本地时间
    (LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)
    和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法
    用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大
    了日期时间和本地化的管理

    • java.time – 包含值对象的基础包
    • java.time.format – 格式化和解析时间和日期
    • java.time.chrono – 提供对不同的日历系统的访问
    • java.time.temporal – 包括底层框架和扩展特性
    • java.time.zone – 包含时区支持的类
    • 大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽
      管有68个新的公开类型,大多数开发者,大概将只会用到其中的三分之一
    • LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期
    • LocalTime表示一个时间,而不是日期
    • LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一
    • ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示
      法,也就是公历
  • 方法

  • Demo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //now()方法
    LocalDate localDate = LocalDate.now();
    LocalTime localTime = LocalTime.now();
    LocalDateTime localDateTime = LocalDateTime.now();

    System.out.println(localDate); //2020-04-05
    System.out.println(localTime); //16:15:55.181
    System.out.println(localDateTime); //2020-04-05T16:15:55.181

    //of() T表示分隔符,Z表示的是UTC(世界标准时间)。
    LocalDateTime localDateTime1 = LocalDateTime.of(2020,4,4,16,18,55);
    System.out.println(localDateTime1);
时间戳?
  • 时间戳是指格林威治时间1970 年01 月01 日00 时00 分00 秒( 北京时间1970 年01 月01
    日 日08 时00 分00 秒) 起至现在的总秒数
瞬时 Instant
  • 概念:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间
    戳。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。
    概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒
    数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级

    (1 ns = 10^ -9 s) 1秒 = 1000毫秒 =10^6微秒=10 ^9 纳秒

  • 方法

  • Demo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Instant instant = Instant.now();
    System.out.println(instant); //2020-04-05T08:27:02.626Z 世界标准时间 北京时间要在基础上+8h

    //偏移8h得到北京时间
    OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
    System.out.println(offsetDateTime); //2020-04-05T16:27:02.626Z

    //获取对应毫秒数 自**1970年1月1日0时0分0秒开始
    long l = instant.toEpochMilli();
    System.out.println(l); //1586075486287

    Date date = new Date(l);
    System.out.println(date); //Sun Apr 05 16:37:06 CST 2020

    SimpleDateFormat format = new SimpleDateFormat();
    String format1 = format.format(date);
    System.out.println(format1); //默认输出格式 20-4-5 下午4:37

    SimpleDateFormat format2 = new SimpleDateFormat("yyyy年MM月dd日 EEE HH:mm:ss");
    System.out.println(format2.format(date)); //2020年04月05日 星期日 16:37:06
格式化与解析日期或时间
  • java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法

    • 预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
    • 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
    • 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
  • Demo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    LocalDateTime localDateTime = LocalDateTime.now();

    //DateTimeFormatter 格式化或解析日期时间

    //方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
    DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    String str1 = formatter.format(localDateTime);

    System.out.println(localDateTime); //2020-04-05T16:47:38.470
    System.out.println(str1); //2020-04-05T16:47:38.47

    //方式二:本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
    // 还有 FormatStyle.SHORT FormatStyle.MEDIUM
    DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    System.out.println(formatter1.format(localDateTime));
    //short: 20-4-5 下午4:56
    //long: 2020年4月5日 下午04时58分11秒
    //medium: 2020-4-5 16:58:40

    //方式三: 自定义格式 如:ofPattern("yyyy-MM-dd hh:mm:ss")
    DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
    System.out.println(formatter2.format(localDateTime)); //2020-04-05 05:03:32

    //解析
    TemporalAccessor accessor = formatter2.parse("2020-04-05 05:03:32");
    System.out.println(accessor);
    //输出:{MilliOfSecond=0, HourOfAmPm=5, MicroOfSecond=0, NanoOfSecond=0, MinuteOfHour=3, SecondOfMinute=32},ISO resolved to 2020-04-05
Java比较器
自然排序:java.lang.Comparable
  • 概念: Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称
    为类的自然排序
  • 用法:实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即
    通过 compareTo(Object obj) 方法的返回值来比较大小。如果当前对象this大
    于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回
    负整数,如果当前对象this等于形参对象obj,则返回零, 实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或Arrays.sort进行自动排序

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    class Goods implements Comparable{
    private String name;
    private double price;

    //省略构造方法 、getter()、setter()、toString()方法
    @Override
    public int compareTo(Object o) {
    if(o instanceof Goods) {
    Goods other = (Goods)o;
    if(this.price > other.price) {
    return 1;
    }else if(this.price < other.price) {
    return -1;
    }else{
    return 0;
    }

    }
    throw new RuntimeException("传入的数据类型不符合要求");
    }
    }

    public class Main {
    public static void main(String[] args) {
    Goods[] all = new Goods[4];
    all[0] = new Goods("《红楼梦》", 100);
    all[1] = new Goods("《西游记》", 80);
    all[2] = new Goods("《三国演义》", 140);
    all[3] = new Goods("《水浒传》", 120);
    Arrays.sort(all);
    System.out.println(Arrays.toString(all));

    }
    }

    /*
    输出结果:
    [Goods{name='《西游记》', price=80.0}, Goods{name='《红楼梦》', price=100.0}, Goods{name='《水浒传》', price=120.0}, Goods{name='《三国演义》', price=140.0}]
    */
定制排序:java.util.Comparator
  • 简介:当元素的类型没有实现java.lang.Comparable 接口而又不方便修改代码
    了 或者实现了java.lang.Comparable 接口的排序规则不适合当前的操作,那
    么可以考虑使用 Comparator 的对象来排序

  • 用法:需要重写compare(Object o1,Object o2)方法,比较o1和o2的大小,可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制

  • Demo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class Main {

    public static void main(String[] args) {
    Goods[] all = new Goods[4];
    all[0] = new Goods("《红楼梦》", 100);
    all[1] = new Goods("《西游记》", 80);
    all[2] = new Goods("《三国演义》", 140);
    all[3] = new Goods("《水浒传》", 120);

    //将 Comparator 传递给 sort 方法
    Arrays.sort(all, new Comparator<Goods>() {
    @Override
    public int compare(Goods o1, Goods o2) {
    Goods g1 = (Goods)o1;
    Goods g2 = (Goods)o2;
    return Double.compare(g1.getPrice(),g2.getPrice());
    }
    });
    System.out.println(Arrays.toString(all));
    }
    }
System类
  • 介绍System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包,由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便
    的进行调用

  • 成员变量:System类内部包含in、out和err三个成员变量,分别代表标准输入流
    (键盘输入),标准输出流(显示器)和标准错误输出流(显示器)

  • 成员方法

    • native long currentTimeMillis(): 该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数

    • void exit(int status): 该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。 使用该方法可以在图形界面编程中实现程序的退出功能等

    • void gc():该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况

    • String getProperty(String key):方法的作用是获得系统中属性名为key的属性对应的值。系统中常见的属性名以及属性的作用如下表所示:

Math 类
  • 介绍:java.lang.Math 提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为double
  • 方法
1
2
3
4
5
6
7
8
9
10
11
12
abs 绝对值
acos,asin,atan,cos,sin,tan 三角函数
sqrt 平方根
pow(double a,doble b) a 的b 次幂
log 自然对数
exp e 为底指数
max(double a,double b)
min(double a,double b)
random() 返回0.01.0 的随机数
long round(double a) double 型数据a 转换为long 型(四舍五入)
toDegrees(double angrad) 弧度—> 角度
toRadians(double angdeg) 角度—> 弧度
0%