每天十道面试题(第二天)

1、堆(heap)和栈(stack)有什么区别?

分析

1)栈与堆都是Java用来在Ram中存放数据的地方,而且Java自动管理,程序员不可以直接设置。但是栈与堆存放的数据不同,所有的基本数据类型和类对象的引用类型都在栈中存储,由new创建出来的对象都放在堆中。

基本类型定义的变量(自动变量)存的是字面值,不是类的实例,大小可知、生存期可知,追求速度将它们存放在栈中。如果有两个字面值为2的int型变量m、n,那么m==n的值为true,因为m和n指向同一个地址。它首先会创建变量或者引用变量, 再查找栈里面有没有对应的数值,有则将变量或者引用变量指向 对应数值,没有则在Stack里面创建一个数值,再将变量或者引用变量指向数值。

2)Java中一个线程一个栈区,每一个栈中的元素都是私有的,不被其他栈所访问。Java中只有一个堆,被所有线程共享。

3)栈有后进先出的特点,栈中的数据大小与生存期都是确定的,缺乏灵活性,但是,存取速度比堆要快,仅次于CPU中的寄存器,另外栈中的数据是共享的。堆中的数据没有先后顺序(逻辑上连续就好),堆中的数据不需要事先告诉编译器它的生存期,可以动态的分配内存的大小(动态的申请内存空间),也就是这样导致了存取速度慢。不再使用的数据由Java中的垃圾回收机制自动回收。

4)方法中的局部变量使用final修饰后,放在堆中,而不是栈中。

回答

1)Stack存取速度仅次于寄存器, Heap是运行时可动态分配的数据区,从速度看比Stack慢。

2)Stack里面的数据可共享,但是其中数据的大小和生存期必须在运行前确定。Heap里面的数据不共享,大小和生存期都可以在运行时再确定。

3)heap需要new创建对象,而Stack不需要

4)Heap是 Stack的一个子集。

扫描二维码关注公众号,回复: 10814435 查看本文章

5)栈是一种线性集合,其添加和删除元素的操作应在同一端完成,栈按照后进先出的方式进行处理。堆不是线性集合,堆中的数据没有先后顺序(逻辑上连续就好)。

2、Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?

Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。

round方法:
static long round(double a)
此方法返回的参数最接近的long.
static int round(float a)
此方法返回的参数最接近的整数.

四舍五入的原理是在参数上加0.5然后进行下取整。

3、switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?

在JDK1.7之前switch可以作用在byte、short、int、char类型上

在JDK1.7之后还可以作用在String类型上

switch不能作用在long上

4、编程题: 用最有效率的方法算出2乘以8等于几?

2<<3

<<:左移,低位添0补齐

‘>>’:右移,高位添符号位

‘>>>’:右移,高位添0补齐

5、数组有没有length()这个方法? String有没有length()这个方法?

数组没有length()这个方法,有length的属性。String有length()这个方法。

String nameStr = "RuanTongSoft";
int i = nameStr.length();//获得字符串的长度为12

6、在JAVA中,如何跳出当前的多重嵌套循环?

在java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的的break语句,即可跳出

ok:
for(int i=0;i<10;i++)
{
     for(int j=0;j<10;j++)
	{
     system.out.println("i="+i+",j="+j);
     if(j==5)break ok;
	}
}

也可以让外层的循环条件表达式的结果可以收到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。

int arr[][]={{1,2,2},{2,2,5},{4,4}};
boolean found =false;
for(int i=0;i<arr.length&&!found;i++)
{
    for(int j=0;j<arr[i].length;j++)
	{
    	system.out.println("i="+i+",j="+j);
    	if(arr[i][j]==5)
		{     
    		found=true;
    		break;
		}
	}
}

7、构造器Constructor是否可被override(重写)?

构造器Constructor不能被继承,因此不能被重写(Override),但是可以被重载(Overloading)

子类不能获得父类的构造器,子类只能调用父类的构造器(super)来进行初始化。

重写是指子类和父类有相同的方法,既然子类不能继承父类的构造器,因此也就不存在重写。

子类继承父类的成员如下:非private成员变量和方法,不包括构造器。

8、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

不对,有相同的hash code

1)如果两个对象相同(equals方法返回true),那么它们的hash code值一定要相同;

2)如果两个对象的hash code相同,它们并不一定相同。

实现高质量的equals方法的诀窍包括:

1)使用==操作符检查"参数是否为这个对象的引用";

2)使用instanceOf操作符检查"参数是否为正确的类型";

3) 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;

4)编写完equals方法后,问自己它是否满足对称性(x.equals(y)返回true时,y.equals(x)也必须返回true)、传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)、一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值);

5) 重写equals时总是要重写hash code;

6) 不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉

9、是否可以继承String类?

String类是final类,故不可以继承。

关于final,我们应该了解的有:
1)final修饰的类,不能被继承,

​ a.Java中的String,Math是final类,不能被继承

​ b.Integer,Short,Byte,Character,Long,Boolean,Double,Float包装类是final类,不能被继承

​ c.在实际开发中,一般不允许使用final类,因为final类影响动态代理模式技术的实现

​ 2)final修饰方法,不能被覆盖,一般不允许使用final方法

​ 3)final修饰变量,初始化后就不允许在修改

​ final局部变量,初始化后就不允许在修改

​ final方法参数,初始化后就不允许在修改

​ final成员变量,初始化后就不允许在修改

​ 4)final static修饰的变量作为常量,一般常量名大写

10、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

是值传递。Java编程语言只有值传递参数。

值传递就是方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中,对形式参数值的改变不影响实际参数的值。引用传递也称为传地址,它传的不是参数的值。Java中没有指针,所以也没有引用传递了,仅仅有值传递。

发布了23 篇原创文章 · 获赞 39 · 访问量 2716

猜你喜欢

转载自blog.csdn.net/abc701110/article/details/105518789