当前位置:   article > 正文

Java基础知识面经_java面经

java面经

1 java不同修饰符的权限

2 a=a+b与a+=b的区别

+= 操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型, 而a=a+b则不会自动进行类型转换

3 3*0.1==0.3的答案

false,因为有些浮点数不能完全精确的表示出来。

4 short s1 = 1; s1 = s1 + 1

        前者不正确,后者正确。对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int 型,需要强制转换类型才能赋值给 short 型。而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换

5 Java创建对象的方式

  1. new创建新对象(此处如果面试官考察jvm相关知识会问到对象创建过程
  2. 通过反射机制
  3. 采用clone机制
  4. 通过序列化机制

6 序列化与反序列化

        目前主流框架很少使用到 Java 序列化,比如 SpringCloud 使用的 Json 序列化,Dubbo 虽然兼容 Java 序列化,但默认使用的是 Hessian 序列化。这是为什么呢?主要是因为 JDK 默认的序列化方式存在以下一些缺陷:无法跨语言、易被攻击、序列化的流太大、序列化性能太差等。

        对于不想进行序列化的变量,使用 transient 关键字修饰。 transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时, 被 transient 修饰的变量值不会被持久化和恢复。transient 只能修饰变量,不能修饰类和方法。

7 面向对象的三大特征

众所周知面向对象的三大特征是封装、继承、多态,继承是实现多态的基础。下面分开介绍。

封装

        封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用。封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系。也就是说用户无需知道内部的数据和方法的具体实现细节,只需根据留在外部的接口进行操作就行。

封装的实现

  1. 需要修改属性的访问控制符(修改为private)
  2. 创建getter/setter方法(用于属性的读写)
  3. 在getter/setter方法中加入属性控制语句(用于判断属性值的合法性)

封装的优点

1 将变化隔离

2 便于使用

3 提高重用性

3.4 提高安全性

缺点

将变量等使用private修饰,或者封装进方法内,使其不能直接被访问,增加了访问步骤与难度!

继承

        执行构造方法创建对象完成对象的初始化时,先执行父类的构造,完成父类的初始化,再执行本类的初始化工作。

        第一次创建Phone(父)类,是直接继承Object,而Object是jdk提供的工具类,自然不会有属性,所以Object类只提供了无参的构造,在执行Phone方法时,无论是无参还是有参都会先执行父类Object的无参构造。

        构造方法constructor中,无论是否显式还是隐式调用super(),子类在创建对象调用时都会执行super();

        显式调用构造是在需要通过父类的带参构造来完成子类的带参构造。例如Mobile类带参构造中显示调用的Super(brand,price,service)

多态

多态有两种:引用多态和方法多态。继承是多态的实现基础。

多态存在的前提

A.必须有子类和父类,具有继承或实现(继承)

B.子类必须重写父类的方法(重写)

C.父类的引用变量指向子类的对象(向上转型)

多态的优点

A. 可替换性,多态对一存在的代码具有可替代性

B. 可扩充性:增加的子类不影响已存在的类的特性的运行和操作

C. 接口性:多态时超类通过方法签名向子类提供了一个公共的接口,由子类来完善或者覆盖它而实现的

D. 灵活性:在应用中体现了灵活多样的操作,提高了使用的效率

E. 简化性: 多态简化对应用软件的代码的编写和修改过程,尤其在处理大量的对象的运算和操作时,这个特点尤为突出和重要

8 值传递和引用传递

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

9 equals与==的区别

==

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作

equals

equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以 适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的 equals方法返回的却是==的判断

总结

所有比较是否相等时,都是用equals 并且在对常量相比较时,把常量写在前面,因为使用object的 equals object可能为null 则空指针

10 深拷贝和浅拷贝

浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向 原 来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.

深拷贝:被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向被 复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的对象都 复制了一遍

11 String、StringBuffer 和 StringBuilder 的区别是什么?

回到好这个问题首先需要明白string是api 而不是基本数据类型,需要阅读过jvm相关知识。

简单来回单这三者的区别就是stringbuffer在append的时候加了synchronized关键字是线程安全,当热鱼和熊掌不可兼得,其速率要比Stringbuilder慢不少。我们在对字符串进行拼接的时候尽量使用后两个而不是使用+,因为使用+号拼接会多创建对象,并且会导致虚拟机不能对其进行及时回收。比如 hello+world会创建三个对象分别是hello和world以及helloworld。因此我们尽量使用后两者,后两者会少创建对象。

12  Java IO与 NIO的区别

  1. NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的。所以在效率上的话,肯定是NIO效率比IO效率会高出很多。
  2. NIO不在是和IO一样用OutputStream和InputStream 输入流的形式来进行处理数据的,但是又是基于这种流的形式,而是采用了通道和缓冲区的形式来进行处理数据的。

  3. 还有一点就是NIO的通道是可以双向的,但是IO中的流只能是单向的。

  4. 还有就是NIO的缓冲区(其实也就是一个字节数组)还可以进行分片,可以建立只读缓冲区、直接缓冲区和间接缓冲区,只读缓冲区很明显就是字面意思,直接缓冲区是为加快 I/O 速度,而以一种特殊的方式分配其内存的缓冲区。

  5. NIO比传统的BIO核心区别就是,NIO采用的是多路复用的IO模型,普通的IO用的是阻塞的IO模型,两个之间的效率肯定是多路复用效率更高

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/875776
推荐阅读
相关标签
  

闽ICP备14008679号