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

【金三银四】Java面试题基础

时间:2023-03-29 21:48:28 PHP

1.简述Java程序的编译运行过程:答:①Java编译器将Java源程序翻译成JVM可执行代码——字节码,创建源文件后,首先将程序编译成“.class”文件.②编译后的java程序得到“.class”文件后,使用命令java运行.class文件,系统会启动一个jvm进程,找到main函数的入口,开始执行main函数。2.值传递和引用传递的区别:答:①值传递:值传递是复制传递的值,然后传递复制的值,传递前后不改变原值的大小过程;②引用传递:引用传递是传递要传递的值的地址,传递前后会改变原值的大小。3、'=='和equals的区别:答:“==”运算符专门用来比较两个变量的值是否相等,即比较内存中存储的值是否相等对应的变量是一样的。要比较两种基本类型的数据或两个引用变量是否相等,只能使用==运算符。equals方法用来比较两个独立对象的内容是否相同,就像比较两个人的外貌一样。它比较的两个对象是独立的。例如,对于以下代码:Stringa=newString("foo");Stringb=newString("foo");两条new语句创建了两个对象,然后用a和b这两个变量指向其中一个对象,这是两个不同的对象,它们的首地址不同,即a和b中存放的值是不一样,所以表达式a==b会返回false,而两个对象的内容相同,所以表达式a.equals(b)会返回true。4、String与StringBuilder的区别:答:①String创新的字符串构建的字符串是不可变的。如果改变string变量的值,就会在内存中创建一个新的string,string变量会引用新创建的string。字符串的地址,但原始字符串仍然存在于内存中并且内容不变,直到java垃圾回收系统将其销毁;②StringBuilder创建一个可变字符串,StringBuilder没有实现线程安全,所以性能更好。5、在java中,throw和throws有什么区别:答:throw用于抛出java.lang.Throwable类的一个实例化对象,也就是说可以通过关键字throw抛出一个Exception,如:thrownewIllegalArgumentException("XXXXXXXXX")throws的作用是作为方法声明和签名的一部分,方法抛出相应的异常以便调用者处理。在Java中,任何未处理的已检查异常都必须在throws子句中声明。6、HashMap的hashcode的作用:答:hashCode的存在主要是为了快速查找,比如Hashtable、HashMap等,hashCode是用来确定对象在hash存储结构中的存储地址的。如果两个对象相同,适用于equals(java.lang.Object)方法,则两个对象的hashCode必须相同。如果重写了对象的equals方法,那么对象的hashCode也尽量重写,并且生成hashCode的对象必须和equals方法中使用的保持一致,否则会违反第二条上面提到的点。两个对象的hashCode相同并不一定代表这两个对象是相同的,即不一定适用于equals(java.lang.Object)方法。只能说明这两个对象在一个哈希存储结构中,比如Hashtable,他们“存储在同一个篮子里”。7.什么时候需要重写?答:一般情况下不需要重载hashCode。只有当类需要放在HashTable、HashMap、HashSet等哈希结构的集合中时,才会重载hashCode。那么为什么要重载hashCode呢?比较两个类的content属性值,如果相同则根据hashCode重写规则重写该类指定字段的hashCode()和equals()方法。8.Overload和Override有什么区别?答:Overload就是重载,Override就是覆盖,也就是重写。重载重载是指同一个类中可以有多个同名的方法,但是这些方法的参数列表不同(即参数的个数或类型不同)。重写Override是指子类中的方法可以与父类中的方法同名同参数。当通过子类创建的实例对象调用该方法时,会调用子类中定义的方法,相当于把父类中定义的完全相同的方法覆盖掉,这也是对象多态性的一种体现——面向编程。子类重写父类的方法时,只能抛出比父类少的异常,或者抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,而不能有更多问题。子类方法的访问权限只能大于父类,不能小于。如果父类的方法是私有类型,那么子类就没有覆盖的限制,相当于给子类增加了一个全新的方法。9.静态变量和实例变量有什么区别?答:语法定义的区别:static关键字应该加在静态变量之前,而不是实例变量之前。程序运行时的区别:实例变量属于对象的属性,必须创建实例对象,其中的实例变量会被分配空间,实例变量才能使用。静态变量不属于一个实例对象,而是属于一个类,所以也叫类变量。程序只要加载类的字节码,不需要创建任何实例对象,静态变量会被分配空间,静态变量就可以使用了。总之,实例变量必须先创建后才能通过this对象使用,而静态变量则可以直接使用类名来引用。10.如果main方法声明为private会怎样?答:可以正常编译,但是运行时会提示“mainmethodisnotpublic”。11.说说Servlet的生命周期?答:Servlet有很好的生命周期定义,包括加载和实例化、初始化、请求处理和服务结束。此生命周期由javax.servlet.Servlet接口的init()、service()和destroy方法表示。Servlet被服务器实例化后,容器运行它的init方法,当请求到来时运行它的service方法,service方法自动调度并运行请求对应的doXXX方法(doGet、doPost)等,以及当服务器决定销毁实例方法时调用它的销毁。Web容器加载servlet,生命周期开始。通过调用servlet的init()方法初始化servlet。它是通过调用service()方法实现的,根据不同的请求调用不同的do*()方法。为了结束服务,Web容器调用servlet的destroy()方法。12、Java的“一次编写,随处运行”是如何实现的?答:Java程序会被编译成由字节码组成的类文件。这些字节码可以在任何平台上运行,因此Java是平台无关的。13.去掉main方法的static修饰符会怎样?答:程序可以正常编译。NoSuchMethodError将在运行时抛出。14.什么是GC?为什么会有GC?答:GC是垃圾收集(GabageCollection)的意思。内存处理是程序员容易出问题的地方。忘记或错误的内存回收会导致程序或系统不稳定甚至Crash,Java提供的GC功能可以自动监测对象是否超出范围,达到自动回收内存的目的。Java语言并没有提供明确的操作方法来释放分配的内存。15.为什么Java中没有全局变量?答:全局变量是全局可见的,Java不支持全局可见变量,因为:全局变量破坏了引用透明的原则。全局变量会导致命名空间冲突。16.Java支持哪种类型的参数传递?答:Java参数是按值传递的。对于一个对象来说,传递的值是对该对象的引用,也就是说,原始引用的副本和参数引用都指向同一个对象。17、get请求和post请求的区别答:get:1、请求的参数会追加在url后面,多个参数用&连接。2、由于URL的长度限制,get方法传输的数据大小是有限的。3.安全性低,因为传输的数据会显示在请求的URL中。post:1.将请求参数放入HTTP包中,发送给服务器。2、传输的数据量比较大3、安全性更高18、是否可以在静态方法内部调用非静态方法?答:不能,静态方法只能访问静态成员,因为调用非静态方法必须先创建一个对象,然后在调用静态方法时可能还没有初始化对象。19、程序中多个类可以同时有main方法吗?答:是的。当程序运行时,我们指定要运行的类名。JVM只会在您指定的类中查找main方法。因此,如果多个类有main方法,就不存在命名冲突的问题。20.什么是反射API?它是如何实现的?答:反射是指能够在运行时查看类的状态和特性,并进行动态管理。这些功能是通过一些内置类的反射API提供的,如Class、Method、Field、Constructors等。使用示例:使用Java反射API的getName方法获取类名。21、为什么要重载hashCode方法?答:一般情况下不需要重载hashCode。只有当类需要放在HashTable、HashMap、HashSet等哈希结构的集合中时,才会重载hashCode。那么为什么要重载hashCode呢?如果你重写equals,比如根据对象的内容,保持hashCode的实现不变,那么很可能两个对象明明“相等”,但hashCode不一样。这样,当你用其中一个作为key保存在hashMap、hasoTable或hashSet中,然后用“equal”去寻找另一个作为key值来查找它们时,你就根本找不到了。22.Final在java中的作用答:Final可以修饰类、方法、变量。装饰类称为最终类。这个类不能被继承。装饰方法不能被覆盖。修改后的变量称为常量。常量必须被初始化。一旦初始化,常量的值就不能改变。23.为什么需要hashCode?答:1、通过hashCode可以快速找到小的内存块。2.通过hashCode比较比equal方法快。获取时先比较hashCode。如果hashCode不同,直接返回false。24.Super和this是什么意思?答案:Super是指当前类的父类对象这个是指当前类的对象25.Cookie和Session的区别答案:Cookie:是将数据保存在浏览器本地,每次请求时发送给服务器。Session:是在服务器端保存用户数据。26、IO和NIO的区别,NIO的优点答:1、IO是面向流的,NIO是面向缓冲区的。2.IO是阻塞的,NIO是非阻塞的。3、NIO有selector机制,可以让一个线程监听多个IO通道。NIO的优点:1.不用read()或write()就可以处理文件内容。2、NIO的处理效率非常快。27.谈谈对Java中多态的理解?答:多态是指允许不同子类型的对象对同一个消息做出不同的响应。多态性包括编译时多态性和运行时多态性。方法重载(overload)实现了编译时多态性(也称为预绑定),而方法重载(override)实现了运行时多态性(也称为后绑定)。运行时多态性是面向对象的精髓。实现运行时多态需要:方法重写:子类继承父类,重写父类中已有的或抽象的方法。对象建模:将父类的引用指向子类的对象,这样当父类的引用调用同一个方法时,会根据子类的不同对象表现出不同的行为。28.整数内部缓存?答:Integer类内部有一个静态的Integer数组,里面存放了一些已经初始化的Integer对象。一般值为(-128~127)。如果用==来比较,有时会因为值不在缓存中而返回。false,因此应该与equals进行比较。29.LinkedList的原理?答:(1)底层是一个双向链表,维护了一个first指针和一个last指针。(2)随机读写(get,set)的时间复杂度为O(n)。(3)插入操作add(object)的时间复杂度为O(1);add(index,object)的时间复杂度是O(n)。(4)删除操作remove(object)的时间复杂度为O(1);remove(index)的时间复杂度是O(n)。30.什么是开箱?答:拆箱:将包装类型转换为基本数据类型装箱:将基本数据类型转换为包装类型31、Static关键字的作用是什么?答:static可以修饰内部类、方法、变量、代码块static修饰的类是静态内部类static修饰的方法是静态方法,也就是说方法属于当前类,不属于某个对象,static方法不能是重写,可以直接使用类名调用。this或super关键字不能用在静态方法中。静态修饰变量是静态变量或类变量。静态变量由所有实例共享,不依赖于对象。静态变量在内存中只有一份。当JVM加载一个类时,只为静态变量分配一次内存。静态修饰的代码块称为静态代码块,通常用于程序优化。静态代码块中的代码只会在整个类加载完成后执行一次。静态代码块可以有多个,如果有多个块,则顺序执行。32、为什么equals()等于,hashCode必须相等,hashCode相等,但equals不要求相等?答:1、因为小内存块是根据hashCode访问的,所以hashCode必须相等。2、HashMap通过比较key的hashCode是否相等,等于true得到一个对象。hashCode之所以相等,但是equal可以不同,比如ObjectA和ObjectB都有属性name,那么hashCode是按name计算的,所以hashCode相同,但是两个对象属于不同的类型,所以equal为false.33.堆和栈有什么区别。答:Java内存分为两种,一种是栈内存,一种是堆内存。栈内存是指当程序进入一个方法时,会为这个方法分配一块私有的存储空间,用来存放方法内部的局部变量。当方法结束时,分配给这个方法的栈会被释放。变量也将被释放。堆是与栈功能不同的内存。一般用于存放不在当前方法栈中的数据。比如用new创建的对象是放在堆中的,所以不会随着方法结束而消失。方法中的局部变量用final修饰,放在堆上而不是栈上。34.String是最基本的数据类型吗?答:没有。Java中只有8种基本数据类型:byte、short、int、long、float、double、char、boolean;除了基本类型(primitivetype)和枚举类型(enumerationtype),其余都是引用类型(referencetype)类型)。35.数组有length()方法吗?String有length()方法吗答案:数组没有length()方法,但是有length属性。String有一个length()方法36.接口有什么特点?答:接口中声明的都是publicstaticfinal修饰的常量。接口中的所有方法都是抽象方法。接口没有构造方法,不能直接实例化。接口可以被多重继承。37、JDK中常用的包有哪些?答:java.lang、java.util、java.io、java.net、java.sql。38.Collection和Collections的区别答:Collection是集合类的上层接口,继承自它的接口主要有Set和List。Collections是集合类的一个辅助类,提供了一系列静态的实现集合各种操作的方法,如查找、排序、线程安全等。39.什么是Java的反射机制答:反射机制:是指程序在运行时能够访问或修改自身状态和方法的能力。40、JDK、JRE、JVM是什么关系?答:JDK即JavaDevelopmentKit,包括编译运行Java程序和JRE所必需的开发工具。编译Java程序的javac命令、启动JVM运行Java程序的Java命令、生成文档的Javadoc命令、打包的jar命令等开发工具。JRE是Java运行环境,它提供了运行Java应用程序所必需的软件环境,包括Java虚拟机(JVM)和丰富的系统类库。系统类库是Java中预先封装的功能类。直接使用即可,可以大大提高开发效率。JVM即Java虚拟机,为字节码文件(.class)提供运行环境支持。简单来说,JDK包括JRE和JVM更多优质文章,请关注我的微信公众号:架构详解