Java核心API

Java核心API

Scroll Down

前言

本文主要写字符串类String、Object、日期类和包装类

1.Stirng字符串

1. String我们把它称作不可变字符序列

序列说白了就是一个数组,Spring类是用关键字final修饰的,所以Spring类不能被继承,也不能修改。
String类是一个引用类型,默认值是null,在java中为初始化该对象提供了两种方式:

  1. String str = "鹿先森";
  2. String str1 = new String("鹿先森");

Java之所以提供第一种方式,是因为String在Java中使用非常频繁的,所以提供了一种方式创建对象,当程序执行String str="鹿先森";时,相当于虚拟机会在栈中创建三个char的值‘鹿’,‘先’,‘森’,其次会在堆内存中创建一个String对象,该对象的值是刚才的值组成的一个char类型的数组,最后这个字符数组会添加到常量池中。
第二种方式如果单独创建在主方法中,常量池中会存放“鹿先森”字符串的值,同时也会在堆内存中创建一字符串对象。对于第一种方式,当java虚拟机看到“鹿先森”时,会在常量池中找这个字符串,如果找到返回,如果没找到就创建String对象存储,并把它的引用返回给变量str。
当执行第二种方式时,java虚拟机会首先去常量池中找字符串,之前已经创建了所以会将字符串找到,由于此处用的是new关键字,还会在堆内存中创建一个新的对象,对象中的值引用的是常量池中的字符串,然后会把堆内存中创建的对象返回给str1。

2. String常用的API

上面已经说过,String其实就是一个字符数组,所以可以为字符串的每个字符设置一个编号,这个编号从0开始,String类中提供了很多方法进行对字符串进行处理,常用的API如下:

  1. charAt():获取字符串中某个字符
  2. length():获取字符串的长度
  3. trim():去掉字符串两端的空白
  4. toLowerCase():将字符串转换为小写
  5. toUpperCase():将字符串转换为大写
  6. indexOf():查找某个子串在字符串中首次出现的位置
  7. lastIndexOf():查找某个子串在字符串中最后一次出现的位置
  8. endsWith():判断是否以指定的字符串结束
  9. startsWith():判断是否以指定的字符串开始
  10. substring(int beginIndex,int endIndex):截取字符串中的某一段子串,从start开始,到end结束
  11. substring(int start):截取从start位置开始以后的字符串
  12. toCharArray():将字符串转换为字符数组

上面只是列举了常用的字符串处理方法,其他的不再赘述。

StringBuffer类和StringBuilder类

前面说过String是不能改变的,如果要改变一个String类型的变量的值,会创建出新的对象。然后让String类型指向新的String对象,此时内存中就会生成很多新的没有被引用的对象,JVM的GC就开始工作回收这些对象,这样使用效率就会比较低。StringBuffer和StringBuilder是类似于String的缓冲区,通过它可以对字符串进行修改而不会创建许多对象。StringBuffer是线程安全的,效率比较低,StringBuilder是线程不安全的,效率比较高。这两个类中提供如下常用方法:

  1. append():在字符春的末尾追加字符串
  2. insert():在字符串的某个位置插入子串
  3. delete():删除字符串中的某段子串
  4. toString():转换为字符串文本

2. Object类

什么是Object

Object类可以视为所有类的父类,如果某个类没有明确的父类,会默认继承Object类。
可以使用Object类型的变量指向任意类型地方对象。在Object类中有一个无参数的构造方法,在构造一个子类实例的时候都会默认先调用该构造方法

Object类中的方法

只要定义一个类就会默认继承Object类,也就是说,继承了Object类中的属性和方法,Object类中的常用方法如下:

  1. toString()
    经常由系统默认调用,是活动当前对象的文本描述,Object默认返回值格式是:全限定名@hashCode,建议覆盖为当前对象的文本描述
  2. equals()
    用来比较两个对象是否相等的方法。
    比较对象有两种方法,分别是“引用相等”和“对象相等”,比较引用相等是用“==”符号,比较对象的内容是否相等是用xxx.equals()方法。equals在Object类中声明,默认的比较规则是比较引用,建议覆盖,实现对象的比较。
    覆盖的规则
    1. 自反性。对于任何非空引用值x,x.equals(x)都应返回true
    2. 对称性。对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true
    3. 传递性。对于任何非空引用值x、y和z,如果x.equals(y)返回true,并且y.equals(x)返回true,那么x.equals(z)应返回true
    4. 一致性。对于任何非空引用值x和y。多次调用x.equals(y)始终返回true或始终返回false,前提是对象上equals比较中所用的信息没有被修改。
    5. 对于任何非空引用值x,x.equals(null)都应返回false
  3. hashCode()
    hashCode()方法要和equals方法一同覆盖,默认的hashCode()值是当前堆对象地址转换的一个整数,这个整数不是内存地址,一般使用对象的OID值作为hashCode的值。OID是对象的唯一编号,在项目中一般采用数据库生成OID,也就是数据库中的主键。
    覆盖hashCode()方法要满足以下规则:
    1. 当两个对象equals比较为true时,应具有相同的hashCode()值
    2. 当两个对象equals比较为false时,应具有不同的hashCode()值
    3. hashCode()值要稳定(一致性),一个对象创建以后就不应该再变化

3.日期类

1. Date类

java提供了Date时间类,Date存在于java.util包下,因为Date存在比较早,所以Date类中的大多数方法都已经过时。
Date类中提供了很多构造方法,但有一些构造方法在使用过程中不方便并且容易出错,以下是两个比较常见的构造方法。

  1. Date()
    生成一个Date对象并用当前时间初始化此对象,以表示分配它的时间(精确到毫秒)。
  2. Date(long date)
    生成Date对象并初始化此对象,以表示自动标准基准时间(1970年1月1日00:00:00GMT)以来的指定毫秒数。
    Date类提供了很多方法,比较常用的方法如下:
    1. boolean after(Date when):测试此日期是否在指定日期之后
    2. boolean before(Date when):测试此日期是否在指定日期之前
    3. Object clone():返回此对象的副本
    4. int compareTo(Date anotherDate):比较两个日期的顺序
    5. Boolean equals(Object obj):比较两个日期是否相等
    6. long getTime():返回自标准基准时间以来此Date对象表示的毫秒数
    7. int hashCode():返回此对象的哈希码值
    8. void setTime():设置此Date对象,以表示基准时间以后time毫秒的时间点

因为Date中的许多方法都已经过时了,对日期进行加减操作,以及获取年月日时分秒都是通过下面的Calendar类来操作。

2. Calendar类

java.util.Calendar是一个抽象类,是系统时间的抽象表示,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是据1970年1月1日的00:00:00.000的偏移量。
Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象。Calendar的getInstance方法返回一个Calendar对象,某日历字段已由当前日期和时间初始化。
一个Calendar的实例是系统时间的抽象表示,从Calendar的实例可以知道年月日星期时区等信息。Calendar类中有一个静态方法get(int x),通过这个方法可以获取到相关实例的一些值信息。参数x是一个产量值,在Calendar中有定义。
Calendar有一个实现的子类是GregorianCalendar,提供了世界上大多数国家使用的标准日历系统。
Calendar是一个抽象类,只有创建了Calendar对应的子类实例才能使用其中的方法,下面举个例子:

	public static void main(String[] args) {
		//获得Calendar实例对象
		Calendar cal = Calendar.getInstance();
		//可以从cal中获取一个Date对象
		Date d = cal.getTime();
		//将Date转化为Calendar,因为Calendar并没有提供对应的构造方法
		Date d1 = new Date(1000);
		cal.setTime(d1);
	}

Calendar 类中提供了很多访问、修改时间的方法:

  1. add(int field,int var):为给定的日历字段添加或减去指定的时间量。
  2. get(int field):返回指定的日历字段的值
  3. getActualMaximum(int field):返回指定的日历字段可能拥有的最大值
  4. getActualMinmum(int field):返回指定的日历指定字段刻康拥有的最小值
  5. roll(int field,int var):与add()方法类似,区别在于加上var后超过了该字段所能表示的最大范围时,也不会向上一个字段进位
  6. set(int field,int var):将指定的日历字段设置为给定值
  7. set(int year,int mounth,int date): 设置Calendar对象的年月日字段值
    下面举例说明:
	public static void main(String[] args) {
		//获得Calendar实例对象
		Calendar cal = Calendar.getInstance();
		//获得年
		int year = cal.get(Calendar.YEAR);
		//获得月
		int month = cal.get(Calendar.MONTH)+1;
		//获得日
		int date = cal.get(Calendar.DATE);
		System.out.println(year+":"+month+":"+date);
		//设置年
		cal.set(Calendar.YEAR, 2020);
		//将当前日历年向后推一年
		cal.add(Calendar.YEAR, 1);
		System.out.println( cal.get(Calendar.YEAR)+":"+month+":"+date);
	}

上面程序中对Calendar中的方法进行演示,注意用Calendar获得月份时,所获得的月份是当前月份的上一个月,所以要加1。

日期的输入与输出

日期的输入时间字符串转换为Date对象。日期的输出时间Date对象转换为有格式的字符串。
java中提供了DateFormat抽象类可以对其进行处理,DateFormat是日期/时间格式化子类的抽象类,它以语言无关的方式格式化并分析日期或时间。日期/时间格式化子类(SimpleDateFormat)允许进行格式化(也就是日期-->文本)、分析(文本-->日期)和标准化。
DateFormat是一个抽象类,在实际应用中需要用倒其对应的实现类SimpleDateFormat。SimpleDateFormat是一个以与语言环境相关的方式来格式化和分析日期的具体类。它允许进行格式化、分析和规范化,用法如下:

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");

构建SimpleDateFormat一般提供日期的格式有“yyyy-MM-dd”,"yyyy-MM-dd HH:mm:ss","yyyyMMdd","dd/MM/yyyy","MM/dd/yyyy"
fmt.parse(String)可以实现字符串解析为日期类型,经过常用于处理日期输入
'fmt.format(Date)'可以把日期格式化为字符串用于输出处理
下面举例:


	public static void main(String[] args) throws ParseException {
		//日期与字符串
		String d = "2020-07-03";
		//规定日期格式为年-月-日
		SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		//将指定字符串转换为Date
		Date date = fmt.parse(d);
		//将指定Date转化为格式字符串输出
		Date date1 = new Date();
		String ds = fmt.format(date1);
		System.out.println(ds);
	}

4. 包装类