Java常用类
Java常用类
String类
String类又称不可变字符序列。 String位于java.lang包中,Java程序默认导入java.lang包下的所有类。Java字符串使用Unicode。注意,它是不可变的:
创建字符串
String str = 'test'
常量池
- 全字符串常量池:全局字符串常量池中存放的内容是在类加载完成后存到String Pool中的,在每个VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)。
- class文件常量池:class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量(文本字符串、final常量等)和符号引用。
- 运行时常量池:运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。
String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上:
String str1 = "abc";
String str2 = new String("def");
String str3 = "abc";
String str4 = str2.intern();
String str5 = "def";
System.out.println(str1 == str3);// true
System.out.println(str2 == str4);// false
System.out.println(str4 == str5);// true
==比较地址,所以通常情况下比较字符串使用equals()。
常用API
- 返回指定下标字符:char charAt(int index)
- 字符串判等: boolean equals(String other)
- 忽略大小写判等: boolean equalsIgnoreCase(String other)
- 查找字符首次出现位置: int indexOf(String str)
- 查找字符最后出现位置: int lastIndex(String str)
- 字符串长度: int length()
- 字符串替换: String replace(char oldChar, char newChar)
- 开头检查: boolean startsWith(String prefix)
- 结尾检查: boolean endWith(String prefix)
- 截取: String substring(int beginIndex, int endIndex)
- 大写转小写: String toLowerCase()
- 小写转大写: String toUpperCase()
- 去除头尾空格: String trim()
StringBuffer和StringBuilder
StringBuffer和StringBuilder非常类似。 这两个类都是抽象类AbstractStringBuilder的子类,方法几乎一模一样,均代表可变的字符序列:
二者的区别:
- StringBuffer是JDK1.0版本提供的类,线程安全,做线程同步检查, 效率较低。
- StringBuilder是JDK1.5版本提供的类,线程不安全,不做线程同步检查,因此效率较高。 建议采用该类。
常用方法:
- 添加字符序列:public StringBuilder append(…)
- 删除序列:public StringBuilder delete(int start,int end)
- 删除字符:public StringBuilder deleteCharAt(int index)
- 插入序列:public StringBuilder insert(…)
- 字符序列逆序: public StringBuilder reverse()
不可变和可变字符序列使用陷阱
String一经初始化后,就不会再改变其内容了。对String字符串的操作实际上是对其副本(原始拷贝)的操作。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的时间和空间性能,甚至会造成服务器的崩溃。
相反,StringBuilder和StringBuffer类是对原字符串本身操作的,可以对字符串进行修改而不产生副本拷贝或者产生少量的副本。因此可以在循环中使用。
时间处理相关类
在计算机世界 1970 年 1 月 1 日 00:00:00 为基准时间,每个度量单位是毫秒。用long类型的变量来表示时间。
long now = System.currentTimeMillis();
Date类
在标准Java类库中包含一个Date类。它的对象表示一个特定的瞬间,精确到毫秒。
- Date() 分配一个Date对象,并初始化此对象为系统当前的日期和时间,可以精确到毫秒。
- Date(long date) 分配 Date 对象并初始化此对象。
- 测试此日期是否在指定日期之后:boolean after(Date when)
- 测试此日期是否在指定日期之前:booleanbefore(Date when)
- 比较两个日期的相等性:boolean equals(Object obj)
- 返回自基准时间以来的毫秒数:long getTime()
- 把此 Date 对象转换为 String: String toString()
- dow mon dd hh:mm:ss zzz yyyy
DateFormat类和SimpleDateFormat类
把时间对象转化成指定格式的字符串。反之,把指定格式的字符串转化成时间对象。DateFormat是一个抽象类,一般使用它的的子类SimpleDateFormat类来实现。
使用示例:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestDateFormat {
public static void main(String[] args) throws ParseException {
// new出SimpleDateFormat对象
SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd");
// 将时间对象转换成字符串
String daytime = s1.format(new Date());
System.out.println(daytime);
System.out.println(s2.format(new Date()));
System.out.println(new SimpleDateFormat("hh:mm:ss").format(new Date()));
// 将符合指定格式的字符串转成成时间对象.字符串格式需要和指定格式一致。
String time = "2007-10-7";
Date date = s2.parse(time);
System.out.println("date1: " + date);
time = "2007-10-7 20:15:30";
date = s1.parse(time);
System.out.println("date2: " + date);
}
}
Calender类
Calendar 类是一个抽象类,为我们提供了关于日期计算的相关功能,比如:年、月、日、时、分、秒的展示和计算。GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
使用示例:
import java.util.*;
public class TestCalendar {
public static void main(String[] args) {
// 得到相关日期元素
GregorianCalendar calendar = new GregorianCalendar(2999, 10, 9, 22, 10, 50);
int year = calendar.get(Calendar.YEAR); // 打印:1999
int month = calendar.get(Calendar.MONTH); // 打印:10
int day = calendar.get(Calendar.DAY_OF_MONTH); // 打印:9
int day2 = calendar.get(Calendar.DATE); // 打印:9
// 日:Calendar.DATE和Calendar.DAY_OF_MONTH同义
int date = calendar.get(Calendar.DAY_OF_WEEK); // 打印:3
// 星期几 这里是:1-7.周日是1,周一是2,。。。周六是7
System.out.println(year);
System.out.println(month);
System.out.println(day);
System.out.println(day2);
System.out.println(date);
// 设置日期
GregorianCalendar calendar2 = new GregorianCalendar();
calendar2.set(Calendar.YEAR, 2999);
calendar2.set(Calendar.MONTH, Calendar.FEBRUARY); // 月份数:0-11
calendar2.set(Calendar.DATE, 3);
calendar2.set(Calendar.HOUR_OF_DAY, 10);
calendar2.set(Calendar.MINUTE, 20);
calendar2.set(Calendar.SECOND, 23);
printCalendar(calendar2);
// 日期计算
GregorianCalendar calendar3 = new GregorianCalendar(2999, 10, 9, 22, 10, 50);
calendar3.add(Calendar.MONTH, -7); // 月份减7
calendar3.add(Calendar.DATE, 7); // 增加7天
printCalendar(calendar3);
// 日历对象和时间对象转化
Date d = calendar3.getTime();
GregorianCalendar calendar4 = new GregorianCalendar();
calendar4.setTime(new Date());
long g = System.currentTimeMillis();
}
static void printCalendar(Calendar calendar) {
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
int date = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 星期几
String week = "" + ((date == 0) ? "日" : date);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.printf("%d年%d月%d日,星期%s %d:%d:%d\n", year, month, day,
week, hour, minute, second);
}
}
Math类
java.lang.Math提供了一系列静态方法用于科学计算;其方法的参数和返回值类型一般为double型。如果需要更加强大的数学运算能力,计算高等数学中的相关内容,可以使用apache commons下面的Math类库。
常用方法:
- 绝对值:abs
- 三角函数:acos,asin,atan,cos,sin,tan
- 平方根:sqrt
- a的b次幂:pow(double a, double b)
- 取最大值:max(double a, double b)
- 取最小值:min(double a, double b)
- 向上取整:ceil(double a)
- 向下取整:floor(double a)
- 取0.0 到 1.0 的随机数:random()
- double型的数据a转换为long型:long round(double a)
- 弧度转角度:toDegrees(double angrad)
- 角度转弧度:toRadians(double angdeg)
File类
java.io.File类:代表文件和目录。 在开发中,读取文件、生成文件、删除文件、修改文件的属性时经常会用到本类。
常用方法:
- 常见构造方法:public File(String pathname)
- 以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储
- 访问文件属性:
- 判断File是否存在:public boolean exists()
- 判断File是否是目录:public boolean isDirectory()
- 判断File是否是文件:public boolean isFile()
- 返回File最后修改时间:public long lastModified()
- 返回File大小:public long length()
- 返回文件名:public String getName()
- 返回文件的目录路径:public String getPath()
- 创建文件或目录:
- 创建新的File:createNewFile()
- 删除File对应的文件:delete()
- 创建一个目录:mkdir()
- 创建多个目录:mkdirs()
枚举类
JDK1.5引入了枚举类型。枚举体就是放置一些常量。枚举类型的定义包括枚举声明和枚举体。格式如下:
enum 枚举名{
枚举体 (常量列表)
}
所有的枚举类型隐性地继承自 java.lang.Enum。枚举实质上还是类,而每个被枚举的成员实质就是一个枚举类型的实例,他们默认都是public static final修饰的。可以直接通过枚举类型名使用它们。
当你需要定义一组常量时,可以使用枚举类型。另外尽量不要使用枚举的高级特性,事实上高级特性都可以使用普通类来实现,没有必要引入枚举,增加程序的复杂性。
枚举的使用示例:
import java.util.Random;
public class TestEnum {
public static void main(String[] args) {
for (Week k : Week.values()) {// 枚举遍历
System.out.println(k);
}
int a = new Random().nextInt(4); // 生成0,1,2,3的随机数
switch (Season.values()[a]) {// switch语句中使用枚举
case SPRING:
System.out.println("春天");break;
case SUMMER:
System.out.println("夏天");break;
case AUTUMN:
System.out.println("秋天");break;
case WINDTER:
System.out.println("冬天");break;
}
}
}
enum Season {
SPRING, SUMMER, AUTUMN, WINDTER
}
enum Week {
星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日
}