java基础-简单的面试题

面试题1:

package project;

public class Test01 {
public static void main(String[] args) {
	
	String str = "abc";
	
	
	change(str);
	
	
	System.out.println(str);
}

public static void change(String str){
	str = "hello";
}
}

内存分析图:

  • 1.创建str(全局变量),引用常量池中的abc地址
  • 2.创建str(局部变量),引用常量池中的abc地址
  • 3.str(局部变量)断开引用的常量池中的abc地址
  • 4.str(局部变量)引用常量池中hello地址
  • 最后 str(全局变量)的引用一直没有改变

运行结果:

个人分析:

在调用方法时,因为str(全局变量)引用地址并没有改变,所以str的引用一直是abc。方法中的str是局部变量,它的改变并不影响全局变量str,在方法运行结束后,str(局部变量)就消亡了。(该题中两个变量名恰好一样,故意迷惑我们,我们可以将方法中的str改成a或b或c等等)

面试题2:

package project;

public class Test02 {

private static final int NUM = (int)(Math.random());

public static void main(String[] args) {
	change(new Cat());
}

public static void change(final Cat cat){
	//cat = new Cat();
	cat.setName("hello");
}

}
class Cat{
private String name;

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

}

运行结果:

个人分析:

1.用final修饰的对象,我们不可以改变对象的引用,但是可以改变对象里面的属性和方法

public static void change(final Cat cat){
//cat = new Cat();
cat.setName("hello");
}

2.不要写这样的代码:

private static final int NUM = (int)(Math.random());

因为定义出来的常量我们自己都不确定。

面试题3:

package project;

public class Test03 {
public static void main(String[] args) {
	
	String he = new String("hello");
	String hello = "hello";
	
	System.out.println(hello==he);
}
}

运行结果:

个人分析:

内存分析图:

 可以这么理解: String str = "hello"; 先在内存中找是不是有"hello"这个对象,如果有,就让str指向那个"hello".如果内存里没有"hello",就创建一个新的对象保存"hello". String str=new String ("hello") 就是不管内存里是不是已经有"hello"这个对象,都新建一个对象保存"hello"。

面试题4:

package project;

public class Test04 {
public static void main(String[] args) {
	
	Integer in1 = new Integer("123");
	System.out.println(in1);
	
	Double d = new Double("123");
	System.out.println(d);
	
	Boolean b = new Boolean("diusahdsahdsadusaodh");
	System.out.println(b);
}
}

运行结果:

个人分析:

只有传入的String对象为"true"时(true不区分大小写),才返回true。其他任何情况都返回false。而Integer和Double类型,会将传入的String类型对象进行判断,如果有字母会抛出一个NumberFormatException的异常。没有的话会将这个String类型转化为int类型。int类型会自动包装为Integer类型。

面试题5:

package project;

public class Test05 {
public static void main(String[] args) {
	
	Integer in1 = new Integer(100);
	
	Integer in2= new Integer(100);
	
	System.out.println(in1==in2);
	
	Integer in3 =100;//  Integer.valueOf(100);
	
	Integer in4= 100;
	
	System.out.println(in3==in4);
	
	Integer in5 =200;
	
	Integer in6= 200;
	
	System.out.println(in5==in6);
}
}

运行结果:

个人分析:

第一个:in1与in2是new出来的两个不同的对象,==比较的是引用地址,所以为fasle

第二个:为什么in3与in4比较为true,in5与in6比较为false??

因为在下面的代码中,我们可以看到如果(你设置的值)>=(缓存的最小值)&&(你设置的值)<=(缓存的最大值),那么会直接将缓存中的数拿出来用,这就是一个常量值。如果不满足这个条件就会直接new一个对象出来。

比如我们in3与in4设置的值为100,大于-127 && 小于128,赋的是常量值,所以为true。 而in5与in6设置的值为200,不满足这个条件,所以new出两个不同的对象,与第一题情况一样,所以为false 

 老师上课给我们讲解的几道简单的面试题,我写出来给大家分享一下。并且附上了我个人的理解,希望能帮助到大家。如果有不当之处请大家多多指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值