概述:

一、基本数据类型包装类;

二、字符串相关类;

        不可变字符序列: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

 

。。。。。。

持续更新中

 

 

 

 

 

 

 

 

 

            

       

版权声明:本文为bentuzi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/bentuzi/p/12638841.html