java面试题复习(二)

Posted on 2018-02-02 20:28  菜不是假的菜  阅读(103)  评论(0编辑  收藏  举报

//我又回来了

11、数组有没有length()方法?String有没有length()方法?

数组只有length属性,String有length()方法。注意:JavaScript获取字符串长度使用length属性。//写个数组和字符串,再来个点+(alt+/)来看看

12、Java中,如何跳出当前的多重嵌套循环?

在最外层前加上标记然后用“break 标记”,可以跳出多重循环。

13、构造器(constructor)是否可被重写(override)

当然不能了,构造器都不能被继承,所以不能重写,但可以重载//又是重载和重写的问题

14、两个对象值相同(x.equals(y) == true),他们的hashcode是否相同

Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。//充分非必要条件

所以两个对象值相同时hashcode也相同//

偷来的补充:关于equalshashCode方法,很多Java程序都知道,但很多人也就是仅仅知道而已,在Joshua Bloch的大作《Effective Java》(很多软件公司,《Effective Java》、《Java编程思想》以及《重构:改善既有代码质量》是Java程序员必看书籍,如果你还没看过,那就赶紧去亚马逊买一本吧)中是这样介绍equals方法的:首先equals方法必须满足自反性(x.equals(x)必须返回true)、对称性(x.equals(y)返回true时,y.equals(x)也必须返回true)、传递性(x.equals(y)y.equals(z)都返回true时,x.equals(z)也必须返回true)和一致性(当xy引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值),而且对于任何非null值的引用xx.equals(null)必须返回false。实现高质量的equals方法的诀窍包括:1. 使用==操作符检查参数是否为这个对象的引用2. 使用instanceof操作符检查参数是否为正确的类型3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;4. 编写完equals方法后,问自己它是否满足对称性、传递性、一致性;5. 重写equals时总是要重写hashCode6. 不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉@Override注解。

15、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和C#中可以通过传引用或传输出参数来改变传入的参数的值。//赶紧去学c++

16、char 型变量中能不能存储一个中文汉字,为什么

char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特)

17、抽象类和接口的异同

同:抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。

异:抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。

抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。

抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法

18、类加载机制?

程序调用某个类时,如果该类在内存中不存在,则系统会通过加载、连接、初始化三个步骤对类初始化;类的加载是将类的class文件读入到内存中,并为之创建一个class的对象;类的加载由jvm完成,jvm类加载机制是,父类委托、全部加载、缓存机制

19、描述一下JVM加载class文件的原理机制?

JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。
由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。
类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用

20、java的内存溢出

堆栈溢出

堆栈先进后出,有两个基本操作,push栈顶加,pop栈顶减。造成的原因:过多的函数调用导致堆栈无法容纳这些调用的返回地址,一般在递归调用产生。如输入字符串过长,数组容纳不下,继续向栈顶写字符,提前申请动态内存可以避免,但如果堆栈生长方向和内存生长方向相反,在返回时就会出错

理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。//对象处于持久态,就不会回收;

一般是程序所需求的栈深度过大导致的。解决时要分清是内存泄露还是内存不足

jvm内存泄漏:调大-xmx-xms参数

持久带内存溢出:class对象释放(有过多的class对象,class对象占用信息过多)

无法创建本地线程:总容量不变,减小堆内存和非堆内存(线程内存不足)

递归改非递归,全局变量代替局部变量

Copyright © 2024 菜不是假的菜
Powered by .NET 8.0 on Kubernetes