面试-JAVA基础

来源:互联网 发布:杭州恩牛网络 上市 编辑:程序博客网 时间:2024/06/05 00:54

1、char型变量能不能存储一个汉字?为什么?
可以。因为char类型存储unicode字符,包含中文。char型是16位,存储汉字的编码至少16位。

2、==和equals的区别
在object类里两者相同,
在String、Integer等类下,
==比较的是地址,而equals比较的是值。

3、Integer和int的区别
Integer是引用类型,是int类型的包装类,int类型是基本数据类型。
Integer作为成员变量的初始值为null,
int是0。
Integer提供了很多方法,比如字符串转整数等

4、Math.round ceil floor
Math.round 四舍五入
Math.round(11.5) 12
Math.round(-11.5) 11

Math.ceil 向上取整
Math.ceil(11.4) 12
Math.ceil(-11.4) 11

Math.floor 想下取整
Math.floor(11.6) 11
Math.floor(-11.6) -12

5、super.getClass()能获取父类Class对象吗?如果不能,应该如何获取
不能。getClass()是final修饰的,所以子类调用的也是这个方法
可以通过getClass().getSuperClass().getName()

6、String、StringBuffer、StringBuilder区别
在经常做字符串操作时,使用字符串缓冲里,StringBuffer或者StringBuilder,
StringBuffer线程安全 StringBuilder线程不安全
String中的offset,value,count都是被final修饰的不可修改的;而StringBuffer和StringBuilder中的value,count都是继承自AbstractStringBuilder类的,没有被final修饰,说明他们在运行期间是可修改的,而且没有offset变量。
效率:
StringBuilder>StringBuffer>String

缓冲字符串初始化长度为16。扩容算法:新容量=旧*2+2

7、String的 + 操作的底层实现是 StringBuffer还是StringBuilder ,或者说是线程安全的,还是非线程安全的?

JDK1.5以前是StringBuffer,之后是StringBuilder

8、clone()方法有一行代码,是什么,为什么?
super.clone(),先要复制父类的属性,再复制自身的。

9、java多态实现的机制?
父类或者接口定义的引用变量,指向内存中该父类的子类对象或者接口的实现类对象。程序中的方法绑定在运行期,就是引用变量指向的具体实例对象中的方法,而不是引用类型定义的类里的方法。

10、native关键字修饰的方法?
native关键字修饰的方法本质是调用底层其他语言实现的方法。

11、transient修饰的属性?
transient修饰的属性不能被序列化

12、try里有return,finally里有代码会不会执行,是先执行还是后执行?
先执行return,但并不马上返回,等finally执行后返回。
如果finally有return,会覆盖try的return。

13、线程的5大状态?
新建:new线程对象
就绪:执行start,并返回。这时候还没有执行run,需要与其他线程争夺cpu资源
运行:争抢到cpu资源,运行
阻塞:
run并未结束,只是暂时让出CPU资源给其他线程
阻塞可能的原因:调用sleep(),让出cpu资源;试图得到锁,但是这个锁正被其他线程占有。

14、wait/sleep/notify
wait:放弃已经获取的对象锁,进行该对象的等待锁定池,其他线程竞争获取该对象锁,该对象调用notify(),本线程进入对象锁定池,获取该对象锁;或者调用notifyAll(),唤醒等待锁定池中所有等待的线程,竞争该对象锁。
sleep:不放弃已经获取的对象锁,把CPU资源让出来给别的线程去竞争,需要竞争sleep线程的对象锁的线程全部阻塞。
notify:对象调用notify(),会唤醒一个该对象的等待锁定池中的线程,但具体是哪一个线程,不确定
notifyAll:对象调用notifyAll(),会唤醒该对象等待锁定池中的所有线程,竞争该对象锁

15、join/yeild
join:在A线程下调用B线程的该方法,A线程调用B的join必须等待B线程执行结束,才能执行后面的代码
yeild:调用Thread.yeild()的线程从运行状态,切换到可运行状态。把运行机会交给线程池中优先级相等的线程。

16、java线程中 stop和suspend/resume
stop:强制中断线程的执行,无论run方法是否执行完毕。并释放对象锁。
suspend/resume:suspend跟stop不一样,他不会释放对象锁,而是一直持有对象锁,直到其他线程调用resume,才会释放对象锁,往下执行。

17、synchronized和lock的区别
共同点:lock能完成synchronized的所有功能
不同点:lock语义更明确,性能更好,需要程序员手动lock,unlock,unlock必须在finally里执行。syschronized会自动释放锁。lock还有更强大的功能,try lock用非阻塞的方式拿锁。

18、interrupt、interrupted 、isInterrupted 区别
interrupt:线程中断,其实只是设置线程中断的标志位,并没有使线程停止。需要用户自己去监听线程状态,并做出处理。支持线程中断的方法,本质就是监听线程的状态,当线程状态被置为中断时,抛出interruptedException。

interrupted:静态方法,底层调用native方法isInterrupted(true),返回当前线程状态并且清除状态

isInterrupter:对象方法,返回该对象线程的状态,不清除状态,底层调用isInterrupted(false)

19、jvm加载class文件原理?
jvm加载class的步骤:
1、加载
把类的.class文件读入内存为一个二进制字节流,把类的静态存储结构保存到方法区,在堆中创建代表该类的Class对象,作为该类方法区的访问入口
2、连接
类加载以后进入连接阶段,包括验证(格式、字节码、元数据、符号引用验证),准备(为静态变量分配内存,并赋予初始化默认值),解析(将符号引用转为直接引用)。
3、初始化
执行cinit方法,为静态块和静态变量
先初始化父类再初始化子类。

双亲委派:
双亲委派模型要求除了最顶层启动类加载器,其他类加载都要有自己的父类加载器。不是通过继承关系 而是组合。
如果一个类加载器收到一个类加载的请求,它不会自己去加载,而是交给自己的父类加载器去请求加载,每一层的类加载器都是如此,所以最终会委派给最顶层的启动类加载器加载,只有在父类加载器无法加载(不在他的搜索范围),子类加载器才会去尝试加载。

20、GC
对内存中不被引用,不可达GC ROOT的对象所占用的空间进行回收。

GC回收策略:
引用计数(无法处理循环引用)
标记清除(存在内存碎片,无法为大对象分配连续空间)
复制(不会出现内存碎片,但是需要两倍空间)
标记整理(解决了碎片和空间的问题)

增量收集:实时垃圾回收
分代垃圾回收:根据对象生命周期的分析得出的算法,分为年轻代,年老代,持久代,不同的分区通过不同的垃圾收集算法回收垃圾
年轻代:复制清除 年老代:标记整理

串行收集器:单线程垃圾回收,效率高,适用小数据量(100M左右)。-XX:+UseSerialGC
并行收集器:并行收集,适用于需要高吞吐量的应用。
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:ParallelGCThreads=《N》设置并行回收的线程数,设置与CPU核数一致
-XX:MaxGCPauseMillis=《N》设置GC最大暂停时间
-XX:GCTimeRatio=《N》设置非垃圾回收时间和垃圾回收壁纸 为19时,垃圾回收时间占5%。默认99
并发收集器:不停止应用。垃圾回收只暂停很少的时间。-XX:+UseConcMarkSweepGC。
减少老年代的暂停时间

21、内存泄漏
已分配的内存由于某些原因未释放或者无法释放,造成内存浪费,运行缓慢。
资源未释放。
静态大对象。

22、集合
http://blog.csdn.net/ychenfeng/article/details/77414740

原创粉丝点击