zoukankan      html  css  js  c++  java
  • JAVA学习笔记——Java常用类库

    1.  Java常用类库(上)

    1.1      StringBuffer类(重点)

    String是一个字符串,但是字符串的内容不可改变,改变的只是内存地址的指向,那么如果现在想要让字符串的内容可以修改,则必须使用StringBuffer类完成。

    1.1.1        StringBuffer的基本使用

    在String中使用“+”号进行字符串的连接,在StringBuffer中使用append()方法进行字符串的连接。在使用StringBuffer是不能像String那样可以直接使用字符串进行复制操作,必须通过关键字new开辟对象才可以使用,之后使用append()方法。

    package com.java.stringBufferDemo;

    public class StringBufferDemo01 {

        public static void main(String[] args) {

            StringBuffer   stringBuffer = new StringBuffer();

            stringBuffer.append("Hello");

            stringBuffer.append(" ").append("World").append(" ").append("!!!");

            System.out.println(stringBuffer);

        }

    }

        在程序中就只有简单的将“+”替换成了append()方法而已,但是需要说明的是,String与StringBuffer没有直接的关系。所以如果想将StringBuffer类型的对象转换成String类型,就必须使用toString()方法完成。

    package com.java.stringBufferDemo;

    public class StringBufferDemo02 {

        public static void main(String[] args) {

            StringBuffer   stringBuffer = new StringBuffer();

            stringBuffer.append("Hello");

            stringBuffer.append(" ").append("World").append(" ").append("!!!");

            String string =   stringBuffer.toString();

            System.out.println(string);

        }

    }

    实际上,一般情况下StringBuffer问问都用在频繁修改字符串的地方。

    package com.java.stringBufferDemo;

    public class StringBufferDemo02 {

        public static void main(String[] args) {

            StringBuffer   stringBuffer = new StringBuffer();

            fun(stringBuffer);

            for (int i = 1; i <= 1000;   i++) {

                if(i % 10 == 1){

                    stringBuffer.append("\n");

                }

                stringBuffer.append(i   + "\t");

            }

            System.out.println(stringBuffer);

        }

        public static void fun(StringBuffer   stringBuffer) {

            stringBuffer.append("Hello").append("\n");

        }

    }

    1.1.2        StringBuffer的常用方法

    在StringBuffer中提供了大量的操作方法,有些方法就是雨String类似的关键是查看那些新增加的方法。

    1. 1.  在指定位置添内容:
    • ·默认情况下所有的内容都是在StringBuffer的最后添加的。
    • ·使用public StringBuffer insert(int offset, char c)方法

    package com.java.stringBufferDemo;

    public class StringBufferAPIDemo01 {

        public static void main(String[] args) {

            StringBuffer   stringBuffer = new StringBuffer();

            stringBuffer.append("Hello");

            stringBuffer.append(" ").append("World").append(" ").append("!!!");

            stringBuffer.insert(1,   "***");

            stringBuffer.insert(0,   "+++");

            System.out.println(stringBuffer);

        }

    }

    1. 2.  删除指定范围的内容:
    • ·使用public StringBuffer delete(int start, int end)方法

    package com.java.stringBufferDemo;

    public class StringBufferAPIDemo02 {

        public static void main(String[] args) {

            StringBuffer   stringBuffer = new StringBuffer();

            stringBuffer.append("Hello");

            stringBuffer.append(" ").append("World").append(" ").append("!!!");

            stringBuffer.insert(1,   "***");

            stringBuffer.insert(0,   "+++");

            System.out.println(stringBuffer);

            System.out.println(stringBuffer.delete(0,   9));

        }

    }

    1. 3.  反转字符串的内容:

    package com.java.stringBufferDemo;

     

    public class StringBufferAPIDemo02 {

        public static void main(String[] args) {

            StringBuffer   stringBuffer = new StringBuffer();

            stringBuffer.append("Hello");

            stringBuffer.append(" ").append("World").append(" ").append("!!!");

            System.out.println(stringBuffer.reverse()); //  将内容翻转

        }

    }

    1.2      Runtime类(了解)

    每一个JVM启动的时候伺机上都对应了一个Runtime实例,表示运行时,但是此类的构造方法被私有化,则此类的内部肯定有一个方法可以取得本类的实例。

    • ·静态方法:public static Runtime getRuntime()

    1.2.1        Runtime与Process

    实际上可以通过Runtime类直接运行本机程序。

    ·方法:public Process exec(String command) throws IOException

    范例:运行本机上的计算器程序

    package com.java.runtimeDemo;

    public class RuntimeDemo01 {

        public static void main(String[] args) throws Exception {

            Runtime runtime =   Runtime.getRuntime(); // 单例设计

            runtime.exec("calc"); // 执行程序

        }

    }

    可以让指定的程序进行自动的关闭。exec()方法返回一个Process类的实例,表示一个进程的队形,如果想要关闭,则使用此类中的:public abstract void destroy()

    package com.java.runtimeDemo;

    public class RuntimeDemo02 {

        public static void main(String[] args) throws Exception {

            Runtime runtime =   Runtime.getRuntime(); // 单例设计

            Process process =   runtime.exec("calc"); // 执行程序

            Thread.sleep(2000); //  程序运行2秒

            process.destroy();  //  关闭进程

        }

    }

    1.2.2        Runtime取得系统信息

    在Runtime类中可以通过maxMemory()、freeMemory()、totalMemory()取得系统的内存信息,之后也可以通过gc()方法强制性的程序释放掉所有的垃圾空间。

    package com.java.runtimeDemo;

    public class RuntimeDemo03 {

        public static void main(String[] args) throws Exception {

            Runtime runtime =   Runtime.getRuntime(); // 单例设计

            System.out.println("1.最大可用内存:" + runtime.maxMemory());

            System.out.println("1.空闲内存空间:" +   runtime.freeMemory());

            System.out.println("1.总共内存空间:" +   runtime.totalMemory());

            String string = "";

            for(int i = 0; i <= 10000;   i++){

                string += i;    //  会产生大量的垃圾

            }

            System.out.println("2.空闲内存空间:" +   runtime.freeMemory());

            runtime.gc();   //  运行垃圾回收

            System.out.println("3.空闲内存空间:" +   runtime.freeMemory());

        }

    }

    运行结果:

    1.最大可用内存:933953536

    1.空闲内存空间:62319360

    1.总共内存空间:62980096

    =========================

    2.空闲内存空间:305506256

    =========================

    3.空闲内存空间:390997696

    1.3      System类(了解)

    System是一个系统类,是一个陪伴我们时间最长的类,例如:System.out.println()就是此类中提供的操作。

    1.3.1        取得计算时间

    使用此类可以取得计算的时间,例如,想知道一个程序执行时一共花费了多少时间。

    ·得到当前的时间:public static long currentTimeMillis()

    package com.java.systemDemo;

    public class SystemDemo01 {

        public static void main(String[] args) {

            long begin = System.currentTimeMillis();

            String string = "";

            for (int i = 0; i <= 10000;   i++) {

                string += i; // 会产生大量的垃圾

            }

            long end = System.currentTimeMillis();

            System.out.println("程序执行的时间:" + (end - begin) + "ms");

        }

    }

    1.3.2        System与垃圾回收

    在System类中有一个gc()方法:public static void gc(),运行垃圾回收器。调用 System.gc() 实际上等效于调用: Runtime.getRuntime().gc()

    如果一个对象不用的话,则就有可能进行垃圾的回收,但是如果一个对象在被回收之前需要做一些收尾的工作。又该怎么办呢???

    在Object类中存在一个方法,此方法在对象被回收前调用:

    ·protected void finalize() throws Throwable

    package com.java.systemDemo;

    public class SystemDemo02 {

        public static void main(String[] args) throws Throwable {

            Person person = new Person("Harry", 80);

            person.finalize();

            person = null;

            System.gc();

        }

    }

    class Person {

        private String name;

        private int age;

        public Person(String name, int age) {

            this.name = name;

            this.age = age;

        }

        public String toString() {

            return "name:" + this.name + ",age:" + this.age;

        }

        protected void finalize() throws Throwable {

            System.out.println("我被回收了。。。" + "(" + this + ")");

        }

    }

    但是从一把开发的角度来讲,很少有专门的开发在对象的回收前进行操作的,所以此操作理解即可。

    面试题:说明 final、finally、finalize的区别。。。

    1.4      国际化程序实现(理解)

    国际化程序:一套程序可以同时适应多个国家的语言要求,那么这样的程序成为国际化程序。如果想要红丝线国际化程序,则必须依靠Local、ResourceBoundle、MessageFormat及各类完成。并结合属性文件(*.properties)。

    1.4.1        Local类

    Local实际上非常好理解,表示一个地区,也就是说在国际化程序中提供Local指定当前所在地区。世界上各个国家都存在一个国家的编号,例如:

    ·中国:zh_CN     ·美国en_US

    实际上这些代码根本就没有必要记住。因为在浏览器中谁都有指示。使用的时候可以直接查。打开IE浏览器:工具àInternet选项à语言à添加。即可。

    如果想要创建Local类的对象有两种方式:

    ·直接去的本机的语言:public static Locale getDefault()

    ·通过构造方法直接指定一种语言:public Locale(String language, String country)

    但是如果过想要实现程序的国际化只靠Local类是不够的,需要哟个配合的属性文件存在,一个地区的Local对象应该对应一个不同的属性文件。

    找到属性文件之后,下一步就需要将内容取出,所有的内容都需要ResourceBundle来读取。

    1.4.2        ResourceBundle类

    此类是在java.util中定义的。使用时会通过里面的静态方法取得实例,有两种方式:

    ·通过本机的Local取得属性文件:

    ·public static final ResourceBundle getBundle(String baseName)

    ·通过指定的Local取得:

    一般来说,使用第二种是比较常用的。下面通过一段代码来演示如何访问属性文件

    属性文件:Message.properties(使用IDE开发,属性文件放在工程bin目录下)

    Info = 你好   !!!

    其中‘Info’为key,‘你好’为value。程序操作时通过key找到value。

    在使用ResourceBundle读取的时候根据key进行读取,方法是:

    ·public final String getString(String key)

    package com.java.localDemo;

    import java.util.Locale;

    import java.util.ResourceBundle;

    public class LocalDemo01 {

        public static void main(String[] args) {

            Locale locale =   Locale.getDefault();    //  得到默认的Local

            /**

             * 要找到Message的属性,此时省略了后缀,并指定了区域

             */

            ResourceBundle rb =   ResourceBundle.getBundle("Message", locale);

            String value =   rb.getString("Info");    //  通过Info找到内容

            System.out.println("内容:" + value);

        }

    }

    此时,如果使用命令行编译运行,属性文件使用Notepad编写,内容却是读进来了,但是内容在显示的时候出现了乱码。如果使用IDE编写的话,属性文件不能输入中文,自动回转换为代码。因为对于属性文件来讲,里面是不能够有中文的,如果出此案中文,则必须进行转码操作,转换为UNICODE编码。

    在JDK中提供了一个转换工具,可以讲文字转换为16进制编码,此工具在JDK暗转目录下的:bin\native2ascii.exe。

    现在将上面的属性文件进行修改。

    Info =   \u4F60\u597D \uFF01\uFF01\uFF01

    那么此时再次读取,发现内容可以正常显示了。

    1.4.3        完成国际化操作

    现在假设,如果是中国则显示 你好!!!,如果是英语国家则显示Hello !!!。先要完成此程序,则首先应该建立两个属性文件,这两个属性文件有命名要求:属性名称_区域名称.properties

    ·中文:Message_zh_CN.properties         ·英文:Message_en_US.properties

    属性文件:

    Info = Hello   !

    Info =   \u4F60\u597D \uFF01

    主程序:

    package com.java.localDemo;

    import java.util.Locale;

    import java.util.ResourceBundle;

    public class LocalDemo02 {

        public static void main(String[] args) {

            Locale locale_zh = new Locale("zh", "CN"); // 指定中文环境

            Locale locale_en = new Locale("en", "US"); // 指定英文环境

            /**

             * 要找到Message的属性,此时省略了后缀,并指定了区域

             */

            ResourceBundle   rb_zh = ResourceBundle.getBundle("Message", locale_zh);

            ResourceBundle   rb_en = ResourceBundle.getBundle("Message", locale_en);

            /**

             * 通过Info找到内容

             */

            String value_zh =   rb_zh.getString("Info");

            String value_en =   rb_en.getString("Info");

            System.out.println("中文内容:" + value_zh);

            System.out.println("英文内容:" + value_en);

        }

    }

    在整个国际化程序中,属性文件时最终要的,因为可以根据不同的语言区域进行自动的文字装载。

    1.4.4        动态文本

    之前所有的内容实际上在属性文件中保存的值都是固定的,现在如果希望某些内容进行动态显示,

    例如:年号,Xxx

        那么此时就可以使用占位符的方式完成,在属性文件中加入“{编号}”即可。

    Message_zh_CN.properties

    Info = \u4F60\u597D \uFF01{0}{1}{2}

    Message_en_US.properties

    Info = Hello !{0}{1}{2}

    之后就可以使用MessageFormat进行文字的格式化操作。此类在java.text包中定义,使用如下方法完成内容的增加:

    ·public static String format(String pattern,Object... arguments)

    package com.java.localDemo;

    import java.text.MessageFormat;

    import java.util.Locale;

    import java.util.ResourceBundle;

    public class LocalDemo03 {

        public static void main(String[] args) {

            Locale locale_zh = new Locale("zh", "CN"); // 指定中文环境

            Locale locale_en = new Locale("en", "US"); // 指定英文环境

            // 要找到Message的属性,此时省略了后缀,并指定了区域

            ResourceBundle   rb_zh = ResourceBundle.getBundle("Message", locale_zh);

            ResourceBundle   rb_en = ResourceBundle.getBundle("Message", locale_en);

            // 通过Info找到内容

            String value_zh =   rb_zh.getString("Info");

            String value_en =   rb_en.getString("Info");

            System.out.println("中文内容:" + MessageFormat.format(

                    value_zh, "\t\t张庭括" ,"\t\t男", "\t20 "));

            System.out.println("英文内容:" + MessageFormat.format(

                    value_en, "\tZhang   Tingkuo" ,"\tMale", "\tTwenty "));

        }

    }

    1.4.5        使用资源类表示内容(了解)

    在程序中可以通过类存储全部的资源内容,那么此类必须继承ListResourceBundle。

    package com.java.localDemo;

    import java.util.ListResourceBundle;

    public class Message_zh_CN extends ListResourceBundle {

        Object data[][] = { {"Info", "你好,{0},年龄:,{1}"} };

        protected Object[][]   getContents() {

            return this.data;

        }

    }

    package com.java.localeDemo;

    import java.util.ListResourceBundle;

    public class Message_en_US extends ListResourceBundle {

        Object data[][] = { {"Info", "Hello,{0},Age:,{1}"} };

        protected Object[][]   getContents() {

            return this.data;

        }

    }

    通过观察,如果在一个classpath同时存在:

    ·Message.properties

    ·Message_zh_CN.properties

    ·Message.java

    ·Message_zh_CN.java

    调用的顺序是:

    1.Message_zh_CN.java

    2.Message.java

    3.Message.properties

    4.Message_zh_CN.properties

    但是从实际的开发角度来看,一般不会使用一个类来表示一个资源文件的内容,都是使用properties文件保存,

    1.5      日期操作类(重点)

    在Java中对日期的显示进行了很好的支持,使用Date、DateFormat、SimpleDateFormat、Calendar等类都可以取得日期。

    1.5.1        Data类

    java.util.Date是一个由系统提供的日期操作类,此类的操作非常简单,同时也是一个非常很总要的类,在日后的很多开发中,都会使用到此类。

    package com.java.dateDemo;

    import java.util.Date;

    public class DateDemo {

        public static void main(String[] args) {

            System.out.println(new Date());

        }

    }

    日期:

    Wed Aug 08 17:50:48 CST 2012

    此时日期已经可以正常显示了,但是日期的显示格式并不符合国人的习惯。中国人的习惯更倾向于:

    2012-08-08   17:50 星期三

    1.5.2        Calendar类

    通过此类可以讲时间精确到毫秒,Calendar类的定义:

    public abstract class Calendar extends Object implements Serializable, Cloneable, Comparable<Calendar>

    此类是一个抽象类,则使用时必须依靠其子类:

    package com.java.dateDemo;

    import java.util.Calendar;

    import java.util.GregorianCalendar;

    public class CalendarDemo {

        public static void main(String[] args) {

            Calendar calendar =   new GregorianCalendar();

            System.out.println("年: " +   calendar.get(Calendar.YEAR));

            System.out.println("月: " +   (calendar.get(Calendar.MONTH) + 1));

            System.out.println("日: " +   calendar.get(Calendar.DAY_OF_MONTH));

            System.out.println("时: " +   calendar.get(Calendar.HOUR_OF_DAY));

            System.out.println("分: " +   calendar.get(Calendar.MINUTE));

            System.out.println("秒: " +   calendar.get(Calendar.SECOND));

            System.out.println("毫秒: " +   calendar.get(Calendar.MILLISECOND));

        }

    }

    1.5.3        题目设计一个区的日期的类

    在程序的开发中基本上都会大量的使用取出日期的操作,而如果每次都想之前那样取出的日期的话,则会很麻烦,所以最好可以设计一个类,那么此类可以直接返回日期,返回的日期包含以下几种形式:

    ·形式一:2012-08-08

    ·形式二:2012-08-08 18-40 123

    ·形式三:2012年08月08日

    ·形式四:2012年08月08日 16时40分123毫秒

    package com.java.dateDemo;

    import java.util.Calendar;

    import java.util.GregorianCalendar;

    public class DateTime {

        private Calendar calendar = new GregorianCalendar(); // 实例化Calendar对象

        public String getDate() {// 2009-03-02

            StringBuffer buf = new StringBuffer();

            buf.append(calendar.get(Calendar.YEAR)).append("-");

            buf.append(this.addZero((calendar.get(Calendar.MONTH) + 1), 2)).append(

                    "-");

            buf.append(this.addZero(calendar.get(Calendar.DAY_OF_MONTH), 2));

            return buf.toString();

        }

        public String getDateTime() {// 2009-03-02   16:19:34.123

            StringBuffer buf = new StringBuffer();

            buf.append(this.getDate()).append(" ");

            buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY), 2)).append(

                    ":");

            buf.append(this.addZero(calendar.get(Calendar.MINUTE), 2)).append(":");

            buf.append(this.addZero(calendar.get(Calendar.SECOND), 2)).append(".");

            buf.append(this.addZero(calendar.get(Calendar.MILLISECOND), 3));

            return buf.toString();

        }

        public String   getDateComplete() {// 2009年03月02日

            StringBuffer buf = new StringBuffer();

            buf.append(calendar.get(Calendar.YEAR)).append("年");

            buf.append(this.addZero((calendar.get(Calendar.MONTH) + 1), 2)).append("月");

            buf.append(this.addZero(calendar.get(Calendar.DAY_OF_MONTH), 2)).append("日");

            return buf.toString();

        }

        public String   getDateTimeComplete() {// 2009年03月02日16时19分34秒123毫秒

            StringBuffer buf = new StringBuffer();

            buf.append(this.getDateComplete());

            buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY), 2)).append("时");

            buf.append(this.addZero(calendar.get(Calendar.MINUTE), 2)).append("分");

            buf.append(this.addZero(calendar.get(Calendar.SECOND), 2)).append("秒");

            buf.append(this.addZero(calendar.get(Calendar.MILLISECOND), 3)).append("毫秒");

            return buf.toString();

        }

        private String addZero(int temp, int len) {

            StringBuffer str = new StringBuffer();

            str.append(temp);// 加入数字

            while (str.length() < len)   {

                str.insert(0,   0); //   在第一个位置加上字母0

            }

            return str.toString();

        }

        public static void main(String args[]) {

            System.out.println(new   DateTime().getDateTimeComplete());

        }

    }

     

  • 相关阅读:
    [已读]Sass与Compass实战
    微信小程序图片变形解决方法
    ES6基础教程一 学习笔记
    微信小程序图片放大预览
    Element ui表格展示多张图片问题
    Element ui表格展示图片问题
    使用element ui 日期选择器获取值后的格式问题
    在vue2.0中使用sass
    微信小程序左滑删除功能
    微信小程序用setData修改数组或对象中的一个属性值
  • 原文地址:https://www.cnblogs.com/zhangtingkuo/p/2837972.html
Copyright © 2011-2022 走看看