0.题目汇总

  1. Java语言有哪些特点
  2. 面向对象和面向过程的区别
  3. 八种基本数据类型的大小,以及他们的封装类
  4. 标识符的命名规则
  5. instanceof 关键字的作用
  6. Java自动装箱与拆箱
  7. 重载和重写的区别
  8. equals与==的区别
  9. Hasheode的作用
  10. String StringBuffer和StringBuilder 的区别是什么?
  11. ArrayList和LinkedList的区别
  12. HashMap和HashTable的区别
  13. Collection包结构,与Collections的区别
  14. Java创建对象有几种方式?
  15. 深拷贝和浅拷贝的区别是什么?
  16. final有哪些用法?
  17. static 都有哪些用法?
  18. 3*0. 1==0. 3返回值是什么
  19. a=a+b与a+=b有什么区别吗?
  20. try catch finally; try里有return, finally还执行么?
  21. Exeption与Error包结构
  22. OOM你遇到过哪些情况,SOF你遇到过哪些情况
  23. .简述线程、程序、进程的基本概念。以及他们之间关系是什么
  24. 线程有哪些基本状态?
  25. Java序列化中如果有些字段不想进行序列化,怎么办?
  26. Java中IO流
  27. Java IO与NIO的区别

1. Java语言有哪些特点

跨平台/可移植性:编译器会把Java代码编码成(.class)中间代码,然后在Java虚拟机(Java Virtual Machine,JVM)上解释执行,而中间代码与平台无关,Java语言可以很好地跨平台执行,具有很好的可移植性;

面向对象:一切皆对象,然后衍生出面向对象的特点。

③支持多线程;

2.面向对象和面向过程的区别和优缺点

区别

img

面向过程是直接将解决问题的步骤分析出来,然后用函数把步骤一步一步实现,然后再依次调用

面向对象是将构成问题的事物,分解成若干个对象并抽象出对象的功能,通过多个对象的协作完成复杂的功能

优缺点

面向过程

  • 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源; 比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素
  • 缺点:没有面向对象易维护、易复用、易扩展

面向对象

  • 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
  • 缺点:性能比面向过程低

3.八种基本数据类型的大小,以及他们的封装类

数据类型大小/字节封装类
byte1Byte
short2Short
int4Integer
long8Long
float4Float
double8Double
char2Character
boolean1Boolean

备注:可以通过包装类.SIZE获取占用的大小

4.标识符的命名规则

  1. 只能由26个字母大小写,数字0-9,_或$组成(不能有空格)
  2. 不能由数字开头
  3. 不能使用关键字和保留字,但是能包含关键字和保留字
  4. 严格区分大小写

5.instanceof 关键字的作用

判断左边对象是否是右边类的实例。

6.Java自动装箱与拆箱

自动装箱:可以把一个基本类型的数据直接赋值给对应的包装类型;

自动拆箱:可以把一个包装类型的对象直接赋值给对应的基本类型;

Java语言是面向对象的语言,其设计理念是“一切皆对象”。但8种基本数据类型却出现了例外,它们不具备对象的特性。正是为了解决这个问题,Java为每个基本数据类型都定义了一个对应的引用类型,这就是包装类。

Java之所以提供8种基本数据类型,主要是为了照顾程序员的传统习惯。这8种基本数据类型的确带来了一定的方便性,但在某些时候也会受到一些制约。比如,所有的引用类型的变量都继承于Object类,都可以当做Object类型的变量使用,但基本数据类型却不可以。如果某个方法需要Object类型的参数,但实际传入的值却是数字的话,就需要做特殊的处理了。有了包装类,这种问题就可以得以简化。

7.重载和重写的区别

重载Overloading发生在本类,指的是多个方法名相同,参数列表不同(参数类型,参数个数甚至是参数顺序),与返回值无关

重写Overriding 发生在父类与子类之间,方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同,访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)。

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

8.equals与==的区别

==是java中的一个二元操作符,对于基本类型==是比较其值是不是相等,对于引用类型,==比较两个对象(地址)是否相同。

equals是超类Object中的方法,如果对象不重写equals方法,那么实际该对象的equals和"=="作用是一样的,都是比较的地址值,但是大部分类都会重写父类的equals方法,用来检测两个对象的内容是否相等,例如String就重写了equals方法,用来比较两个字符串内容是否相同。

equals()没有==运行速度快。

9.Hasheode的作用

在散列存储结构(如Hashtable,HashMap)中快速确定对象的存储地址,提高查找的便捷性;

在Set结构中初步判断对象是否相等,避免频繁使用效率较低的equals方法,对于hashCode相等的再执行equals方法进行确认。

注意:如果对象的equals方法被重写,那么对象的HashCode也尽量重写(因为equals相同=>hashCode必然要相同)

10. String、StringBuffer和StringBuilder 的区别

String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。

StringBuffer和StringBuilder都是可变字符类,任何对它指向的字符串的操作都不会产生新的对象,StringBuilder是线程不安全的,执行速度更快,StringBuilder是线程安全的,执行速度相对更慢。

11.ArrayList和LinkedList的区别

  1. ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构
  2. 二者都会造成空间浪费,ArrayList的空间浪费主要体现在List列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
  3. 对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针
  4. 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据

12.HashMap和HashTable的区别

HashTable

  • 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化
  • 初始size为11,扩容:newsize = olesize*2+1

HashMap

  • 底层数组+链表+红黑树实现,可以存储null键和null值,线程不安全
  • 初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂

13.Collection包结构,与Collections的区别

img

区别:

Collection,是一个集合接口,提供了对集合对象进行基本操作的通用接口方法

Collections,是针对集合类的一个工具类,提供了一系列静态方法以实现对各种集合的搜索、排序、线程安全化等操作。Collections类不能实例化,服务于Collection框架。

14.Java创建对象有几种方式

  • new创建新对象
  • 通过反射机制
  • 采用clone机制
  • 通过序列化机制

15.深拷贝和浅拷贝的区别

浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用.
深拷贝拷贝多层,每一级别的数据都会拷贝.

16.final有哪些用法

  1. 修饰变量,修饰基本数据类型后不能修改值,修饰引用数据类型后不能修改引用的指向(可以修改引用对象的属性);
  2. 修饰方法,被 final 修饰的方法不可以被重写;
  3. 修饰类,被 final 修饰的类不可以被继承;

17.static都有哪些用法

java中static的用法有:

  1. 修饰成员变量:将其变为类的成员,从而实现所有对象对于该成员的共享;
  2. 修饰成员方法:将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
  3. 修饰代码块:构造静态代码块一次性地对静态成员变量进行初始化。
  4. 静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。

18.3*0. 1==0. 3返回值是什么

返回值是假,因为在计算机中浮点数的表示是误差的。所以一般情况下不进行两个浮点数是否相同的比较。而是比较两个浮点数的差点绝对值,是否小于一个很小的正数。如果条件满足,就认为这两个浮点数是相同的。

19.a=a+b与a+=b有什么区别

主要差异在于是否能进行数据类型自动转换,+=操作符会进行隐式自动类型转换,此处 a+=b隐式的将加操作的结果类型强制转换为运算结果转换为a的类型,而a=a+b则不会自动进行类型转换。

class Solution {
    public static void main(String[] args) {
        short a = 10;
        int b = 20;
        a+=b; // 隐式类型转换为a的类型
        a = a+b; // 编译错误,=两边的类型必须一致
    }
}

20.try catch finally; try里有return, finally还执行么?

  1. 不管有木有出现异常, finally 块中代码都会执行;
  2. 当 try 和 catch 中有 return 时, finally 仍然会执行;
  3. finally 是在 return 后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的
    值保存起来,不管 finally 中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在 finally 执行前确定的;
  4. finally 中最好不要包含 return ,否则程序会提前退出,返回值不是 try 或 catch 中保存的返回值。

21.Excption与Error包结构

image-20220902162215214

22.OOM(Out Of Memory Error)你遇到过哪些情况,SOF(Stack Ove flow Error)你遇到过哪些情况

OOM:Java Heap 溢出(内存泄漏 or 申请过大堆空间)

SOF:程序递归太深而发生堆栈溢出时,抛出该错误。

23.简述线程、程序、进程的基本概念以及他们之间关系

程序:静态的代码。

进程: 进程是一个具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统资源分配和独立运行的最小单位;
线程: 线程是进程的一个执行单元,是任务调度和系统执行的最小单位;

24.线程有哪些基本状态

image-20220902163448457

25.Java序列化中如果有些字段不想进行序列化,怎么办?

对于不想进行序列化的变量,使用 transient 关键字修饰。transient 只能修饰变量,不能修饰类和方法。

26.Java中IO流

image-20220902163815789

27.Java IO和NIO的区别

IONIO
面向流面向缓冲
阻塞IO非阻塞IO
选择器

Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

28.Java程序是如何执行的?

  1. 先把Java代码编译成字节码,也就是把 .java类型的文件编译成 .class类型的文件.这个过程的大致执行流程: Java源代码 -> 词法分析器 -> 语法分析器 -> 语义分析器 -> 字节码生成器 ->最终生成字节码,其中任何一个节点执行失败就会造成编译失败;
  2. 把class文件放置到Java虚拟机,这个虚拟机通常指的是Oracle官方自带的Hotspot JVM;
  3. Java虚拟机使用类加载器(Class Loader)装载class文件;
  4. 类加载完成之后,会进行字节码校验,字节码校验通过JVM解释器会把字节码翻译成机器码交由操作系统执行.但不是所有代码都是解释执行的,JVM对此做了优化, 比如, 以Hotspot虚拟机来说, 它本身提供了JIT (Just In Time)也就是我们通常所说的动态编译器,它能够在运行时将热点代码编译成机器码,这个时候字节码就变成了编译执行.
    img

参考资料

  1. Github上365道Java高频面试复习题,助你拿爆大厂offer
  2. 面向对象和面向过程的区别
  3. 面向对象与面向过程的本质的区别
  4. 重载与重写的区别
  5. try catch finally,try里有return,finally还执行么?
  6. Java反射的作用与原理
  7. Java程序是如何执行的?
Last modification:September 7th, 2022 at 04:46 pm
如果觉得我的文章对你有用,请随意赞赏