Java 基础面试题(二)day 2

9 篇文章 0 订阅

Java 基础面试题(二)


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

    分析

    1. 栈(stack)与堆(heap)都是Java用来在Ram(主存)中存放数据的地方,而且Java自动管理,程序员不可以直接设置。

    2. 栈(stack)与堆(heap)存放数据不同,基本数据类型类对象的引用类型都在栈(stack)中存储,由new创建出来的对象都放在堆(heap)中。

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

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

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

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

      回答

      1. Stack存取速度仅次于寄存器, Heap是运行时可动态分配的数据区,从速度看比Stack慢。
      2. Stack里面的数据可共享,但是其中数据的大小和生存期必须在运行前确定。Heap里面的数据不共享,大小和生存期都可以在运行时再确定。
      3. heap需要new创建对象,而Stack不需要
      4. Heap是 Stack的一个子集。
      5. 栈是一种线性集合,其添加和删除元素的操作应在同一端完成,栈按照后进先出的方式进行处理。堆不是线性集合,堆中的数据没有先后顺序(逻辑上连续就好)。
  2. Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?

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

    1. Math.round(11.5)=12 Math.round(-11.5)=-11 round方法返回与参数最接近的长整数,参数加1/2后求其floor。
  3. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
    1. 参数表达式的值必须是整数型或者字符型;(String 是引用类型);
    2. swtich 的参数类型一定不能低于 int 类型;(byte,short,int和char);
    3. swtich 不能作用在long上;
    4. 扩展:
      1. case 后面的数据一定是常量,且不相同;
      2. case 语句是无序的;
      3. default 语句是可选的,并且是无序的;
  4. 数组有没有length()这个方法? String有没有length()这个方法?
    1. 数组中 length 是属性;
    2. String有有length()这个方法;用来求字符串长度;
  5. 在JAVA中,区分break,continue,return?
    1. break :终止循环体的执行,一跳到底;
    2. continue:结束当前循环或者控制结构;本次循环里continue后面的语句不在执行;跳出后开始再次执行本次循环;
    3. return :一般被放在该方法的最后;结束该方法的执行;返回该方法的返回值;
  6. 构造器Constructor是否可被Override?
    1. 构造器Constructor不能被继承,所以不能被重写Override;可被重载(Overloading);
    2. 子类想获取父类的构造器,子类只能调用(super())来进行初始化。
  7. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
    1. 不对,有相同的hash code;
    2. 如果两个对象相同(equals方法返回true),那么它们的hash code值一定要相同;
    3. 反之不成立:如果两个对象的hash code相同,它们并不一定相同。
  8. 是否可以继承String类?
    1. String类是final类,故不可以继承;
    2. 关于final,我们应该了解的有:
      1. final修饰的类,不能被继承;
      2. Java中的String,Math是final类,不能被继承;
      3. Integer,Short,Byte,Character,Long,Boolean,Double,Float包装类是final类,不能被继承;
      4. 在实际开发中,一般不允许使用final类,因为final类影响动态代理模式技术的实现
    3. final修饰方法,不能被覆盖,一般不允许使用final方法
      1. final修饰变量,初始化后就不允许在修改;
      2. final局部变量,初始化后就不允许在修改;
      3. final方法参数,初始化后就不允许在修改;
      4. final成员变量,初始化后就不允许在修改;
    4. final static修饰的变量作为常量,一般常量名大写.
  9. final、finally、finalize的区别?
    1. final修饰的类不能被继承;
    2. final修饰方法。不能被重写(覆盖);
    3. final修饰变量。初始化后不允许在被修改;
    4. final 局部变量、方法参数、成员变量,始化后不允许在被修改;
    5. Java中的String,Math都是final类,不能被继承;
    6. finally是异常处理时提供的代码块;
    7. 捕获异常时,finally 块来执行任何清除操作;
    8. 当finally在捕获异常出现时,不管前面代码块执不行,finally都会执行;
    9. finalize():GC里的一个垃圾处理时调用的方法;
    10. finalize() 方法以整理系统资源或者执行其他清理工作;
  10. String, StringBuffer StringBuilder的区别。
    1. 当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。String的值是不可变的;
    2. StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。每次对String的操作都会生成新的String对象;
    3. StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
    4. StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
StringStringBufferStringBuilder
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量可变类,速度更快
不可变可变可变
线程安全线程不安全
多线程操作字符串单线程操作字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛心尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值