Java基础高频面试题

目录

1、JDK,JRE,JVM的区别与联系

JDK

JRE

JVM

三者的联系

三者的区别

二、类加载的过程

三、JVM的结构

 四、Java基础

1,post与get请求的区别

2,三次握手

3,sql优化

4,==与euqls的区别

5,面向对像的三大特征

6,接口的意义

7,抽象类的意义

8,接口和抽象的区别

   9,父类的静态方法可否被子类重写

10,什么是不可变对象,好处是什么?

11,java创建对象的几种方式

12,&与&&的区别

13,深拷贝和浅拷贝的区别

14,final的用法

15,int 和Integer的区别

16,String,StringBuffer,StringBuilder的区别

17,了解java中的四大引用类型,它们之间的区别是什么?

18,说说进程线程之间的区别

20,创建线程的两种方式,他们的区别

静待及时更新!!!​​​​​​​


1、JDK,JRE,JVM的区别与联系

JDK

JDK(Java Development Kit) 是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
JDK是java开发工具包,基本上每个学java的人都会先在机器 上装一个JDK,那他都包含哪几部分呢?在目录下面有 六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的 是以下四个文件夹:bin、include、lib、 jre。有这样一个关系,JDK包含JRE,而JRE包 含JVM。


JRE

JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)
JRE是指java运行环境。光有JVM还不能成class的 执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。 (jre里有运行.class的java.exe)
JRE ( Java Runtime Environment ),是运行 Java 程序必不可少的(除非用其他一些编译环境编译成.exe可执行文件……),JRE的 地位就象一台PC机一样,我们写好的Win64应用程序需要操作系统帮 我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。
 

JVM

JVM(Java Virtual Machine),即java虚拟机, java运行时的环境,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。针对java用户,也就是拥有可运行的.class文件包(jar或者war)的用户。里面主要包含了jvm和java运行时基本类库(rt.jar)。rt.jar可以简单粗暴地理解为:它就是java源码编译成的jar包。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。
 

三者的联系

JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。JVM+Lib=JRE。总体来说就是,我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。


三者的区别

a.JDK和JRE区别:在bin文件夹下会发现,JDK有javac.exe而JRE里面没有,javac指令是用来将java文件编译成class文件的,这是开发者需要的,而用户(只需要运行的人)是不需要的。JDK还有jar.exe, javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。
b.JRE和JVM区别:JVM并不代表就可以执行class了,JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。


二、类加载的过程

我们编写的java代码都是保存着业务逻辑代码,java编译器将.java编译成字节码文件.class。.class文件保存着java转换后虚拟机要执行的指令,当需要某个类的时候,Java虚拟机会加载.class文件,并创建class对象,将class文件加载到虚拟机的内存,这个过程被称为类的加载。

类的生命周期前三步,其中,验证,准备,解析又被称为链接。如图所使。

后面还有使用,卸载。

在这里插入图片描述

加载
类加载过程的一个阶段,ClassLoader通过一个类的完全限定名查找此类字节码文件,并利用字节码文件创建一个class对象。

验证
目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身的安全,主要包括四种验证:文件格式的验证,元数据的验证,字节码验证,符号引用验证。

准备
为类变量(static修饰的字段变量)分配内存并且设置该类变量的初始值,(如static int i = 5 这里只是将 i 赋值为0,在初始化的阶段再把 i 赋值为5),这里不包含final修饰的static ,因为final在编译的时候就已经分配了。这里不会为实例变量分配初始化,类变量会分配在方法区中,实例变量会随着对象分配到Java堆中。

解析
这里主要的任务是把常量池中的符号引用替换成直接引用

初始化
这里是类记载的最后阶段,如果该类具有父类就进行对父类进行初始化,执行其静态初始化器(静态代码块)和静态初始化成员变量。(前面已经对static 初始化了默认值,这里我们对它进行赋值,成员变量也将被初始化)
      类记载器的任务是根据类的全限定名来读取此类的二进制字节流到 JVM 中,然后转换成一个与目标类对象的java.lang.Class 对象的实例,

在java 虚拟机提供三种类加载器,引导类加载器,扩展类加载器,系统类加载器。

三、JVM的结构

具体如下:

https://blog.csdn.net/zyzzxycj

 四、Java基础

1,post与get请求的区别

1,get请求参数再地址栏显示,post请求不显示

2,get请求不安全,post更安全,因为参数不可见

3,get请求传输比post请求快,因为post在接收数据前会先将请求头发给服务器进行确认,然后发送真正的数据

4,post能发送更多的数据类型

5,post用于修改和写入,get用于搜索排序或着筛选之类的操作,目的是资源的获取。

2,三次握手

浏览器向服务器返送tcp请求连接(第一次握手)

服务器答应进行tcp连接(第二次握手)

浏览器确认,并发送请求头及数据。(第三次握手)

3,sql优化

查询sql尽量不用select *,而用具体的字段,节约网络资源

避免在where子句中用“or”连接,可能或是索引失效,进行全表扫描

模糊查询时like,%放后面,查询的具体内容放前面,提高查询效率

用varchar不用char

使用索引,提高查询效率。索引不易太多,一般五个以内

用默认值代替null

避免在where子句中使用<>,!=等操作符号

复合索引最左特性。

union代替union all。前者会自动去掉多个结果集中的重复结果。后者将所有的结果显示出来。

4,==与euqls的区别

值类型是存放在内存中的堆栈,而引用类型的变量在栈中是存储引用类型变量的地址,而其本身则存储在堆中。

==比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中的地址是否相同,既栈中的内容是否相等

equals操作表示的是两个变量是否是同一个对象的引用,及堆中的内容是否相同

==比较多较的是两个对象的地址,equals比较的是两个对象的内容。

5,面向对像的三大特征

封装,继承,多态

6,接口的意义

功能的拓展,回调,开发的一种规范

7,抽象类的意义

为其他子类提供一个公共的类型

封装子类中重复定义的内容

定义抽象方法,子类虽然有不同的实现,但是定义是一致的

8,接口和抽象的区别

比较点   抽象类 接口
默认方法   抽象类可以有默认的方法实现   java 8之前,接口中不存在方法的实现
 
实现方式  子类使用extends关键字来继承抽象类.如果子类不是抽象类,子类需要提供抽象类中所声明方法的实现   子类使用implements来实现接口,需要提供接口中所有声明的实现.
构造器  抽象类中可以有构造器  接口中不能
和正常类区别 抽象类不能被实例化   接口则是完全不同的类型
访问修饰符 抽象方法可以有public,protected和default等修饰   接口默认是public,不能使用其他修饰符
多继承   一个子类只能存在一个父类 一个子类可以存在多个接口
添加新方法    抽象类中添加新方法,可以提供默认的实现,因此可以不修改子类现有的代码   如果往接口中添加新方法,则子类中需要实现该方法

   9,父类的静态方法可否被子类重写

不可以,重写只适用于实例方法,不能用于静态方法,而子类当中含有含有和父类相同签名的静态方法,我们一般称之为隐藏。


10,什么是不可变对象,好处是什么?

不可变对象指对象一旦创建,状态就不能被改变,任何修改都会创建一个新的对象,如string,integer,及其包装类,不可变对象最大的好处是线程安全。

11,java创建对象的几种方式

new创建新对象

通过反射机制

采用clone

通过序列化

前两者都需要显性的调用构造方法,对于clone机制,需要注意浅拷贝和深拷贝的区别,对于序列化机制需要明确其实现原理,在Java中序列化可以通过实现Externalizable或着Serializable来实现。


12,&与&&的区别

&是位操作,只有两者都符合条件,才返回true

&&是逻辑运算符,运算结果与&结果相同,但是效率较高,产生短路的效果。

13,深拷贝和浅拷贝的区别

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

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

14,final的用法

final修饰的类不可被继承

final修的方法不可以被重写

final修饰的变量不可以被改变,如果修饰引用,那么表示引用不可改变,引用指向的内容可变

final修饰的方法,JVM尝试将其内联,一提高效率

final修饰的常量,在编译阶段会存入常量池

15,int 和Integer的区别

Integer是int的包装类型,在拆箱和装箱中二这自动转换,int是基本类型,直接存放数据,而Integer是对象,一个引用指向这个对象,又有integer是一个对象,在JVM中需要一定的数据结构进行描述,象必int而言,其占用的内存更大

16,String,StringBuffer,StringBuilder的区别

String是字符串常量,final修饰,StringBuffer是字符串变量(线程安全),StringBuilder是字符串变量(线程不安全),StringBuffer和StringBuilde实现原理都一样,都是基于数组扩容来实现的。其父类都素是abstractStringBuilder,只是StringBuffer加了同步锁,更加安全。

17,了解java中的四大引用类型,它们之间的区别是什么?

在Java中主要有四大引用类型,分别是强引用,弱引用,软引用,虚引用,不同的引用类型主要体现在GC上:

强引用:如果一个对象具有强引用,他就不会被垃圾回收器回收,即使当前内存空间不足,JVM也不会回收他,而是抛出OutOfMemoryError错误,使程序异常终止,如果想中断强引用和某个对象之间的关联,可以显示的将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。

软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收

弱引用:具有弱引用的对象拥有的生命周期更短,因为当JVM进行回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收,不过由于垃圾回收器是一个优先级较低的线程,所以并不会一定能迅速发现弱引用对象

虚引用:如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。

18,说说进程线程之间的区别

进程是程序运行和资源分配的基本单位,一个程序至少一个进程,一个进程至少一个线程,进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高,线程是进程的一个实体,是cpu调度和分配的基本单位,比程序更小的能独立运行的基本单位,同一进程中的多个线程之间可以并发执行,在Linux中,进程也成为Task。

19,什么是多线程上下文切换

指cpu控制权由一个正在运行的线程切换到另一个就绪等待并获取cpu执行权的线程过程。19,创

20,创建线程的两种方式,他们的区别

继承Thread类,实现Runnable接口,后者更优:

java不支持多继承,因此扩展Thread类就代表这个子类不能扩展其他类,而实现Ruunable接口的类还可能扩展另一个类

类要求可执行即可,因此继承Thread类的开销过大

21,Thread类中start()和run()方法有什么区别

在start()方法中最终要调用Native方法start0()用来启动新创建的线程,启动后会自动调用run()方法,如果我们直接调用run()方法就和我们调用其他方法一样不会再线程中执行。

静待及时更新!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值