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
			}
	}
	```