【八股文】Java基础

1.面向对象的特征

2.JDK和JRE的区别

3.Java的特点

4.Java和C++的区别

5.Java的基本数据类型有哪些

6.什么是值传递,什么是引用传递

7.自动装箱和拆箱

8.String为什么是不可变的

9.String,StringBuilder和StringBuffer的区别

10.Object常用方法有哪些

11.两个对象的hashCode()相同,则equals()是否也一定为true

12.java创建对象的方式

13.equels和==的区别

14.接口和抽象类的区别

15.方法重载和重写的区别

16.final类的细节

17.反射

18.jdk1.8有哪些新特征

1.面向对象的特征

  • 封装:将类的信息封装在类的内部,不允许外部直接访问,而是通过该类的方法实现对隐藏信息的操作和访问

  • 继承:从已有的类派生出新的类,新的类继承父类的属性和行为,并能扩展出新的能力,大大的增加了程序的重用性和易维护性

  • 多态:同一个行为具有不同表现形式的能力。实现多态的三要素:继承,重写,父类引用指向子类对象

2.JDK和JRE的区别

  • JDK:java开发工具包。包含了java的运行环境和java工具

  • JRE:java运行时环境。包含了jvm标准和java核心类库

3.Java的特点

  • 面向对象

  • 平***立性和移植性。一处编写到处运行,JVM

  • 稳健性。强语言类型和异常处理

4.Java和C++的区别

  • Java是纯粹的面向对象语言,所有的对象都继承于java.lang.Object,C++兼容C,既支持面向对象也支持面向过程

  • C++有指针,Java的引用相当于安全指针

  • Java自动回收垃圾,C++需要手动

  • Java通过虚拟机从而实现跨平台,C++依赖于特定的平台

  • java不支持多继承,需要实现多个接口来达到目的。C++支持多继承

5.Java的基本数据类型有哪些

byte 1字节

char 2字节

short 2字节

int 4字节

lang 8字节

float 4字节

double 8字节

boolean 1字节

6.什么是值传递,什么是引用传递

  • 值传递:对于基本数据类型。传递的是变量的副本,改变不会影响原值

  • 引用传递:对于对象型变量。会进行复制,但复制后的引用变量还是指向内存的同一个对象,函数对其修改会影响到原值

注:引用类型的String的值是放在常量池中,我们改变副本不会影响原来的值

7.自动装箱和拆箱

  • 装箱:将基础类型转换成包装类型

  • 拆箱:将包装类型转换成基础类型

8.String为什么是不可变的

因为String类是final修饰的,而且它的成员变量也全是final修饰的

为什么要使用final修饰?

  • 线程安全:同一个字符串实例可以被多个线程共享,因为字符串不可变,本身就是安全的

  • hash不变:不可变的特性也使得hash值不会改变,不需要重新计算

  • 字符串常量池优化:String对象创建之后,会缓存到字符串常量池,下次需要创建同样的对象,直接返回缓存即可

9.String,StringBuilder和StringBuffer的区别

线程安全:String和StringBuffer是线程安全的,String被final修饰,StringBuffer添加了synchronized

可变:String不可变,StringBuilder和StringBuffer可变

10.Object常用方法有哪些

  • toString():默认输出地址对象

  • equals():默认比较两个引用变量是否指向同一个对象

  • hashCode():将与对象相关的信息映射成一个哈希值,默认的实现hashCode值是跟据内存地址换算出来

  • clone():java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的

  • getClass():返回此Object的运行时类,常用于java反射机制

  • wait():当前线程调用对象的wait()方法之后,当前线程会释放对象锁,进入等待状态。

  • notify():唤醒等待的线程

11.两个对象的hashCode()相同,则equals()是否也一定为true

两个对象的hashCode()相同,equlas()不一定为true。

hashCode()方法主要是用来提升对象比较效率的,我们先进行hashCode的比较,如果不相同,那么就不必要进行equals的比较,这样就大大减少了equals比较的次数

对于重写的问题:之所以重写equals()要重写hashcode(),是为了保证equals()方法返回true的情况下hashcode值也要一致,如果重写了equals()没有重写hashcode(),就会出现两个对象相等但hashcode()不相等的情况。这样,当用其中的一个对象作为键保存到hashMap、hashTable或hashSet中,再以另一个对象作为键值去查找他们的时候,则会查找不到。

12.java创建对象的方式

  • new

  • 反射

  • 反序列化

  • 第三方库

  • 克隆

13.equels和==的区别

==比较的是原生类型,equlas重写前用于检查对象的相等性,重写后一般比较值。

对于基本数据类型:只有==

对于引用类型:==比较的是对象在堆内存中的地址值是否相等

对于字符串:==比较的是内存地址,equals比较的是值

14.接口和抽象类的区别

抽象类:

JDK1.8以前:抽象类的方法默认访问权限为protected

JDK1.8时:变成default

不能被实例化,但可以在类的实体定义成员变量,构造方法

接口:

JDK1.8以前:接口的方法必须是public

JDK1.8时:变成default或public

JDK1.9时:变成private

除了static,final不能有其他变量

区别:

  • 抽象类是被子类继承,接口是被类实现

  • 抽象类能做方法实现,接口不能

  • 抽象类允许定义普通变量,接口只能定义静态常量

  • 接口主要用于对类的行为进行约束,实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系

15.方法重载和重写的区别

  • 方法重载:同个类中的多个方法可以有相同的方法名称,但有不同的参数列表(参数类型,参数个数,参数顺序有一个不同就是参数列表不同)

  • 方法重写:描述的是父类和子类的之间的。当父类的功能无法满足子类的需求时,子类可以重写父类的方法

16.final类

final类可以修饰

  • 类:这个类不能被继承

  • 方法:不能修改它的含义

  • 基础数据类型:变成了常量

  • 引用类型:初始化后不能指向其他对象,但内容可以变化

final修饰的静态常量,在编译的时候就可以确定的值,类不需要被加载。

final 修饰的是静态变量的对象,在运行时才能确定它的值,需要加载类。

17.反射

反射机制的作用:

  • 在运行时判断任意一个对象所属的类

  • 在运行时构造一个类的对象

  • 在运行时判断任意一个类所具有的成员变量和方法

  • 在运行时调用任意一个对象的方法,生产动态代理

与反射相关的类:

  • Class:表示类,用于获取类的相关信息

  • Field:表示成员变量,用于获取实例变量和静态变量

  • Method:表示方法,用于获取类中的方法参数和方法类型

  • Constructor:表示构造器,用于获取构造器的相关参数和类型

18.jdk1.8有哪些新特征

1)lambda表达式

允许把函数作为一个方法的参数

用法示例:

//对集合进行排序  //jdk1.7 List<Integer> list = Arrays.asList(10,5,25,-15,20); Collections.sort(list, new Comparator<Integer>() {    public int compare(Integer o1, Integer o2) 
        {     return o1 - o2;  } });  //jdk1.8 list.sort((i1, i2) -> {return i1 - i2;});

2)Stream

把真正的函数式编程风格引入到java中。这种风格将要处理的元素集合看成一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如排序,筛选

Stream操作的三个步骤:

  • 创建Stream:一个数据源,获取一个流

  • 中间操作:一个操作链,对数据源的数据进行处理

  • 终止操作:执行操作链并产生结果







#java##八股文#
八股文合集 文章被收录于专栏

本专栏是我总结的八股大全

全部评论
Java基础的知识学习
点赞
送花
回复
分享
发布于 2022-09-28 17:37 河南

相关推荐

6 72 评论
分享
牛客网
牛客企业服务