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模型,两个之间的效率肯定是多路复用效率更高

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
全书共计 5 章 29 节,417页11.5万字,耗时 4 个月完成。涵盖数据结构、算法逻辑、并发编程、JVM以及简历和互联网大厂面试等内容。 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持Java的任何平台上无需重新编译即可运行,这得益于其独特的跨平台性,通过Java虚拟机(JVM)实现不同操作系统上的兼容。 Java的特点包括: 面向对象:Java全面支持面向对象的特性,如封装、继承和多态,使得代码更易于维护和扩展。 安全:Java提供了丰富的安全特性,如禁止指针运算、自动内存管理和异常处理机制,以减少程序错误和恶意攻击的可能性。 可移植性:Java字节码可以在所有安装了JVM的设备上执行,从服务器到嵌入式系统,再到移动设备和桌面应用。 健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能。 标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用程序;Java EE(Java Enterprise Edition)提供企业级服务,如Web服务、EJB等;而Java ME(Java Micro Edition)则针对小型设备和嵌入式系统。 社区活跃:Java有着全球范围内庞大的开发者社区和开源项目,持续推动技术进步和创新。 多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的角色,是现代软件开发不可或缺的重要工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值