您的位置:首页 > Web前端

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

2017-11-30 10:22 801 查看
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中八种基本数据类型对应的包装类型:



假设m方法可以接收java中任意一种数据类型,此时调用m方法想要接收byte类型的数据,可以将byte数据先包装成java.lang.Byte;之后再传递参数。

java中包装类的继承结构图:



以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
}
}
```
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐