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中八种基本数据类型对应的包装类型:
![](http://i2.51cto.com/images/blog/201711/30/30460ab7435b152e5ee860326ff8ba21.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
- 假设m方法可以接收java中任意一种数据类型,此时调用m方法想要接收byte类型的数据,可以将byte数据先包装成java.lang.Byte;之后再传递参数。
- java中包装类的继承结构图:
![](http://i2.51cto.com/images/blog/201711/30/455bcf578abb2b40b33973c529f1b6a6.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
- 以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
}
}
```