常用类(二)

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);

                   }

posted @ 2019-01-25 19:53  啊啊啊啊鹏  阅读(162)  评论(0编辑  收藏  举报
1 2