牛客网6.18

本文围绕Java编程展开,解析了多个常见问题。包括字符串比较中内存分配对结果的影响、子类方法权限规则、编译时与运行时异常区别、导包规则、线程启动与同步工具、volatile特性、表达式合法性、变量初始值、参数传递以及JVM内存分区和垃圾回收等内容。

(1)下面程序的运行结果是 false

String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println(str1 == str2);

解析:

这个问题我试着回答一下,同时也是相互学习。String str1= "hello", String str2="he"+"llo";之所以str1==str2返回true是因为两者都是在字符串常量池中(由于初始化就会在此区域分布内存)而常量池中的有个与栈区类似的特性,就是当str2指向的常量在常量区已存在时,他不会创建新的内存空间来存此常量,而是指向已有常量的内存(应该是以此节约空间),此时str1与str2这两个引用变量的值都是存"hello"的内存空间地址,但是String str3= "he"+a;String a="llo";时str1==str3返回的为false,是因为:str1指向的hello在编译期一如既往的还是分配在常量区内,a指向的llo也在常量区,虽然str3也是初始化但是编译器无法判断a这货到底是什么个情况,进而不会将str3的等号右侧声明在常量区内,而是在通过构造时在堆区中的非常量池外的内存中声明,至此str3与str1不止是分配内存的时期不同(一个在编译期,一个在运行期)而且在内存空间的区域也不同,上面最高票答案只区分了时间没区分空间。

  (2) 子类的权限不能比父类更低,也就是说在子类的方法中,我们给他的修饰符的权限不能低于它的父类

(3)

checked exception:指的是编译时异常,该类异常需要本函数必须处理的,用try和catch处理,或者用throws抛出异常,然后交给调用者去处理异常。

runtime exception:指的是运行时异常,该类异常不必须本函数必须处理,当然也可以处理。

Thread.sleep()抛出的InterruptException属于checked exception;IllegalArgumentException属于Runtime exception;

(4)要导入java/awt/event下面的所有类,叙述正确的是   

只能是import java.awt.event.*

解析:

导包只可以导到当前层,不可以再导入包里面的包中的类

(5)

A. start()方法来启动线程,真正实现了多线程运行,调用了run()方法;run()方法当作普通方法的方式调用。

B. CyclicBarrier让一组线程等待其他线程;CountDownLatch让一组线程等待某个事件发生。

C. Callable能够抛出checked exception。

D. start()方法让thread进去可运行状态(runnable),等待获取CPU的使用权。

(6)

所谓 volatile的措施,就是

1. 每次从内存中取值,不从缓存中什么的拿值。这就保证了用 volatile修饰的共享变量,每次的更新对于其他线程都是可见的。

2. volatile保证了其他线程的立即可见性,就没有保证原子性。

3.由于有些时候对 volatile的操作,不会被保存,说明不会造成阻塞。不可用与多线程环境下的计数器。

 

(7)

java不允许单独的方法,过程或函数存在,需要隶属于某一类中。——AB错 java语言中的方法属于对象的成员,而不是类的成员。不过,其中静态方法属于类的成员。——C错 D问的是java调用方法和C调用过程,C+ + 的函数一样?肯定不一样。错

以下选项中,非法的表达式是 

’a’ = 1/3

解析:

'a'是个常数,不能赋值

(8)

类中声明的变量有默认初始值;方法中声明的变量没有默认初始值,必须在定义时初始化,否则在访问该变量时会出错。

boolean类型默认值是false

(9)以下Java程序运行的结果是:   1true

public class Tester{

public static void main(String[] args){

   Integer var1=new Integer(1);

   Integer var2=var1;

   doSomething(var2);

   System.out.print(var1.intValue());

   System.out.print(var1==var2);

}

public static void doSomething(Integer integer){

    integer=new Integer(2);

    }

}

 

解析:

java中引用类型的实参向形参的传递,只是传递的引用,而不是传递的对象本身。

自己画的图,而且没有visio!直接画图画的!

 

(10)

JVM 内存可简单分为三个区:

 

1、堆区(heap):用于存放所有对象,是线程共享的(注:数组也属于对象)

 

2、栈区(stack):用于存放基本数据类型的数据和对象的引用,是线程私有的(分为:虚拟机栈和本地方法栈)

 

3、方法区(method):用于存放类信息、常量、静态变量、编译后的字节码等,是线程共享的(也被称为非堆,即 None-Heap)

 

Java 的垃圾回收器(GC)主要针对堆区

然后方法调用时,会创建栈帧在栈中,调用完是程序自动出栈释放,而不是gc释放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值