Loading

博主

 
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
Java虚拟机是一个可以执行Java字节码的虚拟机进程。
Java源文件被编译成能被Java虚拟机执行的字节码文件。
Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。
Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
 
2.JDK和JRE的区别是什么?
Java运行时环境(JRE)。它包括Java虚拟机、Java核心类库和支持文件。
它不包含开发工具(JDK)--编译器、调试器和其他工具。
Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。
 
3.static关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
static关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。
static方法跟类的任何实例都不相关,所以概念上不适用。 
java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。
 
4.是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
 
5.Java支持的数据类型有哪些?什么是自动拆装箱?
Java语言支持的8种基本数据类型是:byte short int long float double boolean char 
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。
比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。 
Java支持的数据类型包括两种:
一种是基本数据类型,包含byte,char,short, boolean ,int , long, float,double;
另一种是引用类型:如String等,其实是对象的引用,JVM中虚拟栈中存的是对象的地址,创建的对象实质在堆中,通过地址来找到堆中的对象的过程,即为引用类型。
自动装箱就是Java编译器在基本数据类型和对应的对象包装类型间的转化,即int转化为Integer,自动拆箱是Integer调用其方法将其转化为int的过程
 
6.==和equals的区别?==比较的是什么?为什么重写equals方法以后,一般要重写hashcode方法?
==:如果是基本类型,比较的是值,如果是引用类型,比较的是引用地址
equals:Object.equals比较的是地址,String.equals比较的是值
重写了equals方法以后,就必须要重写hashcode方法,则针对在Map,set集合中的使用,
      a:集合首先判断存储对象是不是唯一的
      b:集合类判断两个对象是否相等,先用equals()方法判断是否相等,如果返回为true,则还要判断hashcode返回值为true,才认为两个对象相等。
 
 
7.什么是值传递和引用传递?
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 
一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递
 
8.抽象类和接口的区别?
抽象类中可以没有抽象方法;
接口中的方法必须是抽象方法;
抽象类中可以有普通的成员变量;
接口中的变量必须是 static final 类型的,必须被初始化 , 接口中只有常量,没有变量。 抽象类只能单继承,接口可以继承多个父接口; 
Java8 中接口中会有 default 方法,即方法可以被实现。
 
9.Java 反射?如何通过反射获取和设置对象私有字段的值?
通过反射你可以获取任意一个类的所有属性和方法,并且可以调用这些方法和属性,令代码更加灵活,为各种框架提供开箱即用的功能。缺点:增加了安全问题,Java中一大利器注解的实现也用到了反射,比如一个@Value注解就能去配置文件中的表,因为可以基于反射分析类,然后获取到类、属性、方法的参数上的注解,获取到注解以后就可以进一步处理。
 
 

可以通过类对象的 getDeclaredField()方法字段(Field)对象,然后再通过字段

对象的 setAccessible(true)将其设置为可以访问,接下来就可以通过 get/set 方

法来获取/设置字段的值了

 
10.Java泛型?
泛型分为泛型类:如List,Set,Map,泛型接口,泛型方法
 
 
11.Java异常处理?
   Java通过面向对象的方式对异常进行处理,Java把异常按照不同的类型进行包装,并且提供了良好的接口。在Java中,每个异常都是一个对象,他都是Throwable或其子类的实例。
当一个方法出现异常后就会抛出一个异常对象,该对象包含有异常信息,调用这个对象的方法可以捕获到这个异常并且对异常进行处理。
     Java的异常处理是通过5个关键词来实现的:try,catch,throw,throws,finally
           try块:用来指定一块预防所有异常的程序,后面可以跟0个或者n个catch块,如果没有catch块,就必须根finally块
          catch块:用来捕获异常的
          throw:用来明确的抛出一个异常
          throws:用来表明一个成员函数可能抛出的各种异常
          finally块:确保代码无论发生什么异常都会被执行的一段代码。
 
 

4、你平时在项目中是怎样对异常进行处理的。

(1)尽量避免出现runtimeException 。例如对于可能出现空指针的代码,带使用对象之前一定要判断一下该对象是否为空,必要的时候对runtimeException

也进行try catch处理。

(2)进行try catch处理的时候要在catch代码块中对异常信息进行记录,通过调用异常类的相关方法获取到异常的相关信息,返回到web端,不仅要给用户良好

的用户体验,也要能帮助程序员良好的定位异常出现的位置及原因。

 
12.Java8新特性?
    lambda
    hashmap的优化:引入红黑树
 
13.说一说Lamda表达式优缺点?
链接:https://www.nowcoder.com/questionTerminal/5d29d10e35fd4003b3c186b02ab073f0


java lambda表达式的优缺点:
优点:
1. 代码简洁,开发迅速
2. 方便函数式编程
3. 非常容易进行并行计算
4. java引入lambda,改善了集合操作(引入Stream API)
缺点:
1. 代码可读性变差
2 .使得语言学习曲线陡峭,学习难度提升
3. 性能方面,在非并行计算中,很多计算未必有传统的for性能要高
4. 不容易进行调试
 
14.String,StringBuffer和StringBuilder的区别?
a.可变与不可变:
因为有final修饰字符数组,所以可以知道string对象是不可变的。
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串(没有使用final修饰),可知这两种对象都是可变的。
b.运行速度:
StringBuilder > StringBuffer > String
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
String的优化(JDK5时的优化):+拼接时,使用StringBuilder来实现,但每次都会创建一个新的StringBuilder对象
c.线程安全
StringBuilder是线程不安全的,而StringBuffer,String是线程安全的
 
15.final, finally, finalize的区别?
    1.final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的的类不可继承
    2.finally:异常处理语句结构的一部分,表示总是执行。 
    3.finalize:Object类的一个方法,我们在垃圾收集器里面学到对象可以被回收,就代表一定会被回收吗,在这里面我们知道一个对象真正宣布死亡,至少要经过两次标记过程,当对象没有覆盖funalice方法,或finalice方法已经被虚拟机调用过时,虚拟机将这两种轻快没有必要执行。
 
 
 
 
16.如何判断两个String是否相等?
分别说明什么时候可以使用==,什么时候使用equals
String是引用类型,用==比较的是引用,而string.equals比较的是值。
通常情况下,都是使用equal()来判断两个字符串的值是否相等,只有当你需要判断两个字符串是不是同一个对象时候,才使用==
 
 
 
17.String是不可变类,有什么好处?
String类在定义声明时候是final类型
String类全局变量都定义为private final 类型,表明对象一旦初始化,属性值就无法改变。
 
 
线程安全,符合字符串常量池的设计,确保hashcode的唯一性。
 
 
18.什么是字符串池?String str = new String("Cat");会创建几个字符串?
常量池,存在于堆内存中
如果字符串池中没有cat字符串,会在字符串池中创建,并且在堆内存中创建
如果字符串池中已存在,则只在堆内存中创建
 
19.String的intern()方法?
    调用intern方法时,如果池中已经包含一个与该String确定的字符串相同equals(Object)的字符串,则返回该字符串。否则,将此String对象添加到池中,并返回此对象的引用。
 
20.String是线程安全的吗?
    String是不可变类,线程安全
 
21.String是真的不可变吗?
    String底层是由char[] value 字符数组构成
    value 被 final 修饰,只能保证引用不被改变,但是 value 所指向的堆中的数组,才是真实的数据,只要能够操作堆中的数组,依旧能改变数据。而且 value 是基本类型构成,那么一定是可变的,即使被声明为 private,我们也可以通过反射来改变。
    但我们几乎不会使用反射去修改String的值,所以通常认为String类是不可变的
22.面向对象的三个基本特征?
封装:把客观事物封装成抽象类,类可以把自己的属性和方法让可信的类进行操作,对不可信的类进行隐藏
 继承:可以让某了类型的对象获得另一个类型的对象的属性的方法,实现继承和接口继承
多态:一个类实例的相同方法在不同情形下有不同表现方式
       实现多态有三个必要条件:继承,重写,向上装型
 
23.&和&&的区别?逻辑与,按位与和逻辑与的区别
 
相同点:两边的条件都是true,整个表达式的值才是true
不同点:逻辑与如果左边的表达式为false,就不用看右边了,而逻辑与按位与判断的是所有的条件
 
24.String是Java基本数据类型吗?
不是,是引用类型
25.String类可以被继承吗?
不可以,因为被final修饰,final修饰属性,方法,类,也就是属性不可变,方法不可覆盖,类不可继承
26.String s = new String(“xyz“)创建了几个字符串对象?
1个或者2个,如果字符串常量池有xyz则一个,如果没有则两个
当字符创常量池没有 “xyz”,此时会创建如下两个对象: 一个是字符串字面量 "xyz" 所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,此时该实例也是在堆中,字符串常量池只放引用。 另一个是通过 new String() 创建并初始化的,内容与"xyz"相同的实例,也是在堆中。
 
27.String和StringBuilder,StringBuffer的区别?
String是不可变字符序列,StringBuilder,StringBuffer是可变的字符序列
String线程是安全的,StringBuffer效率低,线程是安全的,StringBuilder效率高,线程是不安全的
String初始化可以空赋值null
 
28.什么是反射?
通过反射你可以获取到任意一个类的所有方法和属性,你还可以调用这些方法和属性。这种动态获取信息以及动态调用对象方法的功能成为反射机制。使代码更加灵活,为框架提供开箱即用的功能。
 
29.深拷贝和浅拷贝的区别?

数据分为基本数据类型和引用数据类型.
基本数据类型:数据直接存储在栈中;
引用数据类型:存储在栈中的是对象的引用地址,真实的对象数据存放在堆内存中。
浅拷贝:对于基础数据类型:直接复制数据值;对于引用数据类型:只是复制了对象的引用地址,新旧对象都指向同一个地址,修改其中一个对象的值,另一个对象的随之改变。
深拷贝:对于基础的数据类型:直接复制数据值;对于引用数据类型,开辟新的内存空间,在新的内存空间复制一个一模一样的对象,新老对象不共享内存,修改其中一个对象的值,不会印象另一个对象的值。

30.并发和并行的区别?
并发:两个或者多个事件在同一时间间隔发生
并行:两个或者多个事件在同一时刻发生
 
31:构造器是否可以被重写?
不可以被重写可以被重载,所以你在一个类中可以看得见有多个构造函数的情况。
 
32.Java静态变量和成员变量的区别?

public class Demo {
/**
* 静态变量:又称类变量,static修饰
*/
public static String STATIC_VARIABLE = "静态变量";
/**
* 实例变量:又称成员变量,没有static修饰
*/
public String INSTANCE_VARIABLE = "实例变量";
}

成员变量存在于堆内存中。
静态变量存在于方法区中。
成员变量与对象共存亡,随着对象创建而存在,随着对象被回收而释放。
静态变量与类共存亡,随着类的加载而存在,随着类的消失而消失。
成员变量所属于对象,所以也称为实例变量。
静态变量所属于类,所以也称为类变量。
成员变量只能被对象所调用 。
静态变量可以被对象调用,也可以被类名调用。

 
33.java集合里面有一个迭代器,为什么要设计这个迭代器?
    首先使用迭代器使用性强,因为如果使用for循环遍历,需要事先知道集合的数据结构,而且当换了一种集合的话代码不可重用要修改,不符合开闭原则。而Iterator使用用一种逻辑来遍历集合。其次使用Iterator可以在不了解集合内部数据结构的情况下直接遍历,这样可以使得集合内部的的数据不暴露。
 
34.聊一聊java中常见的并发控制手段
   1.同步代码块,通过同步代码块,来确保同一时刻只会有一个线程执行对应的业务逻辑,
   2.阻塞队列 借助同步阻塞队列,也可以实现并发控制的效果,比如队列中初始化n个元素,每次消费从队列中获取一个元素,如果拿不到则阻塞;执行完毕之后,重新塞入一个元素,这样就可以实现一个简单版的并发控制
35.创建多线程的方式
继承Thread类,实现Runnable接口,实现Callable接口,使用线程池创建

 

posted @ 2022-03-21 23:04  远乡人  阅读(176)  评论(0编辑  收藏  举报