j2se学习中的一些零碎知识点5之StringBuffer类,八种基本数据类型对应的包装类型和自动装...

本文详细介绍了Java中的StringBuffer与StringBuilder的使用及优化方法,对比了它们的线程安全性,并探讨了基本数据类型的包装类型及其相互转换。此外,还深入解析了自动装箱和拆箱的机制,以及日期和日历类的使用。

1、StringBuffer和StringBuilder:
StringBuffer和StringBuilder是什么?是字符串缓冲区,工作原理是预先在内存中申请一块空间,以容纳字符序列;如果预留的空间不够用,则进行自动扩容,以容纳更多字符序列。

  • StringBuffer和StringBuilder的默认初始化容量是16。
  • 如何优化StringBuffer和Stringuilder呢?最好在创建StringBuffer/StringBuilder之前,预测StringBuffer/StringBuilder的存储字符数量,然后在创建StringBuffer/StringBuilder的时候指定初始化容量的方式创建StringBuffer/StringBuilder,以此减少底层数组的拷贝,提高效率。

    package com.geeklicreed.j2se;
    public class Test {
            public static void main(String[] args) {
                    //创建字符串缓冲区对象
                    StringBuffer sb = new StringBuffer(); //16
                    //可以向StringBuffer中追加字符串
                    String[] ins = {"体育", "音乐", "睡觉", "美食"};
                    for(int i = 0; i < ins.length; i++){
                            if(i == ins.length -1){
                                    sb.append(ins[i]);
                            }else{
                                    sb.append(ins[i]);
                                    sb.append(",");
                            }
                    }
                    System.out.println(sb);
            }
    }
  • 推荐字符串频繁拼接使用StringBuffer或者StringBuilder,不会创建大量的字符串对象,节省内存。
  • StringBuffer和StringBuilder的区别?
  • StringBuffer是线程安全的。(可以在多线程的环境下使用不会出现问题。)StringBuilder是非线程安全的。(在多线程的环境下使用可能会出现问题,一般采用StringBuilder,其效率较高。)

2、java中八种基本数据类型对应的包装类型:
j2se学习中的一些零碎知识点5之StringBuffer类,八种基本数据类型对应的包装类型和自动装

  • 假设m方法可以接收java中任意一种数据类型,此时调用m方法想要接收byte类型的数据,可以将byte数据先包装成java.lang.Byte;之后再传递参数。
  • java中包装类的继承结构图:
    j2se学习中的一些零碎知识点5之StringBuffer类,八种基本数据类型对应的包装类型和自动装

  • 以java.lang.Integer类型为例,讲解八种数据类型:

    package com.geeklicreed.j2se;
    public class IntegerTest {
            public static void main(String[] args) {
                    //获取int类型的最大值和最小值
                    System.out.println("int最小值:" + Integer.MIN_VALUE); //int最小值:-2147483648
                    System.out.println("int最大值:" + Integer.MAX_VALUE); //int最大值:2147483647
                    //以int推byte
                    System.out.println("byte最小值:" + Byte.MIN_VALUE);  //byte最小值:-128
                    System.out.println("byte最大值:" + Byte.MAX_VALUE);  //byte最大值:127   
                    //创建Integer类型的对象
                    Integer i1 = new Integer(10); //int -> Integer 
                    Integer i2 = new Integer("123"); //String -> Integer 
                    System.out.println(i1); //10
                    System.out.println(i2); //123
                    //以下程序编译可以通过,但是在运行的时候会报异常,数字格式化异常
                    //虽然可以将字符串转换成Integer类型,但是该字符串也必须是“数字字符串”
                    Integer i3 = new Integer("abcd"); //Exception in thread "main" java.lang.NumberFormatException: For input string: "abcd"
            }
    }
  • 关于Integer中常用的方法:

    package com.geeklicreed.j2se;
    
    public class IntegerTest {
            public static void main(String[] args) {
                    //int -> Integer
                    //基本数据类型 -> 引用类型
                    Integer i1 = new Integer(10);
    
                    //Integer -> int
                    //引用类型 -> 基本数据类型
                    int i2 = i1.intValue();
    
                    //重要:static int parseInt(String s);
                    //String -> int
                    int age = Integer.parseInt("25");
                    System.out.println(age + 1);  // 26
    
                    //重要:static double parseDouble(String s);
                    double price = Double.parseDouble("3.0");
                    System.out.println(price + 1.0); //4.0
    
                    //将int类型的十进制转换成2进制
                    String binaryString = Integer.toBinaryString(10);
                    System.out.println(binaryString);  //1010
    
                    //将int类型的十进制转换成16进制
                    String hexString = Integer.toHexString(10);
                    System.out.println(hexString);  //a
    
                    //将int类型的十进制转换成8进制
                    String octalString = Integer.toOctalString(10);
                    System.out.println(octalString);  //12
    
                    //int -> Integer
                    Integer i3 = Integer.valueOf(10);
                    //String -> Integer
                    Integer i4 = Integer.valueOf("10");
            }
    }
  • Integer、int和String三种类型的相互转换:

    package com.geeklicreed.j2se;
    
    public class IntegerTest {
            public static void main(String[] args) {
                    //1、int -> Integer
                    Integer i1 = Integer.valueOf(10);
                    //2、Integer -> int
                    int i2 = i1.intValue();
    
                    //3、String -> Integer
                    Integer i3 = Integer.valueOf("10");
                    //4、Integer -> String
                    String s1 = i3.toString();
    
                    //5、String -> int
                    int i4 = Integer.parseInt("123");
                    //6、int -> String
                    String s2 = 10 + "";
    
            }
    }
  • JDK5.0新特性:自动装箱(auto_boxing)和自动拆箱(auto_unboxing)的特性适合与JDK1.5版本之后的(包括1.5)。

    package com.geeklicreed.j2se;
    
    public class IntegerTest {
            public static void main(String[] args) {
                    //jdk5.0之前的。
                    //int -> Integer(装箱)
                    Integer i1 = new Integer(10);
                    //Integer -> int(拆箱)
                    int i2 = i1.intValue();
    
                    //JDK5.0之后,包括5.0
                    Integer i3 = 10; //自动装箱
                    int i4 = i3;  //自动拆箱
                    System.out.println(i3);  //"10"
                    System.out.println(i4 + 1); //11
    
                    //JDK5.0之后
                    m1(321); //自动装箱
                    System.out.println(m2(10, 5) + 1);
            }
    
            public static void m1(Object o){
                    System.out.println(o);
            }
    
            public static int m2(Integer i1, Integer i2){
                    return i1 - i2; //自动拆箱
            }
    }

3、深入自动装箱和自动拆箱:自动装箱和自动拆箱是程序编译阶段的一个概念,和程序运行无关。

  • 自动装箱和自动拆箱主要目的是方便程序员编码。

    package com.geeklicreed.j2se;
    
    public class IntegerTest {
            public static void main(String[] args) {
                    Integer i1 = new Integer(10);
                    Integer i2 = new Integer(10);
                    //这里不会有自动拆箱
                    System.out.println(i1 == i2); //false
    
                    //比较两个Integer类型的数据是否相等,不能用“==”
                    //Integer已经重写了Object中的equals方法
                    System.out.println(i1.equals(i2)); //true
    
                    //重点
                    Integer i3 = 128;
                    Integer i4 = 128;
    
                    //上面的代码等同于
                    //Integer i3 = new Integer(128);
                    //Integer i4 = new Integer(128);
                    System.out.println(i3 == i4); //false
    
                    //注意以下程序
                    //如果数据是在(-128-127之间),java中引入了一个“整型常量池”的概念,在方法区中。
                    //该整型常量池只存储-128-127之间的数据。
                    Integer i5 = 127; // 这个程序不会在堆中创建对象,会直接从整型常量池中拿。
                    Integer i6 = 127;
                    System.out.println(i5 == i6); //true
    
                    Integer i7 = -128;
                    Integer i8 = -128;
                    System.out.println(i7 == i8);  //true
    
                    Integer i9 = -129;
                    Integer i10 = -129;
                    System.out.println(i9 == i10);  //false
            }
    }

4、关于日期类型:

  • 获取自1970年1月1日00时00分00秒 000毫秒到当前毫秒数,long now = System.currentTimeMillis();
  • 获取系统当前时间:Date nowTime = new Date(); System.out.println(nowTime);(java.util.Date已经重写了Object中的toString方法。)
  • 格式化日期类型:SimpleDateFormat(java.util.Date --> String)

    package com.geeklicreed.j2se;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class Test {
    
            public static void main(String[] args) {
                    /*
                     * 日期格式: y -> 年 M -> 月 d -> 日 H -> 小时 m -> 分 s -> 秒 S -> 毫秒
                     */
                    // 1、创建日期格式化对象
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss SSS");
                    // 2、开始格式化(Date -> String)
                    String strTime = sdf.format(new Date());
                    System.out.println(strTime);
            }
    
    }
  • 获取特定的日期:

    
    package com.geeklicreed.j2se;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class Test {
    
            public static void main(String[] args) throws ParseException {
                    String strTime = "2008年08月08日 08:08:08 888";
                    // 将String日期转换成日期类型Date
                    // String -> Date
    
                    // 1、创建日期格式化对象
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:MM:ss SSS"); // 格式不能够随意
                    // 2、将字符串转换成日期类型
                    Date t = sdf.parse(strTime);
    
                    System.out.println(t); // Fri Aug 08 08:00:08 CST 2008
    
            }
    
    }

-----

5、日历Calendar类:
package com.geeklicreed.j2se;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Test {
        public static void main(String[] args) throws ParseException {
                //获取系统当前的日历
                Calendar c = Calendar.getInstance();
                //查看当前日历的“星期几”
                int i = c.get(Calendar.DAY_OF_WEEK);
                System.out.println(i); //4(今天是星期三)(中国的星期天,外国人看作是一个星期第一天)
                System.out.println(c.get(Calendar.DAY_OF_MONTH)); //1(今天是2017年11月1日)
                //获取2008 08 08 是星期几?
                //获取2008 08 08 的日历
                String strTime = "2008,08,08";
                Date d = new SimpleDateFormat("yyyy,MM,dd").parse(strTime);
                //该日历就是2008 08 08的日历
                c.setTime(d);
                //获取星期几
                System.out.println(c.get(Calendar.DAY_OF_WEEK)); //6
        }
}
```

转载于:https://blog.51cto.com/12402717/2045928

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值