当前位置: 首页 > 后端技术 > Java

Java面试题总结(每日更新)

时间:2023-04-01 14:15:50 Java

1.Java基础1.面向对象和面向过程的区别面向对象:优点:比面向对象性能更高,因为调用时需要实例化类,开销比较大,比较耗资源;比如单片机、嵌入式开发、Linux/Unix等一般都采用面向过程的开发,性能是最重要的因素。缺点:难以维护、复用和扩展面向对象:优点:易于维护、复用和扩展。由于面向对象具有封装、继承、多态的特点,可以设计低耦合的系统,使系统更灵活,更易维护缺点:性能低于面向过程2.Jvm、JDK和JREJVMJava虚拟机(JVM)是??运行Java字节码的虚拟机。JVM对不同的系统(Windows、Linux、macOS)有特定的实现,目的是使用相同的字节码,它们都会给出相同的结果。什么是字节码?使用字节码有什么好处?在Java中,JVM能够理解的代码称为字节码(即扩展名为.class的文件)??。它不针对任何特定处理器,仅针对虚拟机。Java语言通过字节码在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言的可移植性。因此,Java程序在运行时效率更高,而且由于字节码不特定于特定机器,因此Java程序无需重新编译即可在许多不同的计算机上运行。Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM对不同的系统(Windows、Linux、macOS)有特定的实现,目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的JVM实现是Java语言“一次编译,到处运行”的关键。JDK和JREJDK是JavaDevelopmentKit,一种针对Java语言的软件开发工具包。它是一个功能齐全的JavaSDK。它拥有JRE所拥有的一切,外加编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。JRE是Java运行时环境。它是运行已编译的Java程序所需的一切的集合,包括Java虚拟机(JVM)、Java类库、java命令和其他基本组件。但是,它不能用于创建新程序。如果你只是想运行一个Java程序,那么你只需要安装JRE。如果你需要做一些Java编程工作,那么你需要安装JDK。然而,这不是绝对的。有时,即使您不打算在计算机上进行任何Java开发,您仍然需要安装JDK。例如,如果您使用JSP部署Web应用程序,从技术上讲,您只是在应用程序服务器中运行Java程序。那么为什么需要JDK?因为应用服务器会将JSP转为Javaservlet,需要使用JDK编译servlet。3.OracleJDK和OpenJDK的比较可能很多人和我一样,在看这道题之前都没有接触和使用过OpenJDK。那么Oracle和OpenJDK之间有什么主要区别吗?下面我通过收集到的一些资料来回答这个被很多人忽视的问题。对于Java7,没有什么重要的。OpenJDK项目主要基于Sun捐赠的HotSpot源代码。此外,OpenJDK被选为Java7的参考实现,由Oracle工程师维护。关于JVM、JDK、JRE、OpenJDK的区别,Oracle2012年的一篇博文有更详细的回答:Q:OpenJDK仓库中的源代码和构建Oracle的JDK的代码有什么区别?答:非常接近——我们的OracleJDK发布构建过程建立在OpenJDK7之上,仅添加了一些内容,例如部署代码,其中包括Oracle的Java插件和JavaWebStart的实现,以及一些闭源组件,例如图形光栅器,一些开源第3方组件(如Rhino),以及其他文档或第3方字体等点点滴滴。展望未来,我们打算开源OracleJDK的所有部分,除了我们认为是商业功能的部分。总结:OracleJDK版本每三年发布一次,而OpenJDK版本每三个月发布一次;OpenJDK是一个参考模型,是完全开源的,而OracleJDK是OpenJDK的一个实现,不是完全开源的;OracleJDK比OpenJDK更稳定。OpenJDK和OracleJDK的代码几乎相同,但OracleJDK有更多的类和一些错误修复。所以如果你想开发企业/商业软件,我建议你选择OracleJDK,因为它经过全面测试并且稳定。在某些情况下,有人提到他们在使用OpenJDK时可能会遇到很多应用程序崩溃,但是只需切换到OracleJDK就可以解决问题;顶级公司都在使用OracleJDK,例如AndroidStudio、Minecraft和IntelliJIDEA开发工具,其中OpenJDK不太受欢迎;与OpenJDK相比,OracleJDK在响应能力和JVM性能方面提供了更好的性能;OracleJDK不会对即将发布的版本提供长期支持,用户必须通过更新到最新版本才能获得最新版本的支持;OracleJDK根据二进制代码许可协议获得许可,而OpenJDK根据GPLv2许可获得许可。4.主类一个程序中可以有多个类,但只有一个类可以是主类。在Java应用程序中,这个主类是指包含main()方法的类,不一定是公共类。在Javaapplets中,主类是系统类JApplet或Applet的子类,必须是public类。应用程序的主类不一定是公共类,但是小程序的主类必须是公共类。主类是Java程序执行的入口点。5、应用程序和小程序的区别简单来说,应用程序是从主线程(即main()方法)启动的。小程序小程序没有main方法,主要是嵌入浏览器页面运行(调用init()线程或run()启动),嵌入浏览器类似于flash小游戏。6、java的一些特性PHP目前还不支持像Java一样对热点代码进行JIT运行时编译,但是PHP有opcache机制,可以将脚本对应的opcode缓存在内存中。PHP7还支持配置opcache.file_cache来将操作码导出到文件中。三方FacebookHHVM也支持JIT。另外,围绕opcache机制,PHP官方基于LLVM的ZendJIT分支也在开发和测试中。在php-src/Zend/bench.php中测试表明,PHPJIT分支比PHP5.4快10倍。PHP库函数用C实现,而Java核心运行时类库(jdk/jre/lib/rt.jar,大于60MB)是用Java编写的(jdk/src.zip),所以当Java应用程序运行时,用户编写的代码和引用的类库和框架必须在JVM上解释执行。Java的HotSpot机制直到一个方法执行10000次才会触发JIT编译。在此之前,它以解释模式运行以避免JIT编译成本。它比方法解释和执行花费更多的时间。PHP有一个内置的模板引擎,它本身就是一种模板语言。JavaWeb需要使用Tomcat等JSP容器或第三方模板引擎。7.Java如何支持正则表达式?Java中操作的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。另外,Java可以使用Pattern类来表示正则表达式对象,它为各种正则表达式操作提供了丰富的API,例如:importjava.util.regex.Matcher;导入java.util.regex.Pattern;classRegExpTest{publicstaticvoidmain(String[]args){Stringstr="成都(成华区)(武侯区)(高新区)";模式p=Pattern.compile(".*?(?=\\()");匹配器m=p.matcher(str);if(m.find()){System.out.println(m.group());}}}8.正则表达式及其用途在编写字符串处理的时候,经常需要找到满足某些复杂规则的字符串,正则表达式就是用来描述这些规则的工具,换句话说,正则表达式是记录文本规则的代码,计算机处理更多的信息不是数字而是字符串,而正则表达式是字符串匹配和处理最强大的工具,大多数语言都提供对正则表达式的支持。9.Java和JavaSciprtJavaScript和Java是两家公司开发的两种不同的产品,Java是原来SunMicrosystems推出的一种面向对象的编程语言,特别适用于互联网应用开发;JavaScript是Netscape的产品,为了扩展Netscape浏览器的一个基于对象的事件驱动的解释型语言,可以嵌入到网页中,并基于该功能开发。JavaScript的前身是LiveScript;Java的前身是Oak语言。两种语言的异同比较如下:-基于对象和面向对象:Java是真正的面向对象语言,即使是开发简单的程序,也必须设计对象;JavaScript是一种脚本语言,可用于制作独立于网络和用户交互的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,因此它本身提供了非常丰富的内部对象供设计者使用。-解释和编译:Java源代码必须在执行前进行编译。JavaScript是一种解释型编程语言,它的源代码不需要编译,由浏览器解释执行。(目前的浏览器几乎都采用了JIT(即时编译)技术来提高JavaScript的运行效率)-强类型变量和弱类型变量:Java使用强类型变量检查,即所有变量必须在编译前声明;变量是弱类型的,你甚至可以在使用它们之前不声明它们。JavaScript解释器在运行时检查并推断它们的数据类型。-代码格式不同。10、如何跳出Java当前的多重嵌套循环。在最外层循环前加上A等标记,然后使用breakA;你可以跳出多个循环。(Java支持带标签的break和continue语句,有点类似于C和C++中的goto语句,但是就像避免goto一样,你应该避免使用带标签的break和continue,因为它不会让你的程序变得更优雅,而且很多时候甚至有相反的效果,所以这个语法不知道更好),并且根本不能进行字符串的等号比较,否则会产生NullPointerException。11.你能告诉我&和&&的区别吗?&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与操作。逻辑与和短路与之间的区别是巨大的,尽管两者都要求运算符两端的布尔值都为真才能对整个表达式为真。&&之所以称为短路运算,是因为如果&&左边的表达式的值为false,那么右边的表达式会直接短路,不进行任何运算。很多时候我们可能需要用&&来代替&。比如在验证用户登录时,判断用户名是否不为null,不为空字符串,应该写成:username!=null&&!username.equals(""),两者的顺序不能互换,而且不能使用&运算符,因为如果第一个条件不成立,则根本无法进行字符串的equals比较,否则会产生NullPointerException。12、int和Integer的区别Java是一种近乎纯面向对象的编程语言,但是为了编程的方便,还是引入了基本数据类型,但是为了能够把这些基本数据类型当成对象来操作,Java引入了为每一种基本数据类型对应的包装类(wrapperclass),int的包装类是Integer,从Java5开始就引入了自动装箱/拆箱机制,使得两者可以互相转换。Java为每种基本类型提供了包装类型:-基本类型:boolean、char、byte、short、int、long、float、double-包装类型:Boolean、Character、Byte、Short、Integer、Long、Float、Double例如:类AutoUnboxingTest{publicstaticvoidmain(String[]args){Integera=newInteger(3);整数b=3;//将3自动装箱成Integer类型intc=3;System.out.println(a==b);//false两个引用不指向同一个对象System.out.println(a==c);//truea自动拆箱成int类型然后和c比较}}13.如何输出某个编码好的字符串publicStringtranslate(Stringstr){StringtempStr=“”;try{tempStr=newString(str.getBytes(“ISO-8859-1”),“GBK”);tempStr=tempStr.trim();}catch(Exceptione){System.err.println(e.getMessage());}返回tempStr;}14。String和StringBuffer的区别JAVA平台提供了两个类:String和StringBuffer,可以存储和操作字符串,即包含多个字符的字符数据。String类提供其值不可改变的字符串。而这个StringBuffer类提供了要修改的字符串。当您知道字符数据会改变时,您可以使用StringBuffer。通常,您使用StringBuffers来动态构造字符数据。15.String是最基本的数据类型吗?基本数据类型包括byte、int、char、long、float、double、boolean和short。java.lang.String类是final的,所以这个类不能被继承和修改。为了提高效率和节省空间,我们应该使用StringBuffer类。16、字符常量和字符串常量的区别从形式上来说:字符常量是用单引号括起来的单个字符字符串常量是用双引号括起来的几个字符从意义上来说:一个字符常量相当于一个整型值(ASCII值),可以参与表达式运算,字符串常量表示一个地址值(字符串存放在内存中的位置),占用内存大小。字符常量只占2个字节。字符串常量占几个字节(至少一个字符结束符)(注:Java中char占两个字节)17、构造函数Constructor可以重写吗?Write),但是可以重载(overloaded),所以可以看到一个类中有多个构造函数的情况。18、重载和重写的区别重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同,它发生在编译时。 重写:发生在父子类中,方法名和参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类类,且访问修饰符范围大于等于父类;如果父类的方法访问修饰符是私有的,则子类不能重写该方法。