您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

JAVA 基础核心面试问题分析,看懂了轻

时间:2021-12-24 14:08:10  来源:  作者:Java架构师之路

文章目录

    • 如何理解面向对象编程?
    • JDK 和 JRE 有什么区别?
    • 如何理解JAVA中封装,继承、多态特性?
    • 如何理解Java中的字节码对象?
    • 你是如何理解Java中的泛型的?
    • 说说泛型应用在什么场景呢?
    • 如何理解Java中的泛型通配符?
    • 说说什么是泛型类型擦除?
    • 我们为什么要学习JVM?
    • 市场上有哪些主流的JVM呢?
    • JVM的体系结构是怎样的?
    • 你知道JVM有哪些运行模式吗?

JAVA编程基础

如何理解面向对象编程?

面向对象编程强调的是一种编程的思想,它是将客观存在的一切事物都理解为计算机中的对象,当我们通过编写程序的方式去解决一些业务问题时,应该首先想到的是用什么对象去解决这个问题,其次是才是解决这个问题的步骤。例如将大象放冰箱,不能先想到的是打开门,放大象,关门这个步骤,这只是一种面向过程编程而已。而面向对象编程,强调的是你要放的是一个什么样的大象,你是否有可以放下这个大象的冰箱,然后由谁将大象放到冰箱。也就是说面向对象的重点是对象。再比如说我要去上海,首先想到的应该是交通工具,然后才是先到哪里,再到哪里。总而言之,面向对象编程编程更符合人们看待事务的基本规律,这种思想也非常适合解决一些大型的业务问题,例如让你做一航母,你应该想到的是这个航母的构成,而不是构建这个航母的基本步骤。让你去做一个电商项目,你应该想到的是这个项目中系统服务对象的构成,例如商品服务,推荐服务,订单服务,库存服务,配送服务,优惠券服务,知识问答服务等等,这就是面向对象编程。

JDK 和 JRE 有什么区别?

JDK: Java Development Kit 的简称,Java开发工具包,提供了Java的开发环境和运行环境。

JRE: Java Runtime Environment的简称,Java运行环境,为Java的运行提供了所需环境。

实际上我们在安装JDK时,它会包含一个Jre,同时还包含了编译Java源码和运行Java 类文件的一个开发、调试和分析的工具。简单点说,假如你需要运行Java程序,只需要安装Jre就可以了,如何你需要编写,调试Java程序,需要安装JDK。

如何理解Java中封装,继承、多态特性?

封装特性:

个人认为封装特性应该是面向对象编程中最难的一个特性。大到一个系统的构成,比方说这个系统应该有多少个服务,每个服务应该有哪些模块,每个模块应该有哪些对象,这里其实强调的是一个系统边界划分的问题,当然也是封装问题。还有,小到一个对象应该有哪些属性,哪些方法,这些对象,属性和方法分别使用什么样的访问修饰符进行定义,它们的可见范围是怎样的,这都是封装特性。生活中大到国家有多个省份,每个省份有多少个地市,每个地市有多少个区县。小到一个公司有多少个事业部,每个事业部有哪些成员,每个成员都有什么特征(个头高,帅气,漂亮),什么行为(做事,说话,跳舞,唱歌),这也都是封装。在Java编程过程中,我们知道MyBatis实现了对JDBC操作数据库这个过程的封装,Spring封装了对象的创建,依赖注入的过程,SpringBoot封装了很多的基础配置,实现了开箱即用的特性,Spring Cloud 封装了一种服务治理的思想,例如如何实现服务注册,发现,调用,配置等。当然程序中的每个对象也都有自己的特性和行为,例如线程对象封装了执行任务的的特性和方法,IO对象封装了读写内存,磁盘,网络数据方式等等,这些都是封装特性。

继承特性:

Java中的继承特性是程序中实现代码的复用的一种方式,也是它最大的优势,实际编程中我们通常将共性写到父类中,特性写到子类中,当然子类也可以进行自己的扩展。这种继承关系可以看成是一种is a的关系,例如class Circle extends Shape{}表示圆形(Circle)是一个图形(Shape),class Dog extends Animal{}表示狗(Dog)是一个动物(Animal)。在Java中类的继承可以是多层,但不能是多重,即一个子类不能有多个直接的父类,子类可以继承父类所有属性和方法,但私有属性和方法不能直接访问。子类可以基于业务重写父类可见方法,以实现功能拓展。我们也可以在子类构造方法内部通过super(参数列表)调用父类构造方法和super.xxx的方式调用父类的成员。在实际应用中继承关系是一种强耦合关系,继承关系层次最好不要多于三层,否则可能难于维护。

多态特性

多态是对对象行为的一种描述,在java中基于封装和继承特性,定义了编译时多态和运行时多态。编译时的多态就是方法的重载(方法名相同,参数列表不同),运行时的多态是基于继承特性实现的一种重写。本质上就是把做什么和具体怎么做分开了,例如我们定义了要做什么,但具体怎么做完全取决于具体的对象。例如睡觉是一种行为,但是有的人睡觉时磨牙,有的人说梦话,有的人打呼噜,有的人梦游。同样,吃饭也是一种行为,有的人吃饭细嚼慢咽,有的人狼吞虎咽。在程序中我们通常将多态特性应用在方法的返回值和参数类型上,方法的返回值和参数类型能用抽象则用抽象,便于后于进行多态拓展。

如何理解Java中的字节码对象?

每个类在加载(将类读到内存)时都会创建一个字节码对象,其类型为Class类型,且这个对象在一个JVM内存中是唯一的.此对象中存储的是类的结构信息(元数据信息),节码对象的获取方式常用的有如下三种:

a) 类名.class

b) Class.forName(“包名.类名”)

c) 类的实例对象.getClass();

代码演示:

package com.java.oop;
//呈现类加载过程(通过配置JVM参数实现)
//-XX:+TraceClassLoading 
public class TestClassObject01 {
 
	static public void main(String[] args)throws Exception {
 
		Class<Object> c1=Object.class;
		Class<?> c2=Class.forName("java.lang.Object");
		System.out.println(c1==c2);	
		Class<?> c3=new Object().getClass();
		System.out.println(c2==c3);
	}
}

你是如何理解Java中的泛型的?

泛型是JDK1.5推出的一种参数化的类型,我们可以将定义类型时使用的泛型,理解为形参。例如,List、Map<K,V>接口中的E,K,V都可以看成是泛型,也就是一种特殊的形参,当我们应用这些集合时传入的具体类型可以看成是实际参数。例如List这里的String可以看成是实际参数。泛型也是是编译时的一种类型,此类型仅仅在编译阶段有效,运行时无效.例如List在运行时String会被擦除,最终系统会认为都是Object类型。

说说泛型应用在什么场景呢?

泛型是实现通用编程的一种手段,通常应用在类,接口,方法的定义上,例如:

1.泛型类: class 类名<泛型,…>{}

2.泛型接口: interface 接口名<泛型,…>{}

3.泛型方法: 访问修饰符 <泛型> 方法返回值类型 方法名(形参){}

代码演示:

泛型接口的定义,例如:

interface Container<T>{
 //泛型接口
	 void add(T t);
	 T get(int i);
	 int size();
}
interface Task<Param,Result>{
 //思考map中的泛型Map<K,V>
	/**
	 * 此方法用于执行任务
	 * @param arg 其类型由泛型参数Param决定
	 * @return 其类型由泛型参数result决定
	 */
	Result execute(Param arg1);
}

泛型类的定义,例如:

interface Result<T>{
 //泛型类
	T data;
}

泛型方法定义,例如:

class ObjectFactory{
 
	 //泛型方法
	 public <T>T newInstance(Class<T> cls)
	 throws Exception{
 
		 return cls.newInstance();
	 }
}
class ContainerUtils{
 
	//泛型方法
	//1)静态方法假如有泛型肯定是泛型方法
	//2)泛型类和泛型接口不作用于静态方法
	//3)泛型方法一定是静态方法吗?不是
	public static <T>void sort(List<T> list) {
 }
}

总结:

  1. 泛型类和泛型接口用于约束类或接口中实例方法参数类型,返回值类型。
  2. 泛型类或泛型接口中实际泛型类型可以在定义子类或构建其对象时传入。
  3. 泛型方法用于约束本方法(实例方法或静态方法)的参数类型或返回值类型。
  4. 泛型类上的泛型不能约束类中静态方法的泛型类型。

如何理解Java中的泛型通配符?

Java中的泛型通配符一般可以理解为一种通用的类型,也可认为不确定性类型。从应用上,它可分为三种类型:

1)无届通配符:<?>

2)上届通配符:<? extends 类型>

3)下届通配符:<类型 extends ?>

代码演示:

//无届通配符
 Class<?> c2=Class.forName("java.lang.Object");
//上界通配符
static void doPrint(List<? extends CharSequence> list){
 
		System.out.println(list);
}
//下界通配符
static void doPrint(Set<? super Integer> set){
 //下届
		System.out.println(list);
}

说说什么是泛型类型擦除?

泛型是编译时的一种类型,在运行时无效,运行时候都会变成Object类型。

例如基于反射向List list=new ArrayList() 集合中添加整数,关键代码如下:

List<String> list=new ArrayList<>();
list.add("A");
list.add("B");
//list.add(100);
//在运行时将100写入到list集合
//1.获取list对象的字节码对象
Class<?> cls=list.getClass();
//2.获取list字节码对象中的add方法对象
Method method=
//cls.getDeclaredMethod("add",Object.class);
cls.getDeclaredMethod("add",int.class,Object.class);
//3.通过反射执行方法对象将100写入集合。
//执行list对象的method方法
//method.invoke(list, 100);
method.invoke(list, 0,100);
System.out.println(list);

Java 虚拟机分析

你是如何理解JVM的?

JVM(Java Virtual machine)是JAVA平台的一部分,是一种能够运行Java bytecode的虚拟机,如图所示:

JAVA 基础核心面试问题分析,看懂了轻松拿捏HR

 

JVM是硬件计算机的抽象(虚构)实现,可以解释执行JAVA字节码,也是实现JAVA跨平台运行的基石,如图所示:

JAVA 基础核心面试问题分析,看懂了轻松拿捏HR

 

我们为什么要学习JVM?

深入理解JVM可以帮助我们从平台角度提高解决问题的能力,例如:

  1. 有效防止内存泄漏(Memory leak)。
  2. 优化线程锁的使用 (Thread Lock)。
  3. 科学进行垃圾回收 (Garbage collection)。
  4. 提高系统吞吐量 (throughput)。
  5. 降低延迟(Delay),提高其性能(performance)。

市场上有哪些主流的JVM呢?

JVM是一种规范基于这种规范,不同公司就对此规范做了具体实现,例如市场上的一些主流JVM如下:

  1. JRockit VM (BEA公司研发,后在2008年由Oracle公司收购)。
  2. HotSpot VM (Sun公司研发,后在2010年由Oracle公司收购)。
  3. J9 VM (IBM 内部使用)。
    说明:HotSpot目前是甲骨文公司最主要的一款JVM虚拟机,也是我们现在最常用的一种。

JVM的体系结构是怎样的?

JVM (Java Hotspot Architecture:主要分为三大部分,如图-6所示:

  1. 类加载系统 (ClassLoader System) :负责加载类到内存。
  2. 运行时数据区 (Runtime Data Area):负责存储数据信息。
  3. 执行引擎 (Execution Engine):负责调用对象执行业务。
JAVA 基础核心面试问题分析,看懂了轻松拿捏HR

 

其中:

  1. ClassLoader作用是什么?(负责将类从磁盘或网络加载内存)
  2. ClassLoader 可以自己定义吗?(可以,参考Tomcat,MyBatis,Spring等,他们都有自定义类加载器)
  3. JVM 中的方法区(Method Area) 如何理解?(逻辑上的一种定义,不同JVM有不同实现,比方说有JVM中称元数据区,有的称持久代)
  4. HotSpot JDK8虚拟机在创建对象时,所有的对象都会分配在堆中吗?(不一定,小对象未逃逸,可以直接分配在栈上)
  5. 如何知道类的加载顺序?(可通过配置JVM 参数-XX:+TraceClassLoading 检查类的加载过程)

JDK8中的Hotspot简易内存体系结构如下:

JAVA 基础核心面试问题分析,看懂了轻松拿捏HR

 

你知道JVM有哪些运行模式吗?

JVM有两种运行模式Server与Client。两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢;但是启动进入稳定期之后Server模式的程序运行速度比Client要快很多。这是因为Server模式启动的JVM采用的是重量级的虚拟机,对程序采用了更多的优化;而Client模式启动的JVM采用的是轻量级的虚拟机。所以Server启动慢,但稳定后速度比Client远远要快。

现在64位的jdk中默认都是server模式(可通过 java -version进行查看)。当虚拟机运行在-client模式的时候,使用的是一个代号为C1的轻量级编译器, 而server模式启动的虚拟机采用相对重量级,代号为C2的编译器.c1、c2都是JIT编译器, C2比C1编译器编译的相对彻底,服务起来之后,性能更高。



Tags:JAVA   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Tags: JAVA  点击:(5)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  Tags: JAVA  点击:(11)  评论:(0)  加入收藏
1 前言ObjectiveSQL 是一个Java ORM 框架,它不仅是Active Record 模式在Java 中的应用,同时还针对复杂SQL 编程提供近乎完美的解决方案,使得Java 代码与SQL 语句有机的结合,改变...【详细内容】
2021-12-13  Tags: JAVA  点击:(13)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  Tags: JAVA  点击:(16)  评论:(0)  加入收藏
流为什么动不动就说 io 流? 这个“流”是什么意思呢?流这个词,也常常出现在电竞选手的领域。大家都说,哦,这个队伍经常上去卖人头来取得局面优势的这种打法,叫献祭流。而到了 Java...【详细内容】
2021-11-15  Tags: JAVA  点击:(32)  评论:(0)  加入收藏
1. 字符串有整型的相互转换String a = String.valueOf(2); //integer to numeric stringint i = Integer.parseInt(a); //numeric string to an int 2. 向文件末尾添加内容B...【详细内容】
2021-10-13  Tags: JAVA  点击:(91)  评论:(0)  加入收藏
负载均衡是将客户端请求访问,通过提前约定好的规则转发给各个server。其中有好几个种经典的算法,下面我们用Java实现这几种算法。 轮询算法轮询算法按顺序把每个新的连接请求...【详细内容】
2021-09-27  Tags: JAVA  点击:(51)  评论:(0)  加入收藏
1 背景近日在给公司同事分享Arthas 工具使用时候,被它强悍的功能震撼到了就好奇研究了下它的原理及底层实现,其实它是通过Java agent 来实现的,也就深入地学习了一下Java agent...【详细内容】
2021-09-09  Tags: JAVA  点击:(66)  评论:(0)  加入收藏
近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成了两个技术方案的选择,一是 tesseract + Python flask的方案实现,二是 tesseract + Sp...【详细内容】
2021-09-07  Tags: JAVA  点击:(81)  评论:(0)  加入收藏
Java String的判空方法是Java开发中的一个很基础的方法,下面列举了一些常用的方法。 方法一:效率高,也是最常用的方法。if(s == null || s.length() <= 0) 方法二:也是常看到的...【详细内容】
2021-09-03  Tags: JAVA  点击:(120)  评论:(0)  加入收藏
▌简易百科推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(12)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(10)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(17)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
一、概述观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察...【详细内容】
2021-12-13  唯一浩哥    Tags:Java   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条