java错题总结(第13-15页)

子进程得到的是除了代码段是与父进程共享以外,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,子进程可获得父进程的所有堆和栈的数据,但二者并不共享地址空间。3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;A执行完后a=-1,B使用-1作为a的初值,B执行完后a=-2。
摘要由CSDN通过智能技术生成

链接:try括号里有return语句, finally执行顺序_阿里巴巴笔试题_牛客网
来源:牛客网
 

1、不管有木有出现异常,finally块中代码都会执行;

2、当try和catch中有return时,finally仍然会执行;

3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;

4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

----------------------------------------------------------------------------

假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 _字节跳动笔试题_牛客网

因为+=不是原子操作,所以导致多线程操作a的结果有多种, 

 

 

不管怎样线程对a的操作就是+1后-2

1.线程1执行完再线程2执行,1-2+1-2=-2

2.线程1和2同时+1,再-2不同时,1-2-2=-3

3.线程1和2不同时+1,同时-2,1+1-2=0

4.线程1和2既同时+1又同时-2,1-2=-1

没有结果为1的情况

假设两线程为A、B,设有3种情况:

1.AB不并发:此时相当于两个方法顺序执行。A执行完后a=-1,B使用-1作为a的初值,B执行完后a=-2
2.AB完全并发:此时读写冲突,相当于只有一个线程对a的读写最终生效。相同于方法只执行了一次。此时a=-1
3.AB部分并发:假设A先进行第一次读写,得到a=1;之后A的读写被B覆盖了。B使用用1作为a的初值,B执行完后a=0

4.在A第一次读写后,a=1;然后AB都进行读A.a=1, B.a=1,B进行写后,又被A中-2写操作覆盖,此时a=-1;B再进行-2写操作a=-3

----------------------------------------------------------------------------
方法的重载:

方法重载的定义:同一个类或与他的派生类中,方法名相同,而参数列表不同的方法。其中参数列表不同指的是参数的类型,数量,类型的顺序这三种至少有一种不同。

方法重载与下列无关:

与返回值类型无关;与访问修饰符无关

构造方法也可以重载

方法重写“ 两小两同一大 ”原则

方法名相同,参数类型相同 

子类返回类型小于等于父类方法返回类型, 
子类抛出异常小于等于父类方法抛出异常, 
子类访问权限大于等于父类方法访问权限。

----------------------------------------------------------------------------

有以下一个对象,将此对象序列化为文件,并在另外一个JVM中读_阿里巴巴笔试题_牛客网

  • "123", 0

 

----------------------------------------------------------------------------

String s = new String("xyz");创建了几个StringObject?

  • 两个或一个都有可能

通过new实例的方法创建字符串时,我们都知道会在堆上创建对象。我们也知道还有字符串常量池这个东西,但是很多人不知道的是你在new字符串时jvm会去检查常量池是否存在这个对象。如果存在,它只会在堆上创建一个对象。如果不存在,它会在常量池和堆上同时都创建一个对象,也就是两个对象。

----------------------------------------------------------------------------

 

 

----------------------------------------------------------------------------

----------------------------------------------------------------------------

  • ABC

子进程得到的是除了代码段是与父进程共享以外,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,子进程可获得父进程的所有堆和栈的数据,但二者并不共享地址空间。两个是单独的进程,继承了以后二者就没有什么关联了,子进程单独运行;进程的线程之间共享由进程获得的资源,但线程拥有属于自己的一小部分资源,就是栈空间,保存其运行状态和局部自动变量的。

----------------------------------------------------------------------------

 

答案BC。

内存如下:

a -> "a(b)"
b -> "b"

a引用指向一块空间,这块空间里面包含着b对象

b引用指向一块空间,这块空间是b对象

A选项,b = null执行后b可以被垃圾回收。这里"b可以被垃圾回收"中的b指的是引用b指向的内存。这块内存即使不被引用b指向,还是被引用a指向着,不会被回收。
B选项,a = null执行后b可以被垃圾回收。从代码中可以看到,a = null是在b = null后执行的,该行执行后,引用a和b都没有指向对象,对象会被回收。

C选项,同理。
 

D选项:a,b必须在整个程序结束后才能被垃圾回收

只要通过可达性分析得出a,b不存在外部引用,则对其进行回收,可能是以下几种场景

1.在程序代码中显示的调用gc

2.新生代空间不足,触发minnor(忘记怎么拼写了)gc.

3.新生代空间不足,老年代不允内存担保或者担保失败概率超过50%进行一次full gc

所以,不一定非要程序运行结束才会触发gc,可以简单的理解为,gc是随时都有可能发生的(不严谨)。

E选项:类A和类B在设计上有循环引用,会导致内存泄露

没错,A,B设计上是存在循环引用,但是对于我们的HotSpot虚拟机来是,并没有采用引用计数法(上述场景会出现内存泄漏),而是采用可达性分析法,通过枚举gc root进行可达性分析,规避掉了循环引用带来的内存泄漏。

F选项:a, b 必须在start方法执行完毕才能被垃圾回收同D gc的时机可程序的执行逻辑有关,但是不挂钩。

 

 ----------------------------------------------------------------------------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值