Java中的常用类
Java中的常用类
说到Java中常用的类,就会想到Java API。
Java API
API(Application Programming Interface):应用程序编程接口,是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
Java API:指的就是Java API文档,是对Java提供的类的使用说明书。
学习Java API的目的就是学习Java中类的使用方法
其实它就像一本字典,当你对一个java类库中类的方法不是很懂时就可以查看Java API 来帮助自己理解。
从而我们说的常用类就是我们查阅Java API文档时经常查看和运用的类。
不同的JDK版本有对应的Java API文档
自JDK9提供了新的java基础组件,模块(module)。是在包的基础之上有进行了一次封装,是包的容器
JDK8中组件的层次结构:包(package)->类或接口(class/interface)
JDK11中组件的层次结构:模块->包->类或接口
这就导致Java API文档的分层不同
相应的API文档可以通过百度就可以查到 Java11 API文档
Object类
是类的层次结构中最顶层的基类,所有的类都直接或间接继承Object类,故所有类都是一个Object对象
构造方法
- Object() :构造一个对象,所有子类对象初始化都会优先调用该方法
成员方法
int hashCode(); //返回对象的哈希码值,该方法通过对象的地址值进行计算,不同对象的返回值一般不同
Class<?> getClass(); //返回调用此方法对象的运行时类对象(调用者的字节码文件对象)
String toString(); //返回该对象的字符串表示 即对象的地址值 格式为:全类名+@+无符号16进制的哈希码值
boolean equals(Object obj); //返回其他某个对象是否与此对象"相等",这里相等意思为两个对象的引用(地址值)相等
标准类重写Object类的方法
标准类就是我们常说的JavaBean类:满足4个条件:1.所有属性为私有(private) 2.提供默认的构造方法 3.提供getter和setter方法 4.实现serializable接口
重写toString();
由Object的toString()方法我们已经知道,其打印的是对象的地址值,实际应用中我们需要的是对象中每一个属性的值。所以需要重写。
重写equals();
实际应用中我们需要比较的是两个对象的个个属性值,如果相等则认为是相等,而不是Object的equals()方法中的地址值相等。所以需要重写。
上述两个方法,JavaIDE已经帮我们设计好了
泛型< E >和Object类的关联
在JDK1.5之前,没有泛型的情况下,通常用Object类型的引用来实现参数“任意化”,"任意化"的缺点就是要做显示的强制类型转换就拿标准类重写Object类中equals()方法为例:
//首先讲一下Object的特点:1.可以引用任意类型实例 2.可以存储任意类型的值
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return score == student.score &&
Objects.equals(sno, student.sno) &&
Objects.equals(name, student.name);
}
//Student作为一个标准类去重写equals方法,那么假设我用两个Student对象s1,s2去调用equals方法即s1.euqals(s2);
//那s2就需要向上转型为Object类型(自动类型转换)将值赋给o对象
//但要比较s1对象的属性值时就需要向下转型(强制类型转换)为Student类型即(Studnet)o 才能调用相应属性
而这种强制类型转换需要开发者对实际参数类型可预知才能进行,所以存在着安全隐患。
为此JDK5诞生了泛型,它的出现保证了类型安全、避免了类型转换(因为它一开始就限定了数据类型)
泛型一般之和集合类结合使用,从JDK7开始,集合定义中后边的泛型不用具体写数据类型了(菱形泛型)
List<String> list = new ArrayList<String>(); //JDK5
List<String> list = new ArrayList<>(); //JDK7
Scanner类
扫描器。能够解析字符串和基本数据类型的数据
构造方法
Scanner(InputStream) :构造一个扫描器,从指定输入流中获取数据。
参数System.in,对应键盘录入。也就是我们常写的Scanner reader = new Scanner(System.in);
成员方法
boolean hasNextXxx(); //判断是否还有下一个输入项,Xxx表示任意基本数据类型
Xxx nextXxx(); //获取下一个输入项,Xxx表示任意数据类型
String nextLine(); //获取下一行数据,以换行符作为分隔符
String next(); //获取下一个输入项,以空白符作为分隔符,空白字符:空格、tab、回车
String类
字符串,每一个字符串对象都是常量
构造方法
String(byte[]) : 构造一个String对象,将指定字节数组中的数据转换成字符串
String(byte[],int,int) :构造一个String对象,将指定字节数组中从索引start位置(包含)的length个字节转换成字符串
String(char[]) : 构造一个String对象,将指定字符数组中的数据转换成字符串
成员方法
//判断功能:
boolean equals(String); //判断当前字符串与给定字符串是否相同,区分大小写
boolean equalsIgnoreCase(String); //判断当前字符串与给定字符串是否相同,不区分大小写
boolean startsWith(String); //判断是否以给定字符串开头
//获取功能:
int length(); //获取当前字符串的长度
char charAt(int index); //获取指定索引位置的字符
int indexOf(String); //获取指定字符(串)第一次出现的索引
int lastIndexOf(String); //获取指定字符(串)最后一次出现的索引
String substring(int); //获取指定索引位置(包含)之后的字符串
String substring(int,int); //获取从索引start位置(包含)起至索引end位置(不包含)的字符串
//替换功能:
byte[] getBytes(); //将字符串转换成字节数组
char[] toCharArray(); //将字符串转换成字符数组
static String valueOf(...); //将指定类型数据转换成字符串,也可以用" "+123转换成字符串
String replace(old,new); //将指定字符替换成新的字符,如字符串中'a'字符全被替换为'b'字符
String[] split(String); //切割字符串,返回切割后的字符串数组
String trim(); //去掉字符串两端的空白字符 如" a " 变为"a"
StringBuilder和StringBuffer类
可变字符序列,用于构造字符串对象。内部使用自动扩容的数组操作字符串数组。
由于StringBuilder和StringBuffer使用相似的API,我就只写了StringBuilder
构造方法
StringBuilder() : 构造一个空的StringBuilder容器
StringBuilder(String) :构造一个StringBuilder容器,并添加指定字符串
成员方法
StringBuilder append(...); //将任意数据添加到StringBuilder容器中
String toString(); //将当前StringBuilder容器转换成字符串
String、StringBuilder、StringBuffer之间的区别
相同点:这三种都是final类,不允许被继承
不同点:
- String是不可变字符序列,StringBuilder和StringBuffer是可变字符序列(两者都可以自动扩容)
- StringBuilder 效率高但线程不安全 StringBuffer 效率低但线程安全
- Sring的添加是需要再创建一个新对象,再重写赋值(因此效率贼低) StringBulider和StringBuffer 则是通过append 方法进行添加
Date和Calendar类
日期类和日历类,用于操作日期相关信息
构造方法
Date(long) : 构造一个日期对象,当前系统时间,精确到毫秒
Date(long) : 构造一个日期对象,时间为自”1970年1月1日00:00:00 GMT“起,至指定参数的毫秒数
// Calendar是一个抽象类,因此调用它需要用Calendar.方法调用
成员方法
long getTime(); //将日期对象转换成对应时间的毫秒值
static Calendar getInstance(); //根据当前系统时区和语言环境获取日历对象 日历中月份用0-11表示1-12月
int get(int field); //返回给定日历的字段的值
void set(int field,int value); //将给定的日历字段设置为指定的值
Date类中大多数的方法是这样的
getDay()表示该方法是过时的尽量避免用这些方法(其实整个类都不推荐使用==)
基本类型的包装类
基本数据类型不是对象,所以Java针对基本类型提供了对应的包装类,以对象的形式来使用
基本类型--包装类
byte--Byte
short--Short
int--Integer
long--Long
char--Character
float--Float
double--Double
boolean--Boolean
装箱:基本类型转包装类型 如 :Integer i1=new Integer(5);
拆箱:包装类型转基本类型 如 :int n = i1.intValue;
JDK5新特性,自动拆装箱
装箱:Integer i2 = 5;
拆箱:int j = i2
成员方法
static 基本类型 parseXxx(String); //将字符串类型的数据转换成对应的基本类型
/* 除了Character类以外,其他的7种包装类都有上述方法,因为Character可以通过String类中的toCharArry(),charAT()方法去转换*/