Java面试过过过

  1. 面向对象的特征

    • 抽象
    • 继承
    • 多态
  2. 是否正确:

    float f=3.4;
    

    错误,3.4为双精度(double),将双精度赋值给浮点型,属于下转型,会造成精度损失,需要强制转化

  3. & 和&& 区别

    • &:按位与和逻辑与
    • &&:短路与运算

    在验证用户登录时需判断用户名不是null而且不是空字符串时:username != null &&!username.equals(“”),两者不能交换且只能使用&&不能使用&

  4. 解释内存中的栈(stack)、堆(heap)和静态存储区的用法

    • 栈空间:一个基本数据类型的变量、一个对象的引用还有函数调用的线程保存
    • 堆空间:通过new关键字和构造器创造的对象
    • 静态存储区:程序中的字面量:直接书写的100、“hello”

    String str = new String(“hello”);

    ​ str放在栈上;new出来的字符串对象放在堆上,而“hello“这个字面量放在静态存储区中

    ​ 但是是创建了两个对象,一个是静态存储区的“xyz”,一个是用new创建在堆上的对象。

  5. 四舍五入的原理是在参数上+0.5然后向下取整。

  6. 移位是最有效的计算2次方的操作

  7. 数组只有length属性,java有length()方法。

  8. 构造器不能被继承,因此不能被重写,但可以被重载。

  9. 不能继承String类

  10. 当一个对象被当做参数传递到另一个方法后,此方法中改变了这个对象的属性,并且返回了变化后的结果,请问是值传递还是引用传递

    • java中只有值传递,当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用的过程中改变,但对象的引用是永远不会改变的。
  11. 下面程序的输出

     public static void main(String[] args) {
            String a="helloworld";
            String b=new String("helloworld");
            String c="hello"+"world";
            System.out.println(a==b);
            System.out.println(a==c);
            System.out.println(a.equals(b));
            System.out.println(a.equals(c));
            System.out.println(a.intern()==b.intern());
        }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-keDKoIno-1583376556401)(https://raw.githubusercontent.com/iszhonghu/Picture-bed/master/img/20200304170505.png)]

    intern() 方法返回字符串对象的规范化表示形式。

    它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

  12. JVM加载class文件的原理机制

    • JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类

    ​ 当java程序需要使用某个类是,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。

    ​ 类加载是值把类的.class文件中的数据读入到内存中,通常会创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。然后进入连接阶段,主要包括验证、准备和解析。最后JVM对类进行初始化

    ​ 类的加载器:根加载器、扩展加载器、系统加载器和用户自定义类加载器

  13. 静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同

    • 静态嵌套类是被声明为静态的内部类,它可以不依赖于外部类实例被实例化。
    • 内部类:需要在外部类实例化后才能实例化
  14. java中会存在内存泄漏吗

    • 存在无用但可达的对象,这些对象不能被GC回收也会发生内存泄漏
      • Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象
  15. 抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰

    • 都不可以
      • 抽象方法需要子类重写,而静态方法是无法被重写的。
      • 本地方法是由本地代码实现的方法,而抽象方法时没有实现的。
      • synchronized和方法的实现细节有关,抽象方法不设计实现细节。
  16. 静态变量和实例变量的区别

    • 静态变量是被static修饰的变量。也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且只有一个拷贝;实例变量必须依附于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。
  17. 是否可以从一个静态方法内部发出对非静态方法的调用?

    • 不可以,静态方法只能访问静态成员。因为非静态方法的调用要先创建对象,因此在调用讲台方法时可能对象并没有被初始化
  18. 如何实现对象克隆

    • 实现Cloneable接口并重写Object类中的clone()方法;
    • 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆
    import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
    
    import java.io.ByteArrayInputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    public abstract class test {
    
        private test(){
            throw new AssertionError();
        }
    
        public static <T> T clone(T obj)throws Exception{
            ByteOutputStream bout = new ByteOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bout);
            oos.writeObject(obj);
    
            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bin);
            return (T) ois.readObject();
        }
    
    }
    

    ​ 基于序列化和反序列化实现的克隆不仅仅是深度克隆,更中套的是通过泛型限定,可以检查出要克隆的对象是否支持序列化。

    ​ 这项检查是编译器完成的,不是在运行时抛出异常

  19. Error和Exception有什么区别

    • Error:表示系统级的错误和程序不必处理的异常,是恢复不是不可能但是很困难的情况下的一种严重问题:内存溢出不可能指望程序能处理这种情况
    • Exception:表示需要捕捉或者需要程序进行处理的异常,是一种设计或现实问题
发布了64 篇原创文章 · 获赞 76 · 访问量 9863

猜你喜欢

转载自blog.csdn.net/issunmingzhi/article/details/104669952
今日推荐