常用类
概述:
一、基本数据类型包装类;
二、字符串相关类;
不可变字符序列:String
可变字符序列:StringBuffer、StringBulider
三、时间相关处理类:
Date
DateFormat、SimpleDateFormat
Calender
四、Math类
五、枚举类
—————————————————————————————————————————————————————————————————-
一、基本数据类型的包装类:
将基本数据类型封装到一个类中,包含属性和方法,方便对象操作,位于java.lang包中。
使用:在使用过程中会涉及到自动装箱和自动拆箱
装箱:将基本数据类型转换成包装类
拆箱:将包装类转换成基本数据类型
涉及的几个常见面试题:
int、Integer、new Integer的比较 参考链接:https://blog.csdn.net/weixin_38405253/article/details/100099620
区分几个概念:
1、Integer是int的包装类,int是一种基本数据类型;
2、int默认值是0,Integer默认值是null;
3、Integer必须实例化后才可以使用,int可以直接使用;
4、Integer是对象的引用,当new一个Integer时,实际上是成生一个指针指向此对象;而int则是直接存储数据;
a、两个new Integer()比较,永远是false 因为new生成了两个新对象,内存地址不一样;
b、Integer和new Integer()比较,永远是false 因为Integer指向的是java常量池中的对象,而new Integer()指向的是堆中新建的对象,所以两个内存地址不一样;
c、两个Integer对象比较,如果是-128~127之间为true,否则为false 因为:
Integer i =100时,会被编译成 Integer i = Integer.valueof(100) 而java对Integer的valueof方法定义如下:
1 private static class IntegerCache { 2 static final int low = -128; //最小 3 static final int high; 4 static final Integer cache[]; 5 6 static { 7 // high value may be configured by property 8 int h = 127; //最大 9 String integerCacheHighPropValue = 10 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); 11 12 。。。。。。 13 14 public static Integer valueOf(int i) { 15 if (i >= IntegerCache.low && i <= IntegerCache.high) 16 return IntegerCache.cache[i + (-IntegerCache.low)]; 17 return new Integer(i); 18 }
valueof
d、int和Integer、new Integer()比较 ,只要值是相等的,结果就为true 因为Integer和new Integer()与int比较时,会自动拆箱为int,此时就是两个int变量做比较。
Integer i =100; ==> int i = i.intValue();
二、字符串相关类:
jdk1.7之后 常量池 放置到 堆 空间之中。
字符串的使用:
1、创建
String str = “abc”;
String str2 = new String(“abc”);
两种方式都可以用,第一种更常用。
2、字符串的本质
字符串的本质是字符数组或者叫做字符序列;
String类使用final修饰,不可以被继承;
使用equals方法比较的是字符数组的每一个位置的值;
使用substring方法时,需要注意是左闭右开区间 eg:String a=”abcdefg” ; s.substring(3,5); ==> de
关于String的面试题:
1、以下代码分别创建了几个对象?
String a = “123”; 首先会去常量池中找“123”,如果有则直接引用这个常量的内存地址,如果没有则创建一个,然后引用;所以至少创建0个对象,最多创建1个对象。
String b = new String(“345”); 首先new的时候一定会在堆中创建一个对象,然后去常量池中查找是否有“345”这个常量,如果有则直接引用该常量的内存地址,否则先创建一个,然后引用;所以至少创建1个对象,最多创建2个对象。
2、判断下面对象是否相等?
String a = “abc”;
String a1 = new String(“abc”);
String b = “def”;
String c = a+b;
String d = “abc”+”def”;
String e = (a+b).intern();
String f = a+”def”;
String g = getStr()+”def”;
public String getStr(){ return “abc”; }
System.out.println(a==a1);
System.out.println(c==d);
System.out.println(c==e);
System.out.println(c==f);
System.out.println(c==g);
答案:
false
true
true
false
false
结论:
能明确知道其结果的为true;
intern():先查看常量池中是否有该变量 ,如果有则直接引用;
String d = “abc”+”def”; 由于编译器优化,字节码文件反编译后会发现,会直接把”abc”+”def”优化成”abcdef”;
3、StringBuffer与StringBuilder为什么是可变字符串?
都继承AbstractStringBuilder类,继承了父类的append方法,初始容量是16,若超过了会执行expandCapacity(int minimumCapacity)方法,扩大容量;接着走到getchars()方法中,
System.arraycopy(value,srcBegin,dst,dstBegin,srsBegin-srcEnd); 其中
value:要添加的字符串;
srcBegin:指定的字符数组dst要在value的哪个位置插入;
dst:要被插入的字符数组;
dstBegin:字符数组的起始位置;
srcEnd-srcBegin:value的长度。
append方法其实是System.arraycopy()方法实现的。参考链接:https://www.cnblogs.com/NYfor2018/p/10353257.html
4、String与StringBuffer和StringBuilder的区别?
String:不可变字符串;(用反射可以改变值)
StringBuffer:可变字符串,效率低,线程安全;
StringBulider:可变字符串,效率高,线程不安全;
三、时间相关处理类:
五、枚举类:
对于什么情况下用枚举?
对一些值固定不变,例如性别,不是女就是男,一个星期七天,或者web请求的返回状态,error为-1,success为0,未登录9……
举例:
1 package com.test.CommonClass; 2 3 public enum StatusDemo { 4 BreakFirst("milk"),Lunch("apple"),Supper("eggs"); 5 StatusDemo(String name){ 6 this.name = name; 7 } 8 private String name; 9 public void show(){ 10 System.out.println(name); 11 12 StatusDemo[] sd = StatusDemo.values(); 13 for (int i=0;i<sd.length;i++){ 14 System.out.println(sd[i].name); 15 } 16 } 17 }
StatusDemo
1 package com.test.CommonClass; 2 3 public class Test { 4 public static void main(String[] args) { 5 StatusDemo bf = StatusDemo.BreakFirst; 6 bf.show(); 7 System.out.println("----------------"); 8 System.out.println(StatusDemo.Lunch.name()); 9 } 10 }
Test
。。。。。。
持续更新中