实用类介绍
JavaAPI
JDK中提供了一些常用的接口和类来让我们使用,方便我们去简化代码,我们可以称为JavaAPI.java帮助文档也能称做JavaAPI.我们比较常用的API包括:
1.java.lang包
其中常用的类有:
枚举类(Enum)、包装类、Math类、String类、StringBuffer类、System类等.
2.java.util包
其中常用的类有:
Scanner类、Random类、Date类、Calendar类等
3.java.io包
4.java.sql包
枚举类
枚举指由一组固定的常量组成的类型,用enum修饰类名,与class修饰的普通类区别开.
枚举类的语法如下:
[Modifier]enum enumName{
enumContantName1,[enumConstantName2],......
}
在程序中,有些类型的数据通常只有固定的几种输入,比如性别只有男和女,如果我们不对性别这个属性进行控制,一旦发生输入无效信息的情况,就会很麻烦,而枚举则将固定的几种常量列出来,如果不按枚举规定的值来填,代码直接就会报错,程序也无法运行.使用枚举就能确保属性输入的安全性和正确性.
public enum Genders{ //性别枚举
Male,Female
}
public class Student{
public Genders sex; //枚举类型的变量
}
public class Test{
public static void main(String[]args){
Student stu = new Student();
stu.sex=Gender.Male;
}
}
在定义枚举类中的常量的时候,与变量命名规则相同,不能以数字开头.
使用枚举类的优点:
1、类型安全(只能输入枚举里列出的常量)
2、易于输入(直接点出常量)
3、代码清晰
包装类
包装类就是把基本类型的数据转换为对象.每个基本类型数据在java.lang包中都有一个相应的包装类.
在一些基本类型数据无法使用的场合,比如集合不允许存放基本类型数据,存放数字的时候,我们就需要用到包装类型.
如图所示,除了int和char基本类型外,其他基本类型对应的包装类型都是将基本类型首字母改成大写,而int的对应包装类为Integer,char的对应包装类为Character.
包装类的特点:
1、JDK1.5后,允许基本类型数据和包装类型数据进行混合数学运算
2、包装类并不是用来取代基本类型的,在基本类型需要用对象表示时使用
此外,包装类还提供了一系列实用的方法:
1、包装类的构造方法
(1)所有包装类都可将与之对应的基本类型数据作为参数来构造它们的实例。
public Type (type value) //Type根据基本类型来写对应的包装类名
如:Integer i =new Integer(5);
(2)除了Character类外,其他包装类可将一个字符串(Number类的内容必须对应基本类型)作为参数来构造它们的实例
public Type(String value) //Type根据基本类型来写对应的包装类名
如:Integer i =new Integer(“123”);
需要注意的是:
(1)Boolean类构造方法参数为String类型时,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,如果是false或者其他字符串,都表示false.
(2)当Number包装类构造方法参数为String类型时,字符串不能为null,且该字符串必须可解析为相应的基本数据类型的数据,否则编译通过,但运行时报NumberFormatException异常.
2、包装类的常用方法
(1)XXXValue();
包装类转换成基本类型,XXX表示某基本类型
如:
Integer integerId =new Integer(25);
int intId =integerId.intValue();
(2)toString();
以字符串形式返回包装对象表示的基本类型数据,即
基本类型——>字符串
String sex =Character.toString(‘男’);
String id =Integer.toString(25);
或
String sex = '男'+“”;
String id =25+"";
(3)parseXXX();
把字符串转换为相应的基本数据类型数据,XXX表示某基本类型 ,即
字符串——>基本类型(Character除外)
int num =Integer.parseInt("36");
boolean bool =Boolean parseBoolean("false");
(4)valueOf();
作用与构造方法相同
(1)所有包装类都有如下方法(基本类型——>包装类)
public static Type.valueOf(type value); //Type为对应包装类名
如:Integer intValue =Integer.valueOf(21);
(2)除Character类外,其他包装类都有如下方法(字符串——>包装类)
public static Type.valueOf(String s); //Type为对应包装类名
如:Integer intValue = Integer.valueOf(“21”);
装箱和拆箱
装箱和拆箱就是一个把基本类型和包装类之间的自动转换过程.
装箱
基本类型转换为包装类的对象,称为装箱
Integer intObject =5;
拆箱
包装类对象转换为基本类型的值
int intValue =intObject;
Math类
Java.lang.Math类提供了常用的数学运算方法和两个静态常量E(自然对数的底数)和PI(圆周率).
常用的方法如下:
(1)abs();
取绝对值的方法.
Math.abs(-3.5); //返回3.5
(2)max()/min();
比较两个值或者变量之间的大小
Math.max(2.5,90.5); //返回90.5
Math.min(2.5,90.5); //返回2.5
(3)random();
随机生成0~1之间的浮点数
int random =(int)(Math.random() *10) //生成0~9之间的随机数
Random类
Random类位于java.util包中,主要是用来生成各种类型的随机数.
Random rand =new Random(); //创建一个Random对象
for(int i=0;i<20;i++){ //随机生成20个随机整数并显示
int num =rand.nextInt(10); //返回下一个整型的伪随机数
System.out.println("第"+(i+1)+"个随机数是:"+num);
}
Random类中常用的几个方法:
rand.nextInt(); int范围内的随机整数
rand.nextInt(10); 0~10(不含10)的随机整数
注意:
用同一个种子值来初始化两个Random对象,然后用每个对象调用相同的方法,得到的随机数也是相同的
无参构造种子不同 (Random random = new Random(); )
String类
String类位于java.lang包中,用来存储字符串数据,在程序中使用非常频繁.比如用户输入的数据,可以用String类型去接收.
使用String对象存储字符串的方式:
String s ="Hello";
String s =new String();
String s =new String("Hello");
String类具有丰富的方法(计算字符串长度、比较字符串、连接字符串、提取字符串等)
length()方法
String类提供了length()方法,用来确定字符串的长度,返回字符串中的字符数(与数组length属性相似,但是这里length()是方法)
String password =input.next();
if(password.length()<6){
System.out.println("密码长度小于6位);
}
equals()方法
String类中重写了Object类的equals方法,用来比较存储在两个字符串对象的内容是否一致.
比较原理:检查组成字符串内容的每个字符是否完全一致
"=="与equals()的区别:
“ == ”判断的是两个字符串在内存中的地址,即判断是否是同一个字符串对象,Object类中的equals()方法与“ == ”的作用相同,但String类中的equals()方法与==不同,用来比较存储在两个字符串对象的内容是否一致.
模拟4种情况下==和equals()的结果,以及创建了几个对象:
场景1
String s1="hello";
String s2="hello";
s1==s2; //返回true
s1.equals(s2); //返回true
在该场景中,变量s1和s2都是在常量池(堆栈内存外的字符串池)中创建了一个hello对象的内存,由于字符串池中不能有重复的对象,所以该场景下s1和s2指向的都是常量池中的hello,创建了1个对象.
场景2
String s1="hello";
String s2= new String("hello");
s1==s2; //返回false
s1.equals(s2); //返回true
该场景中,s1和s2共用了常量池中的hello对象,但s2在堆内存中又创建了一个hello的对象,所以此时s1指向的是常量池中的hello,s2指向的是堆内存中hello对象的内存地址,所以一共创建了2个对象,且s1!=s2,但s1和s2的内容都是hello.
场景3
String s1= new String("hello");
String s2= new String("hello");
s1==s2; //返回false
s1.equals(s2); //返回true
该场景中,s1和s2共用了常量池中的hello对象,但s1和s2在堆内存中又分别创建了两个hello的对象,所以此时s1指向的是堆内存中的s1对应的hello对象的内存地址,s2指向的是堆内存中s2对应的hello对象的内存地址,所以一共创建了3个对象,且s1!=s2,但s1和s2的内容都是hello.
场景4
String s1= "Hello";
String s2= new String("hello");
s1==s2; //返回false
s1.equals(s2); //返回false
该场景中,s1和s2在常量池中分别创建了Hello和hello两个对象,但s2在堆内存中又创建了一个hello的对象,所以此时s1指向的是常量池中的Hello,s2指向的是堆内存中hello对象的内存地址,所以一共创建了3个对象,且s1!=s2,s1和s2的内容也不相同.
字符串比较除了用equals()以外,如果有些场合不需要去区分对比字符串的大小写,就可以用到其他三种方法:
equalsIgnoreCase()方法
忽略大小写比较
String str1 ="tom";
String str2 ="TOM";
str1.equalsIgnoreCase(str2) //结果为true
toLowerCase()方法
全部转换成小写字母
String str1 ="tom";
String str2 ="TOM";
str1.toLowerCase().equals(str2.toLowerCase()) //结果为true
toUpperCase()方法
全部转换成大写字母
String str1 ="tom";
String str2 ="TOM";
str1.toUpperCase().equals(str2.toUpperCase()) //结果为true
concat()方法
用来进行字符串的连接操作
String字符串的连接可以有两种方式:
1、使用"+"号直接连接两个字符串
2、使用String类的concat()方法
String s1 ="a"+"b";
s1 = s1.concat("dddd");
字符串常用的提取方法
String s1 =" 我爱中华人民共和国 ";
int index1 = s1.indexOf("人");
int index2 = s1.lastIndexOf("人");
String str1 =s1.substring(2);
String str2 =s1.substring(4,6);
String newStr =s1.trim();
注意:
substring()方法中,参数为int beginindex, int endindex时,提取beginindex和endindex之间的字符串部分,包含开始位置,不包含结束位置
split();
通过参数String s 将字符串拆分,分开后的每一部分都存在一个数组里,返回一个字符串数组String[] strs
如:
String[] infos =info.split("*");
charAt();
提取出字符串中下标为输入的参数位置的字符,返回一个char类型的字符
String msg = "我爱你中国";
char m = msg.charAt(2);
StringBuffer类
StringBuffer类和String类是两个不同的类,但都是用来存储字符串数据的,对字符串频繁修改(如字符串连接)时,使用StringBuffer类可以大大提高程序执行效率,因为StringBuffer修改字符串本身而不是副本,而String类是不修改本身数据的.
StringBuffer的声明
StringBuffer strb =new StringBuffer();
StringBuffer strb =new StringBuffer("aaa");
可以通过构造方法将String类型数据转换为StringBuffer类型数据
StringBuffer的使用方法
(1)toString(); 转化为String类型
(2)append("**"); 追加字符串
(3)insert(1,"**"); 从参数位置插入指定字符串参数
(4)length(); 获得字符串的字符长度
Date类
java.util.Date类,表示日期和时间,提供操作日期和时间各组成部分的方法,但获得的是西方的时间表示方式,我们在用的时候需要通过SimpleDateFormat类来对日期格式进行格式化
Date date =new Date();
SimpleDateFormat类
java.text.SimpleDateFormat类,用来定制日期时间的格式
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") //参数字母大小写有格式要求,可查帮助文档
String now =sdf.format(Date date);
System.out.println(now);
Calendar类
(日历)抽象类,用于设置和获取日期/时间数据的特定部分,提供了一些方法和静态字段来操作日历
无法new,创建对象方法:
Calendar t =Calendar.getInstance();
Calendar类提供了一些方法和静态字段来操作日历:
注意:
1、西方月份从0开始计算,实际使用的时候,我们需要在这个静态字段基础上加1才是我们实际月份
2、西方一周从周日开始算第一天,实际使用的时候,我们需要在这个静态字段的基础上减1才是我们实际的星期几