目录
第13章常用类
本章目标
-
掌握包装类的使用
-
掌握 String 与 StringBuffer 的区别
-
掌握 StringBuffer 与 StringBuilder 的区别
-
掌握Math类的使用
-
掌握日期与时间类的使用
本章介绍Java中基本数据类型的包装类,关于字符串的String类、StringBuffer类和 StringBuilder类,关于数学运算的Math类以及关于日期和时间的常用类。在本章中大家 不需要记住每一类中的每一个方法,而主要的是掌握査询API文档的能力。
13.1包装类
13.1.1为什么需要包装类
Java是面向对象的编程语言,数据类型可分为两大类,一类是基本数据类型,一类是 引用数据类型。而Java中的基本数据类型不是面向对象的,所以Java为八大基本数据类 型提供了相对应的包装类,如表13-1所示,即将基本数据类型的值封装到类中,提供属 性和方法,从而更方便的去操作对象。另外在Java中还有一种容器叫做集合,只能存储对象类型,所以要将整数等基本数据类型的数据存储到集合中就必须要使用到基本数据类型的包装类。
表13-1八大基本数据类型对应的包装类
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
double | Double |
float | Float |
boolean | Boolean |
char | Character |
13.1.2包装类的继承关系图
13.1.3以Integer类为例学习包装类
在学习一个类时,通常应该从类的定义、构造方法、常用方法等几个方面进行学习, 我们将以Integer类为例来学习包装类。
1.Integer类的定义
Integer类的定义如下代码所示:
public final class Integer
extends Number
implements Comparable<Integer>
Integer类的定义中继承Number类在前,实现Comparable接口在后,Number类中的方法可以被Integer重写或调用,实现Comparable接口,说明Integer的对象具有比较大小的能力。
2. Integer类的构造方法
Integer类的构造方法主要有两种,分别如下所示:
构造方法 | 参数描述 |
---|---|
Integer(int value) | 构造一个新分配的Integer对象,它表示指定的int值 |
Integer(String s) | 构造一个新分配的Integer对象,它表示String参数所指示的int值 |
3. Integer类的属性
MAX_ VALUE | 值为231-1的常量,它表示int类型能够表示的最大值 |
---|---|
MIN_ VALUE | 值为-211的常量,它表示int类型能够表示的最小值 |
输出Integer类的最大值与最小值如示例13-1代码所示。其运行效果如图13 - 2所示。
【示例13 - 1】输出Integer的最大值与最小值。
package NnmberPack;
public class Test13_1 {
public static void main(String[] args) {
/*类的属性*/
System.out.println("最大值:"+Integer.MAX_VALUE);
System.out.println("最小值:"+Integer.MIN_VALUE);
System.out.println("--------------------------");
/*最大值加1,最小值减1*/
System.out.println("最大值加1:"+(Integer.MAX_VALUE+1));
System.out.println("最小值减1:"+(Integer.MIN_VALUE-1));
}
}
从图13-2中可以看到最大值加1就变成了最小值,而最小值减1就变成了最大值, 为什么呢?看图13-3 Integer类中最大值与最小值的定义。最大值与最小值釆用的是十六 进制的表式形式,十六进制的Ox7fffffff加上1为0x80000000,刚好与最小值的十六进制 表式形式完全相同,所以最大值加1就成了最小值,而十六进制的最小值0 X8000000。减1 为0x7fffffff,刚好与最大值的十六进制表式形式相同,所以最小值减1就成了最大值。
- Integer类的常用方法
Integer类的常用方法如表13-2所示。
表13-2 Integer类的常用方法
序号 | 返回值类型 | 方法名称 | 描 述 |
---|---|---|---|
1 | String | toString() | 重写Object类的方法,表示该Integer 值的String对象 |
2 | boolean | equals(Object obj) | 重写Object类的方法,用于比较两 个Integer对象的值是否相同 |
3 | int | compareTo(Integer another) | 实现Comparable接口中的方法,用 于比较两个Integer对象的值的大小, 返回值为-1、0、1 |
4 | int | intValue() | 得到int类型的Integer对象的值 |
5 | static int | parselnt( String s) | 得到String对象所表示的int类型的值 |
6 | static String | toBinaryString( int i) | 得到int类型值的二进制字符串表示形式 |
7 | static String | toHexString(int i) | 得到int类型值的十六进制字符串表示形式 |
8 | static String | toOctalString( int i) | 得到int类型的值的八进制字符串表示形式 |
9 | static Integer | valueOf(String s) | 得到String对象所表示的Integer类型的对象 |
10 | static Integer | valueOf(int i) | 得到int类型值的Integer类型的对象 |
Integer类的常用方法的使用如示例13-2所示,运行效果如图13-4所示。
【示例13 -2] Integer类的常用方法。
package NnmberPack;
/*Integer类常用方法*/
public class Test13_2 {
public static void main(String[] args) {
Integer i1=new Integer(123);
Integer i2=new Integer("123");
/*(1)toString方法一>重写Object类的方法*/
System.out.println("i1="+i1.toString());
// Integer 类重写了 Object 类中的 toString 方法
System.out.println("i2="+i2);
/*(2)equals方法一> 重写Object类的方法,用于去比较对象值是否相同*/
//比较的是内存地址(引用)
System.out.println("i1==i2:"+(i1==i2));
//比较的是对象的值
System.out.println("i1.equals(i2):"+i1.equals(i2));
/*(3) compareTo 方法一>实现 Comparable 接口中的方法 0, -1, 1*/
Integer i3=new Integer( 10);
System.out.println("i1.compareTo(i3)="+i1.compareTo(i3));
/*(4) intValue方法,一>将Integer类型的对象转为int类型*/
//拆箱操作
int numA= i3.intValue();
System.out.println("numA="+numA);
/*(5)parseInt(String s)将 String 转 int */
int num=Integer.parseInt("123");
System.out.println("num="+num);
/*NumberFormatException 异常,在运行产生的,
所 〃以是运行时异常,可处理也可不处理*/
//int num=Integer.parseInt("ABC");
/*(6)进制的转换*/
//转成二进制
String strB=Integer.toBinaryString(5);
System.out.println("strB="+strB);
//转成 16 进制
String strH=Integer.toHexString(123);
System.out.println("strH="+strH);
/*(7) valueOf(int i) ,valueOf(String s)转成 Integer 类*/
Integer ii=Integer.valueOf(10);
Integer ii2=Integer.valueOf("10");
System.out.println("ii="+ii+"\n"+"ii2="+ii2);
}
}
在JDK1. 5中新增特性自动装箱和自动拆箱。基本数据类型自动封装到与它相同类型 的包装类中,称为自动装箱。包装类对象自动转换成基本数据类型的数据,称为自动拆箱。 如示例13-3所示,运行效果如图13-5所示。
【示例13-3]自动拆装箱。
package numberPack;
/*Integer自动拆装箱*/
public class Test13_3 {
public static void main(String[] args) {
//自动装箱
Integer i1=127;
Integer i2=127;
//自动拆箱
int i=i1;
System.out.println("i1==i2:"+(i1==i2));
System.out.println("i="+i);
}
}
13.2字符串相关类
字符串是常量,它们的值在创建之后不能更改。因为String对象是不可变的,所以可 以共享。String的底层数据结构是char类型的数组,数组的长度一旦声明就不可更改。 String 类位于 java.lang 包中。
13.2.1 String类
public final class String
extendsObject implementsSerializable, ComparableVString> , CharSequence
从String类的定义可知,String类是使用关键字final修饰的类,所以String不允许拥有子类,该类直接继承了Object类,所以可以对Object类中的方法直接进行调用或者重写,该类实现了 Serializable 接口、Comparable 接口和 CharSequence 接口说明 String 类具备了三种能力,其中实现Comparable接口,说明String类具备了比较大小的能力。
1. String类的构造方法
String类的构造方法如下所示:
构造方法 | 参数描述 |
---|---|
String() | 初始化一个新创建的String对象,使其表示一个空字符序列 |
String (String original) | 初始化一个新创建的String对象,使其表示一个与参数相同的字符序 列;换句话说,新创建的字符串是该参数字符串的副本 |
String(char[] value) | 分配一个新的String,使其表示字符数组参数中当前包含的字符序列 |
String ( byte [] bytes, int offset, int length) | 通过使用平台的默认字符集解码指定的byte子数组,构造一个新的String |
【示例13 -4】String类构造方法的使用。
package stringClass;
// String类构造方法的使用
public class Test13_4 {
public static void main(String[] args) {
/*1.String()*/
//调用无参构造方法创建一个String类型的对象str1
String str1=new String();
System.out.println("str1="+str1);
/*2.String(String original)*/
String str2=new String("hello");
System.out.println("str2="+str2);
/*3.String(char[] value)*/
char[] chars = {97,98,99};
String str3=new String(chars);
System.out.println("str3="+str3);
/*4.String(byte[] bytes, int offset, int length)*/
byte[] bytes={97,98,99};
String str4=new String(bytes,0,bytes.length);
System.out.println("str4="+str4);
}
}
13.2.2 StringBuffer类与StringBuilder类
String被称为常量,一旦创建其值不能更改但可以共享。在多个字符串连接时将会开辟很多新的空间,造成了大量内存空间的浪费。而StringBuffer类与StringBuilder类则是可变长度的字符串,在字符串拼接处理上将大大提高效率。
StringBuffer类与StringBuilder类的异同点如下:
(1) 共同点:底层数据结构都是char类型数组,都是可变的字符串。
(2) 不同点:StringBuffer是JDK1. 0版,线程同步的安全性高,但是多线程操作时效率低。StringBuilder是JDK1. 5版,线程不同步,在多线程操作时安全性低,但效率高。
1. StringBuffer 类的定义
StringBuffer类的定义如下所示:
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable,CharSequence
StringBuffer使用final关键字进行修饰,说明该类不允许拥有子类,直接继承了父类 AbstractStringBuilder类,该类是从JDK1. 5开始,该类为抽象类,子类StringBuffer需要实现该类中的N多抽象方法。StringBuffer这个类实现了两个接口,说明该类具备了两种能力。
2. 类的构造方法
构造方法 | 参数描述 |
---|---|
StringBufferO | 构造一个没有字符的字符串缓冲区,初始容量为16个字符 |
StringBuffer( String str) | 构造一个初始化为指定字符串内容的字符串缓冲区,初始容量为str. length () + 16 |
【示例13-8】创建StringBuffer对象。
package bufferAndBulider;
/*创建StringBuffer对象*/
public class Test13_8 {
public static void main(String[] args) {
/*实际上是创建一个长度为16的char类型的数组*/
StringBuffer sb1=new StringBuffer();
System.out.println(sb1);
/*实际上创建的是一个长度为5 + 16长度的数组*/
StringBuffer sb2=new StringBuffer("hello");
System.out.println(sb2);
}
}
13.2.3StringBuffer的扩容原理
StringBuffer的底层数组结构采用的是char类型的数组,所以在使用StringBuffer对象的append()方法追加数据时,如果char类型数组的长度无法容纳所要追加的数据 时,StringBuffer就开始进行扩容,扩容所使用的是Arrays类中的copyOf(...)方法,每次扩容的容量大小是原来的容量的2倍加2。
13.3日期时间类
编写程序离不开日期和时间,在Java中为我们提供了N多个类来进行日期和时间的操作,Java中日期和时间相关类的体系结构如图13-16所示。
13.3.1 Date 类
在Java中使用Date类来处理日期,创建Date类的对象,将得到当前的系统时间。 Date类位于java.util包中。java.sql包中也包含Date类,而我们所使用的是java. util包中 的Date类,java.sql包中的Date类是java. util包中Date类的子类。
【示例13-10】创建Date类的对象
package dateClass;
import java.util.Date;
/*创建Date类的对象*/
public class Test13_10 {
public static void main(String[] args) {
/*Date类的构造方法*/
Date date=new Date();//当前的系统时间
System.out.println("当前系统时间:"+date.toString());//输出
/*使用Date类的带参构造方法创建Date类对象*/
Date date1=new Date(1000);
System.out.println("计算机起始时间:"+date1.toString());
}
}