1.Scanner类
Scanner类主要提供了两个方法:
- hasNextXxx():是否还有下一个输入项,其中Xxx可以是Int、Long等代表基本数据类型的字符串。如果只是判断是否包含下一个字符串,则直接使用hasNext()
- nextXxx():获取下一个输入项
默认情况下,Scanner使用空白(包括空格、Tab空白、回车)作为多个输入项之间的分隔符。下面代码将只把回车作为分隔符:
Scanner sc = new Scanner(System.in);
sc.useDelimiter("\n");
Scanner还提供了两个方法来逐行读取。
- boolean hasNextLine():返回输入源中是否还有下一行
- String nextLine():返回输入源中下一行的字符串
另外,Scanner还可以读取文件输入,例如:
Scanner sc = new Scanner(new File("ScannerFileTest.java");
2.System类
System类代表当前Java程序的运行平台,程序不能创建System类的对象,System类提供了一些类变量和类方法,允许直接通过System类来调用这些类变量和类方法
System类提供了代表标准输入、标准输出和错误输出的类变量,并提供了一些静态方法用于访问环境变量、系统属性的方法,还提供了加载文件和动态链接库的方法。下面程序通过System类来访问操作系统的环境变量和系统属性
public class SystemTest
{
public static void main(String[] args) throws Exception
{
//获取系统所有的环境变量
Map<String,String> env = System.getenv();
for (String name:env.keySet()
{
System.out.println(name + " ---> "" + env.get(name));
}
//获取指定环境变量的值
System.out.println(System.getenv(“JAVA_HOME"));
//获取所有系统属性
Properties props = System.getProperties();
//将所有的系统属性保存到props.txt文件中
Props.store(new FileOutputStream(“props.txt”),”System Properties”);
//输出特定的系统属性
System.out.println(System.getProperty(“os.name”));
}
}
System类还有两个获取系统当前时间的方法:currentTimeMillis()和nanoTime(),前者以毫秒作为单位,后者以纳秒作为单位。但这两个方法返回的时间粒度取决于底层操作系统。如果操作系统不支持,就不可能返回精确的毫秒数
除此之外,System类的in,out,err分别代表系统的标准输入,标准输出和错误输出流。并提供setIn(),setOut(),setErr()来改变系统的标准输入,标准输出和错误输出流。还提供了通知系统进行垃圾回收的gc()方法,以及通知系统进行资源清理的runFinalization()方法
3.Object类
- protected void finalize:当系统中没有引用变量引用该对象时,垃圾回收器调用此方法来清理该对象的资源
- Class<?> getClass():返回该对象的运行时类
自定义类实现克隆:
- 自定义类实现Cloneable接口。这是一个标记性的接口,实现该接口的对象可以实现“自我克隆”,接口里没有定义任何方法
- 自定义类实现自己的clone()方法
- 实现clone()方法时通过super.clone();调用Object实现的clone()方法来得到该对象的副本,并返回该副本。其中如果实例变量的类型时引用类型,Object的Clone机制也只是简单地复制这个引用变量
Object类提供的“自我克隆”机制十分高效。比如clone一个包含100个元素的int[]数组比静态copy方法快斤2倍
4.Objects类
Objects类是一个工具类,例如如果贸然调用toString()方法,则可能引发NullPointerExcetpion异常;但如果使用Objects类提供的toString(Object o)方法,就不会引发空指针异常。它还提供了一个requireNonNull()方法,当传入的参数为null时将会引发NullPointerException异常,该方法主要用来对方法形参进行输入校验
public Foo(Bar bar)
{
this.bar = Objects.requireNonNull(bar);
}
5.String、StringBuffer和StringBuilder类
String类是不可变类,一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的
StringBuffer对象则代表一个字符序列可变的字符串,它提供append()、insert()、reverse()、setCharAt()、setLengtn()方法。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象
StringBuilder类和StringBuffer基本相似,而StringBuffer是线程安全的,性能略高。因此通常情况下应该优先考虑使用StringBuilder类
String类提供的构造器的特殊用途:
- String():创建一个包含0个字符串序列的String对象
- String(byte[] bytes,Charset charset):使用指定的字符集将指定的byte[]数组解码成一个新的String对象
- String(char[] value, int offset, int count):将指定的字符数组从offset开始、长度为count的字符元素连缀成字符串
- String(String original):根据字符串直接量来创建一个String对象。也就是说,新创建的String对象是该参数字符串的副本
- String(StringBuffer buffer):根据StringBuffer对象来创建对应的String对象
- String(StringBuilder builder):根据StringBuilder对象来创建对应的String对象
String还提供了大量方法来操作字符串:
- char charAt(int index):获取字符串中指定位置的字符
- int compareTo(String anotherString):比较两个字符串的大小。如果两个字符串的字符序列想到,则返回0;不相等时,从两个字符串的第0个字符开始比较,返回第一个不相等的字符差。另一种情况,较长的字符串前面部分恰巧时较短的字符串,则返回它们的长度差
- String concat(String str):相当于“+”
- boolean contentEquals(StringBuffer sb):包含的字符序列相同时返回true
- static String copyValueOf(char[] data):将字符数组连缀成字符串,与String(char[] content)构造器的功能相同
- static String copyValueOf(char[] data, int offset, int count):与构造器String(char[] value, int offset, int count)功能相同
- boolean endsWith(String suffix):返回该String对象是否以suffix结尾
- boolean equals(Object anObject):将该字符串与指定对象比较,如果二者包含的字符序列相等,则返回true
- boolean equalsIgnoreCase(String str):同上,忽略大小写
- byte[] getBytes():将该String对象转换成byte数组
- void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):将字符串从srcBegin开始,到srcEnd结束的字符复制到dst字符数组中,其中dstBegin为目标字符数组的起始位置
- int indexOf(int ch):找出ch字符在该字符串中第一次出现的位置
- int indexOf(int ch,int fromIndex):找出ch字符在该字符串中从fromIndex开始后第一次出现的位置
- int indexOf(String str):找出str子字符串在该字符串中第一次出现的位置
- int indexOf(String str,int fromIndex):找出str子字符串在该字符串中从fromIndex开始后第一次出现的位置
- int lastIndexOf(int ch):找出ch字符在该字符串最后一次出现的位置
- String replace(char oldChar,char newChar):将字符串中第一个oldChar替换成newChar
- boolean startsWith(String prefix):是否以prefix开始
- String substring(int beginIndex):获取从beginIndex位置开始到结束的子字符串
- char[] toCharArray():转换成char数组
- String toLowerCase():将字符串转换成小写
- String toUpperCase():将字符串转换成大写
- static String valueOf(X x):一系列将基本类型值转换为String对象的方法
6.ThreadLocalRandom与Random
专门用于生成伪随机数,不是真正随机的。推荐使用当前时间作为Random对象的种子:
Random rand = new Random(System.currentTimeMillis());
ThreadLocalRandom rand = ThreadLocalRandom.current();
int val1 = rand.nextInt(4,20);
7.BigDecimal类
该类是为了防止浮点数精度丢失。推荐使用new BigDecimal(String val)构造器,或者通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象
如果觉得将double数值包装成BigDecimal对象烦琐,可以考虑以BigDecimal为基础定义一个工具类
8.Java 8 的日期、时间类
1.date类
- Date():生成一个代表当前日期时间的Date对象。该构造器在底层调用System.currentTimeMillis()获得long整数作为日期参数
- Date(long date):根据指定的long整数来生成一个Date对象。表示创建的Date对象和GMT 1970年1月1日00:00:00之间的时间差,以毫秒作为计时单位
- boolean after(Date when):测试该日期是否在指定日期when之后
- boolean before(Date when):测试该日期是否在指定日期when之前
9.Calender类
是一个抽象类,用来表示日历,是所有日历类的模版,本身不能直接实例化,程序只能创建Calendar子类的实例。但它提供了几个静态的getInstance()方法来获取Calendar对象,这些方法根据TimeZone,Locale类来获取特定的Calendar,如果不指定TimeZone、Locale,则使用默认的TimeZone、Locale来创建Calendar
- void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量
- int get(int field):返回指定日历字段的值
- int getactualMaximum(int field):返回指定日历字段可能拥有的最大值。例如月,最大值为11
- int getactualMinimum(int field):返回指定日历字段可能拥有的最小值。例如月,最小值为0
- void roll(int field, int amount):与add()方法类似,区别在于加上amount后超过了该字段所能表示的最大范围时也不会像上一个字段进位
- void set(int field, int value):将给定的日历字段设置为给定值
- void set(int year, int month, int date):设置Calendar对象的年月日三个字段的值
add与roll的区别
add(int field, int amount)主要用于改变Calendar的特定字段的值。如果需要增加某字段的值,则让amount为正数;如果需要减少某字段的值,则让amount为负数即可。它有如下两条规则:
当被修改的字段超出它允许的范围时会发生进位
如果下一级字段也需要改变,那么该字段会修正到变化最小的值。例如:
Calendar cal = Calendar.getInstance();
cal.set(2003,7,31,0,0,0);//2003-8-31
//因为进位后月份改为2月,2月没有31日,自动变成29日
cal.add(MONTH,6);//2003-8-31 => 2004-2-29
roll处理的字段不会进位,但下一级字段的处理规则与add相似
Calendar的容错性
Calendar ca1 = Calendar.getInstance();
//结果是YEAR字段加1,MONTH字段为1(2月)
ca1.set(MONTH,13);
//关闭容错性
ca1.setLenient(false);
//导致运行时异常
ca1.set(MONTH,13);
set()方法延迟修改
set(f, value)方法将日历字段f更改为value。尽管f是立即更改的但该Calendar所代表的时间却不会立即更改,它只是使用内部成员变量表记录f字段的修改,只有下次调用get()、getTiem()、getTimeInMillis()、add()或roll()时才会重新计算日历时间
Calendar cal = Calendar.getInstance();
cal.set(2003,7,31);//2003-8-31
//将月份设为9,但9月31日不存在
//如果立即修改,系统将会把cal自动调整到10月1日
cal.set(MONTH,8);
//下面代码输出10月1日
//System.out.println(cal.getTime());
//设置DATE字段为5
cal.set(DATE,5);
System.out.println(cal.getTime());//输出2003-9-5
10.Java 8 新增的日期、时间包
- Clock:用于获取指定时区的当前日期、时间。可取代System类的currentTimeMillis()方法
- Duration:代表持续时间,可方便获取一段时间
- Instant:代表一个具体时刻,可精确到纳秒:
- 静态的now()方法来获取当前时刻
- 静态的now(Clock clock)方法来获取clock对应的时刻
- 一系列minusXxx()、plusXxx()方法在当前时刻基础上减去、加上一段时间
11.Java 8 新增的日期、时间格式器
DateTimeFormatter相当于DateFormat和SimpleDateFormat的合体,不仅可以将日期、时间对象格式化成字符串,也可以将指定格式的字符串解析成日期、时间对象。在解析之前,必须先获取DateTimeFormatter对象
使用DateTimeFormatter解析字符串
public class NewFormatterParse
{
public static void main(String[] args)
{
//定义一个人一格式的日期、时间字符串
String str1 = "2014==04==12 01时06分09秒";
//根据需要解析的日期、时间字符串定义解析所用的格式器
DataTimeFormatter fomatter1 = DateTimeFormatter.ofPattern("yyyy==NN==dd HH时mm分ss秒");
//执行解析
LocalDateTime dt1 = LocalDateTime.parse(str1,fomatter1);
System.out.println(dt1);//输出2014-04-12T01:06:09
}
}