JAVA 基础部分易混淆问题总结

前言

    最近在看了一些java基础问题,顺便将这段时间看到的容易混淆和已忘记的问题进行整理总结一下.

接下来会再写一些web方便易混淆或者不常用易忘记的问题梳理

问题列表

    1、== 和 equals区别

        ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

        equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的

        举例

1Integer aa=new Integer("11"); 2 Integer bb=new Integer("11"); 3 Integer cc=11; 4 Integer dd=11; 5 System.out.println(aa==bb); // false 原因aa和bb在内存是不同的对象 6 System.out.println(aa==cc); // false 原因aa和bb在内存是不同的对象 7 System.out.println(dd==cc); // true 原因对Integer,String这类对象直接赋值时,会有一个常量值,也就意味着他们共用了一个内存地址 8 System.out.println(aa.equals(bb)); // true 原因equals是值比较,Integer,String这类对象均重写了object的equals方法,两个内存中存的值相等,结果就为true,一会会附上源码解析 9 System.out.println(aa.equals(cc)); // true 原因equals是值比较,Integer,String这类对象均重写了object的equals方法,两个内存中存的值相等,结果就为true,一会会附上源码解析

    Integer中重写的equals源码解析如下:   

    此处使用String重写的equals源码会更容易看出值比较, 博主太懒,用Interger写的例子,不想换成String例子了, 拿好伞,准备当鸡蛋,哈哈

1public boolean equals(Object obj) { 2 if (obj instanceof Integer) { 3 return value == ((Integer)obj).intValue(); //会将object对象强转为Integer对象,并转换为int基本类型 4 } 5 return false; 6 }

    2、作用域public,private,protected,以及不写时的区别

        此问题,一图解千愁

作用域

当前类

同一包(package)

子孙类

其他包(package)

public

protected

×

不写

×

×

private

×

×

×

     3、抽象类和接口有什么区别

        接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

        两者的语法区别:

  • 抽象类和其他类有些共性即可以有构造方法可以有普通成员变量,接口中没有
  • 抽象类中可以有实现的普通方法,接口中的所有方法必须都是抽象的。
  • 抽象类中的抽象方法的访问类型可以是public,protected,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
  • 抽象类中可以包含静态方法,接口中不能包含静态方法
  • 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
  • 一个类可以实现多个接口,但只能继承一个抽象类。

    4、String s="a"+"b"+"c"+"d"; 这语句创建了几个对象?

        看一下例子:

1 String aa="a"; 2 String bb=aa+"b"+"c"+"d"; 3 String cc="a"+"b"+"c"+"d"; 4 String dd="abcd"; 5 6 System.out.println(aa==dd); // false 7 System.out.println(bb==dd); // false 8 System.out.println(cc==dd); // true

 结合第三条问题解答,可以看出String s="a"+"b"+"c"+"d"这条语句java中做了优化处理,等同于String s="abcd"

    5、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

        因为知道return的作用,立马就回答是return前,经验证此答案错误。 还是通过例子来加深记忆   

1public class TestLlan { 2static int test() 3 { 4 int x = 1; 5 try 6 { 7 return x; 8 } 9 finally 10 { 11 ++x; 12 } 13 } 14 public static void main(String[] args) throws FileNotFoundException { 15 System.out.println(TestLlan.test()); // 执行多次打印结果是 1 16 } 17}

    通过结果可以否定不是在return之前执行, 但是return后就会跳出方法,也不会是return后, 通过排除法得到是 同时执行, 欢迎大神给出更明确的答复,如何同时执行的? 难道是守护线程?

    6、一个方法中 try{}finally{} 语句块内都有return语句时,方法会返回try语句块中的还是finally语句块中的内容?

    这个根据第5个问题解答,猜测他们是同时执行的,那么方法会使用那个返回值呢?继续使用例子解惑   

1public class TestLlan { 2 public int get() 3 { 4 try 5 { 6 return 0 ; 7 } 8 finally 9 { 10 return 1 ; 11 } 12 } 13 public static void main(String[] args) throws FileNotFoundException { 14 TestLlan t = new TestLlan(); 15 int b = t.get(); 16 System.out.println(b); // 运行多次,打印值为1 17 } 18}

 what代码在搞啥嘞... 通过第5个问题排除出来是try{}里面的return和finally{}同时执行啊.. 此时只能绞尽脑汁,继续排除法得到return在finally之前执行, return执行完毕后,先存到某地方,finally在执行return时就会去覆盖第一次return的值, finally执行完毕后,才将最终值真正返出去

    7、sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException(中断异常)异常。

    8、ArrayList和Vector的区别

        这两个类都实现了List接口,他们都是有序集合,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的。
        这主要包括两个差异方面:

        (1)同步性:
        Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,就要使用Vector。
        (2)数据增长:
        ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,Vector默认增长为原来两倍,而ArrayList的增长后是原来的1.5倍。    ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。

    9、HashMap和Hashtable的区别

        (1)他们都完成了Map接口。
        (2)HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
        (3)Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。

    10、heap和stack有什么区别

        java的内存分为两类,一类是栈内存,一类是堆内存。

        栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
        堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )