首页 > 上海同余Java工程师(一面)
头像
Wagtail
编辑于 2023-02-02 18:09 广东
+ 关注

上海同余Java工程师(一面)

1、Java技术相关问题

Q:C++和Java的区别?

A:C++允许多继承,Java只能单继承;C++允许运算符重载,Java不允许;C++有指针,Java没有。

【扩展阅读】

Java与C++有什么区别:

(1)编译运行方式:Java项目源代码通过编译器生成.calss文件而不是机器语言代码,意味其不能在电脑直接运行,必须通过JVM环境解释才能运行,也就是说,如果通过在不同的操作系统(OS)下安装相应的JVM运行环境,.class文件就可以在多种OS环境下运行,实现“一处编译,多处运行”。而C++通过IDE编译链接生成机器语言代码,也就是说特定的编译器生成的代码只能在特定的操作系统环境下运行,不具备移植性。

(2)内存安全:Java是一种内存安全型语言,由JVM负责内存的自动管理。C++则是通过new和delete实现手动的内存管理,比较灵活,但容易引起错误甚至严重崩溃(例如内存泄露)。Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++的new操作符。JVM自动进行垃圾回收操作,不需要程序员进行删除。而C++中必须由程序员释放内存资源,增加了程序设计者的负担。Java中当一个对象不被再用到时,垃圾回收器将给它加上标签以示删除。Java里垃圾回收程序是以线程方式在后台运行的,利用空闲时间工作。

(3)性能:Java的字节码(.class)文件需要通过JVM解释才能运行,因此性能表现一般。而C++会被编译为机器语言,因此其能够立即运行且速度更快。

(4)指针:指针是一种C++结构,允许您直接在内存空间中进行值管理。Java不支持指针,因此您可能使用值引用的方式进行值传递。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。

(5)重载:重载是指对某种方法或者运算符的功能进行“重新定义”。Java允许方法重载,而C++则同时支持进行运算符重载。Java语言不支持操作符重载是为了保持Java语言尽可能简单。

(6)多重继承:c++支持多重继承,这是c++的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。 Java不支持多重继承,但允许一个类实现多个接口(extends+implement),实现了c++多重继承的功能,又避免了c++中的多重继承实 现方式带来的诸多不便。

(7)数据类型及类:Java是完全面向对象的语言,所有函数和变量必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。 而c++允许将函数和变量定义为全局的。此外,Java中取消了c/c++中的结构和联合,消除了不必要的麻烦。

(8)预处理功能:Java不支持预处理功能。C/C++在编译过程中都有一个预编泽阶段,即预处理器。预处理器为开发人员提供了方便,但增加了编译的复杂性。JAVA虚拟机没有预处理器,但它提供的引入语句(import)与C++预处理器的功能类似。

(9)Java不支持缺省函数参数,而C++支持:在C++中,代码组织在函数中,函数可以访问程序的全局变量。C++增加了类,提供了类算法,该算法是与类相连的函数,C++类方法与Java类方法十分相似,然而,由于C++仍然支持C,所以不能阻止C++开发人员使用函数,结果函数和方法混合使用使得程序比较混乱。Java没有函数,作为一个比C++更纯的面向对象的语言,Java强迫开发人员把所有例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。

(10)字符串:C和C++不支持字符串变量,在C和C++程序中使用Null终止符代表字符串的结束,在Java中字符串是用类对象(String和stringBuffer)来实现的,这些类对象是Java语言的核心,用类对象实现字符串有以下几个优点:

  • 在整个系统中建立字符串和访问字符串元素的方法是一致的;
  • Java字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分;
  • Java字符串执行运行时检空,可帮助排除一些运行时发生的错误;
  • 可对字符串用“+”进行连接操作。

(11)goto语句:goto语句是C和C++的“遗物”,它是该语言技术上的合法部分,引用goto语句引起了程序结构的混乱,不易理解,goto语句主要用于无条件转移子程序和多结构分支技术。Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使用,使程序简洁易读。

(12)类型转换:在C和C++中有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在C++中可将一浮点值赋予整型变量,并去掉其尾数。Java不支持C++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。

(13)异常:JAVA中的异常机制用于捕获例外(Exception)事件,增强系统容错能力。而C++则没有如此方便的机制。

Q:C/C++需要对动态分配的内存进行手动回收,Java需要吗?

A:不需要,JVM会自动进行垃圾回收。 

【扩展阅读】

1.1 什么是垃圾?

垃圾是指运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。 

1.2 什么区域需要进行垃圾回收?

JVM 的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,因此这几个区域的内存分配和回收都具备确定性,就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而Java 堆区和方法区则不一样,这部分内存的分配和回收是动态的(方法区存在运行时常量池,可以进行动态的分配),正是垃圾收集器所需关注的部分。垃圾收集器在对堆区和方法区进行回收前,首先要确定这些区域的对象哪些可以被回收,哪些暂时还不能回收,这就要用到判断对象是否存活的算法。

————————————————

原文链接:https://blog.csdn.net/BaiKnow/article/details/122817356 

Q:Java中equals()和==的区别?

A:equals()比较对象属性的值是否相等,==比较地址是否相等。

【扩展阅读】

在JVM中,内存分为堆内存跟栈内存。他们二者的区别是: 当我们创建一个对象(new Object)时,就会调用对象的构造函数来开辟空间,将对象数据存储到堆内存中,与此同时在栈内存中生成对应的引用,当我们在后续代码中调用的时候用的都是栈内存中的引用。还需注意的一点,基本数据类型是存储在栈内存中。

初步认识equals与==的区别:

1.  ==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同 ;

2. ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较;

3. ==指引用是否相同, equals()指的是值是否相同;

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。 

Q:final关键字的使用?

A:final可以修饰类,方法,变量;

final修饰的类无法被继承;

final修饰的方法无法被覆盖,无法被重写;

final修饰的实例变量只能赋一次值;

final修饰的引用:该引用只能指向1个对象,并且它只能永远指向该对象,并且无法指向其他对象。并且在该方法执行过程中,该引用指向对象之后,该对象不会被垃圾回收器回收,直到当前方法结束,才会释放空间。注意:虽然final的引用指向对象A后,不能再重新指向对象B,但是对象A内部的数据可以被修改。 final修饰的实例变量一般添加 static修饰,static final联合修饰的变量称为“常量”,常量名建议大写,每个单词间用下划线衔接。常量一般都是公共的(用public修饰)。**常量和静态变量**区别:常量的值不能变。相同点:都是储存在方法区,并且都是在类的加载时初始化。

————————————————

原文链接:https://blog.csdn.net/HXL521666/article/details/119189253  

2、项目相关问题

Q:你的项目是团队合作完成的,你担任项目组长,如何进行人员分工?

A:按照需求分析,概要设计,详细设计,代码编写四大模块进行整体分工;按照代码的功能模块进行分工,以及整体的测试等职责进行分工。 

Q:为什么选择使用Spring Boot框架?使用框架在开发中带来了什么好处?

A:高内聚,低耦合;提供统一的接口,标准化,便于大型团队合作开发。

【扩展阅读】

软件框架软件框架是一种通用的、可复用的软件环境,它提供特定的功能,促进软件应用、产品和解决方案的开发工作。软件框架会包含支撑程序、编译器、代码、库、工具集以及API,它把所有这些部件汇集在一起,以支持项目或系统的开发。

相比于使用JSP+Servlet技术进行软件开发,使用框架有以下优势。

1.提高开发效率:如果采用成熟、稳健的框架,那么一些通用的基础工作,如事务处理、安全性、数据流控制等都可以交给框架处理,程序员只需要集中精力完成系统的业务逻辑设计,降低了开发难度。

2.提高代码规范性和可维护性:当多人协同进行开发时,代码的规范性和可维护性就变得非常重要。成熟的框架都有严格的代码规范,能保证团队整体的开发风格统一。

3.提高软件性能:使用框架进行软件开发,可以减少程序中的冗余代码。例如,使用Spring框架开发时,通过Spring的IOC特性,可以将对象之间的依赖关系交给Spring控制,方便解耦,简化开发;使用MyBatis框架开发时,MyBatis提供了XML标签,支持动态的SQL,开发人员无需在类中编写大量的SQL语句,只需要在配置文件中进行配置即可。  

Q:简单介绍一下Spring框架?

A:说了IoC,AOP特性,没讲清楚……

【扩展阅读】

Spring是Java EE编程领域的一个轻量级开源框架。Spring通过核心的Bean factory实现了底层的类的实例化和生命周期的管理。 

控制反转——Spring通过一种称作控制反转(IoC)的技术促进了低耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。它的底层设计模式采用了工厂模式,所有的 Bean 都需要注册到Bean工厂中,将其初始化和生命周期的监控交由工厂实现管理。程序员只需要按照规定的格式进行Bean开发,然后利用XML文件进行bean 的定义和参数配置,其他的动态生成和监控就不需要调用者完成,而是统一交给了平台进行管理。控制反转意味着在系统开发过程中,设计的类将交由容器去控制,而不是在类的内部去控制,类与类之间的关系将交由容器处理,一个类在需要调用另一个类时,只要调用另一个类在容器中注册的名字就可以得到这个类的实例,与传统的编程方式有了很大的不同,“不用你找,我来提供给你”,这就是控制反转的含义。 

面向切面(AOP)——Spring允许通过分离应用的业务逻辑与系统级服务(例如事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。 

MVC——客户端发送请求,服务器控制器完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller,在Controller 中就可以调用一些Service 或DAO 来进行数据操作。如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户。

Q:Spring,Spring Boot,Spring Cloud的区别?

A:不是很了解,说了Spring Boot的依赖配置比起Spring更加方便、简化。

【扩展阅读】

Spring框架

Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的,其主要优势之一就是分层架构。Spring提供了更完善的开发环境,可以为POJO(Plain Ordinary Java Object,普通Java对象)对象提供企业级的服务。

Spring Boot框架

Spring Boot框架是Pivotal团队基于Spring开发的全新框架,其设计初衷是为了简化Spring的配置,使用户能够构建独立运行的程序,提高开发效率。Spring Boot框架本身并不提供Spring框架的核心特性及扩展功能,它只是用于快速、敏捷地开发新一代基于Spring框架的应用,同时它还集成了大量的第三方类库(如Jackson、JDBC、Redis等),使用户只需少量配置就能完成相应功能。

Spring Cloud框架

Spring Cloud是一系列框架的有序集合,为开发人员构建微服务架构提供了完整的解决方案,它利用Spring Boot的开发便利性巧妙地简化了分布式系统的开发。例如,配置管理、服务发现、控制总线等操作,都可以使用Spring Boot做到一键启动和部署。可以说,Spring Cloud将Spring Boot框架进行了再封装,屏蔽掉了复杂的配置和实现原理,具有简单易懂、易部署和易维护等特点。

Q:了解消息队列MQ吗,有实际分布式开发经验吗?

A:没有……

【扩展阅读】

MQ(Message Queue):消息队列,是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由MQ服务端给其推送消息。 MQ的作用消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。

  • 解耦:一个业务需要多个模块共同实现,或者一条消息有多个系统需要对应处理,只需要主业务完成以后,发送一条MQ,其余模块消费MQ消息,即可实现业务,降低模块之间的耦合。
  • 异步:主业务执行结束后从属业务通过MQ,异步执行,减低业务的响应时间,提高用户体验。
  • 削峰:高并发情况下,业务异步处理,提供高峰期业务处理能力,避免系统瘫痪。

全部评论

(9) 回帖
加载中...
话题 回帖