java基础刷题知识点总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基础
1.object类的方法有哪些
clone() protect 创建并返回一个对象的副本
equals()用来比较某个对象是否与调用此方法的对象相等
finalize() protect
getClass() 返回一个对象的运行时类
hashCode()返回一个对象的hash值
notify()唤醒在此对象监听器上等待的单个线程。如果有多个,则随机唤醒一个
notifyAll()唤醒在此对象监听器上等待的所有线程
registerNatives() 本地私有方法,在类初始化是会调用此方法
toString() 返回当前对象的字符串表示
wait()使当前线程处于等待直到其他线程调用这个对象的notify或notifyAll方法或者超过指定的时间量
2.接口和抽象类的区别
1.首先描述接口和抽象类的特性
抽象类:是子类通用特性的集合
接口:是抽象方法的集合l
从某种意义上说抽象类包含了接口的所有功能。但是通过实现接口可以实现多继承
什么时候用抽象类和接口
1.如果一些方法必须提供默认的实现,就必须用抽象类,比如在dao层,每个类都有增删查改这几个操作,我们可以把这些操作写在抽象类里,并让抽象类提供默认的实现。
否则的话用接口
2.假如要实现多继承,则必须要用接口,java不支持多继承但是可以通过实现多个接口来解决
3.如果基本功能在不断改变,那么就用抽象类。如果不断改变基本功能并且使用接口,子类就必须不停的更改
03.抽象类是否有构造方法
抽象类有构造方法只是抽象类不能够实例化
4.Final finally finalize()方法的区别
5.Sleep()和wait()的区别
①这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。
②锁: 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS 分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
③使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,配合synchronized实现等待通信机制,而sleep可以在任何地方使用。
synchronized(x){
x.notify()
//或者wait()
}
6.short s=1;s=1+s;会报错吗?short s=1;s+=1;会报错吗?
(1)报incompatible types错误。不相容的类型错误
(2)不报错。因为s+=1相当于s=(E)(s+1),其中E为s的类型
7.Overload和override的区别
Overload是重载,它是一个类中多态性的一种表现。
Override是重写,它是子类与父类多态性之间的一种表现。
重载是指在定义多个名字相同的方法。但这些方法的返回值类型,参数类型,参数顺序,参数个数必须有一个不同,但是不能只是返回值类型不同的,因为这会使得jvm在调用方法时,不知道该调用谁
重写是覆盖掉父类的方法并重新定义一个新的方法,新的方法的返回值类型,参数类型,参数个数,参数顺序都必须跟父类中的方法保持一致。
以下是这两种定义的具体注意事项
(1)Overload 重载
1.方法的返回值类型,参数的类型,个数,顺序存在不同
2.但不能只有返回值类型
3.是针对一个类而言的
(2)override重写
1.方法的返回值类型,参数的类型,个数,顺序必须一致
2.是针对父类与子类而言的
3.定义为final的方法不能重写
4.重写的方法不能缩小包的访问权限
5.包访问权限为private的方法不能重写,否则只是在子类中定义一个新的方法
8.Java中hashtable和hashmap的区别
1.Hashtable不允许插入空的键值对,否则报错
2.Hashtable是线程安全的,所有方法均是同步的;HashMap是线程是线程不安全的。3.HashTable效率比hashmap低
9.throw和throws的区别
1.throw表示一种抛出的动作,throws表示一种状态,代表方法可能列出的抛出异常
2.throw用于方法体,throws用于方法头
3.throw只能抛出一个异常.throws后申明多个异常
10.内存溢出和内存泄漏的区
内存溢出(out of memory),是指程序在申请内存时,没有足够的内容供其使用.例如要申请一个对象却已经没有能够容纳这个对象的内存
内除泄露(memory leak)是指程序在申请内存后,无法释放掉已经申请的内存.如果频繁的出现内存泄露,最后内存会用尽而导致内存溢出.
11.String,StringBuffer 和StringBuilder的区别
可变/不可变?
String是不可变的,因为其内部的字符数组是final的,所以长度是固定的,连接字符串时实际上是创建了新的字符串对象
StringBuilder,StringBuffer是可变的,因为都继承了abstractStringBuilder ,而abstractStringBuilder 其内部是动态数组,长度不够时会自动扩容
StringBuilder是线程不安全的,StringBuffer是线程安全的,stringBuilder的效率比Strin gBuffer 高
12.抽象类和接口类中方法的访问权限有哪些?
在jdk1.8中,抽象类的成员变量,抽象方法和非抽象方法默认都是default的,意味着抽象方法的访问权限可以为default,protected,public。据说以前都是protected
接口类的成员变量永远都是public static final 成员方法永远都是public
13.Class.forname()与ClassLoader.loadClass()?
Class.forname():是一个静态方法,最常用的是Class.forname(String className);根据传入的类的全限定名返回一个Class对象.该方法在将Class文件加载到内存的同时,会执行类的初始化.
如: Class.forName("com.wang.HelloWorld");
ClassLoader.loadClass():这是一个实例方法,需要一个ClassLoader对象来调用该方法,该方法将Class文件加载到内存时,并不会执行类的初始化,直到这个类第一次使用时才进行初始化.该方法因为需要得到一个ClassLoader对象,所以可以根据需要指定使用哪个类加载器.
如:ClassLoader cl=.......;cl.loadClass("com.wang.HelloWorld");