常用类(二)
10.3 可变字符序列:字符串缓冲区
10.3.1 StringBuffer、StringBuilder、String的区别
1、一个类似于 String 的字符串缓冲区,但能被修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容,所有对StringBuffer或StringBuilder对象的字符序列的修改不会产生新的StringBuffer或StringBuilder对象,这点和String很大的不同。
value没有final声明,value可以不断扩容,count记录有效字符的个数。
2、StringBuilder:线程安全,效率低;StringBuffer:线程不安全,效率高
10.3.2 StringBuffer和StringBuilder不同的API
1、构造器
StringBuffer或StringBuilder对象的创建必须用new+构造器。
StringBuffer() 初始容量为16的字符串缓冲区
StringBuffer(int size) 构造指定容量的字符串缓冲区
StringBuffer(String str) 将内容初始化为指定字符串内容
2、和字符序列改变有关的方法
而且所有这些方法支持方法链
StringBuffer append(xx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容
StringBuffer insert(int offset, xx):在指定位置插入xx
StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
StringBuffer reverse() :把当前字符序列逆转
public static void main(String[] args) { StringBuffer sf = new StringBuffer(); sf.append("hello").append("world").append("java"); System.out.println(sf); } |
方法链的原理
当append和insert时,如果原来value数组长度不够,可扩容
10.3.3 效率测试
package com.api.string;
public class TestStringBuilder {
public static void main(String[] args) { testStringBuilder(); testStringBuffer(); testString(); } public static void testString(){ long start = System.currentTimeMillis(); String s = new String("0"); for(int i=1;i<=10000;i++){ s += i; } System.out.println(s); long end = System.currentTimeMillis(); System.out.println("String拼接+用时:"+(end-start)); long memory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); System.out.println("String拼接+memory: " + memory); } public static void testStringBuilder(){ long start = System.currentTimeMillis(); StringBuilder s = new StringBuilder("0"); for(int i=1;i<=10000;i++){ s.append(i); } System.out.println(s); long end = System.currentTimeMillis(); System.out.println("StringBuilder拼接+用时:"+(end-start)); long memory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); System.out.println("StringBuilder拼接+memory: " + memory); } public static void testStringBuffer(){ long start = System.currentTimeMillis(); StringBuffer s = new StringBuffer("0"); for(int i=1;i<=10000;i++){ s.append(i); } System.out.println(s); long end = System.currentTimeMillis(); System.out.println("StringBuffer拼接+用时:"+(end-start)); long memory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); System.out.println("StringBuffer拼接+memory: " + memory); } } |
10.4 System系统类
System 类包含一些有用的类字段和方法。它不能被实例化。
在 System 类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。
10.4.1 标准输入、标准输出和错误输出流对象
PrintStream err:“标准”错误输出流。
InputStream in:“标准”输入流。
PrintStream out:“标准”输出流。
import java.util.Scanner;
class TestSystem{ public static void main(String[] args){ Scanner input = new Scanner(System.in); System.out.print("请输入成绩:"); int score = input.nextInt();
if(score>=0 && score<=100){ System.out.println("成绩是:" + score); }else{ System.err.println("输入有误,成绩应该在[0,100]"); } } } |
10.4.2 常用方法
l void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) :从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
l long currentTimeMillis() :返回以毫秒为单位的当前时间。
l void exit(int status) :终止当前正在运行的 Java 虚拟机。
l void gc():运行垃圾回收器。
l Properties getProperties():确定当前的系统属性。
l String getProperty(String key):获取指定键指示的系统属性。
l void setErr(PrintStream err) :重新分配“标准”错误输出流。
l void setIn(InputStream in):重新分配“标准”输入流。
l void setOut(PrintStream out):重新分配“标准”输出流。
l String setProperty(String key, String value) :设置指定键指示的系统属性。
10.5 JDK1.8之前日期时间类
10.5.1 java.lang.System类
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒GMT之间以毫秒为单位的时间差。此方法适于计算时间差。
10.5.2 java.util.Date
它的对象表示一个特定的瞬间,精确到毫秒。
Java中时间的表示说白了也是数字,是从标准纪元1970年1月1日0时0分0秒GMT到某个时刻的毫秒数,类型是long
理解:一维的时间轴,选择1970年1月1日0时0分0秒时间为0刻度,1毫秒一刻度
构造方法:
l Date(): 源代码:this(System.currentTimeMillis());
l Date(long date)
常用方法:
l getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
l toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中:
dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat), zzz是时间标准。
已过时的方法:
l public Date(int year,int month,int date,int hrs,int min,int sec)
参数:
year - 减 1900 的年份。
month - 0-11 之间的月份。
date - 一月中 1-31 之间的某一天。
hrs - 0-23 之间的小时数。
min - 0-59 之间的分钟数。
sec - 0-59 之间的秒数。
l getYear() 从 JDK 1.1 开始,由 Calendar.get(Calendar.YEAR) - 1900 取代。
l getMonth()从 JDK 1.1 开始,由 Calendar.get(Calendar.MONTH) 取代。返回的值在 0 和 11 之间,值 0 表示 1 月。
l getDate() JDK 1.1 开始,由 Calendar.get(Calendar.DAY_OF_MONTH) 取代。返回的值在 1 和 31 之间
l getDay()从 JDK 1.1 开始,由 Calendar.get(Calendar.DAY_OF_WEEK) 取代。 返回值 (0 = Sunday, 1 = Monday, 2 = Tuesday, 3 = Wednesday, 4 = Thursday, 5 = Friday, 6 = Saturday) 表示一周中的某一天
l getHours()从 JDK 1.1 开始,由 Calendar.get(Calendar.HOUR_OF_DAY) 取代。返回值是一个数字(0 至 23)
l getMinutes()从 JDK 1.1 开始,由 Calendar.get(Calendar.MINUTE) 取代。 返回值在 0 和 59 之间。
l getSeconds()从 JDK 1.1 开始,由 Calendar.get(Calendar.SECOND) 取代。回的值在 0 和 61 之间。值 60 和 61 只可能发生在考虑了闰秒的 Java 虚拟机上。
10.5.3 java.util.TimeZone和Locale
Locale 对象表示了特定的地理、政治和文化地区。需要 Locale 来执行其任务的操作称为语言环境敏感的 操作,它使用 Locale 为用户量身定制信息。例如,显示一个数值,日期就是语言环境敏感的操作,应该根据用户的国家、地区或文化的风俗/传统来格式化该数值。
获取Locale对象:
Locale(String language)
Locale(String language, String country)
Locale.CHINA、Locale.US等
public static void main(String[] args) { Locale loc = Locale.CHINA; System.out.println(loc);//zh_CN System.out.println(Locale.US);//en_US System.out.println(Locale.JAPAN);//ja_JP
Locale c = new Locale("zh","CN"); System.out.println(c); } |
通常,使用 TimeZone的getDefault 获取 TimeZone,getDefault 基于程序运行所在的时区创建 TimeZone。例如,对于在日本运行的程序,getDefault 基于日本标准时间创建 TimeZone 对象。
也可以用TimeZone的 getTimeZone 及时区 ID 获取 TimeZone 。例如美国太平洋时区的时区 ID 是 "America/Los_Angeles"。因此,可以使用下面语句获得美国太平洋时间 TimeZone 对象:
TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
public static void main(String[] args) { TimeZone t = TimeZone.getDefault(); System.out.println(t);
TimeZone t1 = TimeZone.getTimeZone("America/New_York"); System.out.println(t1);
TimeZone t2 = TimeZone.getTimeZone("Asia/Shanghai"); System.out.println(t2); } |
String[] all = TimeZone.getAvailableIDs(); for (String id : all) { System.out.println(id); } |