包装类基本知识
public class Test01 {
public static void main(String[] args) {
//把数字转成包装类
Integer i1=new Integer(20);
Integer i2=Integer.valueOf(30);
//包装类转为基本数据类型
float i3=i2.floatValue();
//将字符串数字转成包装类对象
Integer i4=Integer.valueOf("304");
Integer i5=Integer.parseInt("305");
//将数字转成字符串
String s= i5.toString();
}
}
//包装类可以把基本数据类型,包装类,字符串之间相互转化
Integer i = 100;//自动装箱
//相当于编译器自动为您作以下的语法编译:
Integer i = Integer.valueOf(100);//调用的是 valueOf(100),而不是 new Integer(100)
Integer i = 100;
int j = i;//自动拆箱
//相当于编译器自动为您作以下的语法编译:
int j = i.intValue();
public class Test1 {
public static void main(String[ ] args) {
Integer i = null;
int j = i;
}
}
public class Test1 {
public static void main(String[ ] args) {
/上面的代码在编译时期是合法的,但是在运行时期会有错误 因为其相当于下面两行代码*/
Integer i = null;
int j = i.intValue();
}
}
null 表示 i 没有指向任何对象的实体,但作为对象名称是合法的(不管这个对象名称存 是否指向了某个对象
的实体)。由于实际上 i 并没有指向任何对象的实体,所以也就不可能 操作 intValue()方法,这样上面的
写法在运行时就会出现 NullPointerException 错误。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
这段代码中我们需要解释下面几个问题:
1. IntegerCache类为Integer类的一个静态内部类,仅供Integer类使用。
2. 一般情况下 IntegerCache.low为-128,IntegerCache.high为127,
IntegerCache.cache为内部类的一个静态属性
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
public class Test3 {
public static void main(String[ ] args) {
Integer in1 = -128;
Integer in2 = -128;
System.out.println(in1 == in2);//true 因为 123 在缓存范围内
System.out.println(in1.equals(in2));//true
Integer in3 = 1234;
Integer in4 = 1234;
System.out.println(in3 == in4);//false 因为 1234 不在缓存范围内
System.out.println(in3.equals(in4));//true
}
}
public class MyInteger {
private int value;
private static MyInteger[] cache;
public static final int MIN=-128;
public static final int MAX=127;
static{
for(int i=-MIN;i<=MAX;i++){
cache[i+128]=MyInteger.valueOf(i);
}
}
public static MyInteger valueOf(int i){
if(i>-MIN&&i<=MAX){
return cache[i+128];
}
return new MyInteger(i);
}
public MyInteger(int i) {
this.value=i;
}
}
空指针异常就是对象为空,你调用了它的方法
1.String 类源码分析
public class TestString2 {
public static void main(String[ ] args) {
//编译器做了优化,直接在编译的时候将字符串进行拼接
String str1 = "hello" + " java";//相当于 str1 = "hello java";
String str2 = "hellojava";
System.out.println(str1 == str2);//true
String str3 = "hello"; String str4 = " java"; //编译的时候不知道变量中存储的是什么,所
以没办法在编译的时候优化
String str5 = str3 + str4;
System.out.println(str2 == str5);//false
}
}
2.StringBuffer 和 StringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;//没有final修饰
}
3.不可变和可变字符序列使用陷阱
public class TestStringEtc {
public static void main(String[] args) {
String s1="";
long memory1=Runtime.getRuntime().freeMemory();//获取系统剩余内存空间
long time1=System.currentTimeMillis();//获取系统时间
for(int i=1;i<=5000;i++){
s1=s1+i;
}
long memory2=Runtime.getRuntime().freeMemory();
long time2=System.currentTimeMillis();
System.out.println("String占用内存:"+(memory1-memory2));
System.out.println("String占用时间:"+(time2-time1));
StringBuffer s2=new StringBuffer("");
long memory3=Runtime.getRuntime().freeMemory();
long time3=System.currentTimeMillis();
for(int i=1;i<=5000;i++){
s2=s2.append(i);
}
long memory4=Runtime.getRuntime().freeMemory();
long time4=System.currentTimeMillis();
System.out.println("StringBuffer占用内存:"+(memory3-memory4));
System.out.println("StringBuffer占用时间:"+(time4-time3));
}
}
long times=System.currentTimeMillis();//当前时刻距离1970年的毫秒数
System.out.println(times);
Date date=new Date();
System.out.println(date.getTime());//当前时刻距离1970年的毫秒数
Date d2 = new Date(1000L * 3600 * 24 * 365 * 150); //距离 1970 年 150 年
System.out.println(d2);
//Date类构造方法
public Date() {
this(System.currentTimeMillis());
}
public class TimeTest {
public static void main(String[] args) throws Exception{
Date time=new Date();//系统当前时间
System.out.println(time);
System.out.println(time.getTime());
SimpleDateFormat stime1=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat stime2=new SimpleDateFormat("yyyy-MM-dd");
//将Date对象转成字符串
System.out.println(stime1.format(new Date()));
System.out.println(stime2.format(new Date()));
//将字符串转成Date对象
String times="2020-06-18";
Date date=stime2.parse(times);
System.out.println(date);
}
}
public static void main(String[ ] args) {
SimpleDateFormat s1 = new SimpleDateFormat("D");
String daytime = s1.format(new Date());
System.out.println(daytime);
}
public class TestCalendar {
public static void main(String[] args) {
GregorianCalendar gregorianCalendar=new GregorianCalendar();
int year=gregorianCalendar.get(Calendar.YEAR);
int mouth=gregorianCalendar.get(Calendar.MONTH);
int day=gregorianCalendar.get(Calendar.DAY_OF_MONTH);
int day2=gregorianCalendar.get(Calendar.DATE);
int week=gregorianCalendar.get(Calendar.DAY_OF_WEEK);
//这里是1-7周日是1
System.out.println(year);//2020
System.out.println(mouth);//打印6,实际是7月,从0开始的
System.out.println(day);//28
System.out.println(day2);//28
System.out.println(week);//打印周三,实际是周二
GregorianCalendar gregorianCalendar1=new GregorianCalendar();
gregorianCalendar1.set(Calendar.YEAR,1996);//指定1996年
gregorianCalendar1.set(Calendar.MONTH,8);//指定8月
gregorianCalendar1.set(Calendar.DATE,9);//指定9号
printCalendar(gregorianCalendar1);
GregorianCalendar gregorianCalendar2=new GregorianCalendar(2020,6,19);
gregorianCalendar2.add(Calendar.YEAR,1);//给2020+1
gregorianCalendar2.add(Calendar.MONTH,1);//给6月+1
printCalendar(gregorianCalendar2);//2021 07 19
//日历对象和时间对象转换
Date d=gregorianCalendar2.getTime();
GregorianCalendar calendar3=new GregorianCalendar();
calendar.setTime(new Date())
}
static void printCalendar(GregorianCalendar gregorianCalendar){
int year=gregorianCalendar.get(Calendar.YEAR);
int mouth=gregorianCalendar.get(Calendar.MONTH);
int day=gregorianCalendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year);
System.out.println(mouth);
System.out.println(day);
}
}