你可能不知道的一些java小秘密

  1. 结果将会输出什么?true 还是 false?

 System.out.println(3*0.1 == 0.3);// false
 System.out.println(0.1*3 == 0.3);// false
 System.out.println(0.3*1 == 0.3);// true

Why?

java中小数 float和double类型一个占32位 一个64位其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53

float表示

  1. 符号位(Sign) : 0代表正,1代表为负

  2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储

  3. 尾数部分(Mantissa):尾数部分

double表示:

float和double会损失精度

2.创建一个可变对象和一个不可变对象

用final来修饰 ----------------- 一个不可变对象

不可变对象的优点:

  • 不可变对象是线程安全的,在线程之间可以相互共享,不需要利用特殊机制来保证同步问题,因为对象的值无法改变。可以降低并发错误的可能性,因为不需要用一些锁机制等保证内存一致性问题也减少了同步开销。

  • 不可变对象可以被重复使用,可以将它们缓存起来重复使用,就像字符串字面量和整型数字一样。可以使用静态工厂方法来提供类似于valueOf()这样的方法,它可以从缓存中返回一个已经存在的Immutable对象,而不是重新创建一个。

3.final的用法 1.被final修饰的类不可以被继承

2.被final修饰的方法不可以被重写

3.被final修饰的方法,JVM会尝试将其内联,以提高运行效率 4.被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变 5.被final修饰的常量,在编译阶段会存入常量池中。

回答出编译器对final域要遵守的两个重排序规则更好: 1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。

4.java当中的四种引用 强引用,软引用,弱引用,虚引用。不同的引用类型主要体现在GC上:

强引用(Strong Reference):如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。

软引用(Soft Reference):在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。

弱引用(Weak Reference):具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象。

虚引用(Phantom Reference):顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。 5.Object中有哪些方法?

getClass() 返回此 Object 的运行时类

hashCode() 返回该对象的哈希码值

equals(Object obj)指示其他某个对象是否与此对象“相等”。

clone()创建并返回此对象的一个副本。克隆分为深度克隆和浅度克隆,Object的克隆为浅度克隆。

toString()

finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。

notify()、notifyAll ()唤醒在此对象监视器上等待的单个/多个线程

wait()、wait(long timeout)、wait(long timeout, int nanos)当前线程等待

6.常用的运行时异常

1、ClassCastException:类型转换异常

2、ConcurrentModificationException:并发修改异常

3、ArrayIndexOutOfBoundsException:数组角标越界

4、UnsupportedOperationException:不支持的操作异常

Arrays.asList() 方法把数组转换集合,在对集合进行修改时会抛出此异常。

5、NullPointerException

6、NumberFormatException

7、java.lang.IllegalMonitorStateException

7.jdk1.8新特性

Lambda 表达式,允许像对象一样传递匿名函数

Stream API,充分利用现代多核 CPU,可以写出很简洁的代码

Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用

接口更新,现在,接口中可以有静态、默认方法。

8.GC要回收哪些区域?**

在JVM内存模型中,有三个是不需要进行垃圾回收的:程序计数器、JVM栈、本地方法栈。因为它们的生命周期是和线程同步的,随着线程的销毁,它们占用的内存会自动释放,所以只有方法区和堆需要进行GC

9.类的实例化顺序?

大致的顺序是,先静态方法、再构造方法,先父类后子类。

(1)父类静态成员和静态初始化块,按代码顺序;

(2)子类静态成员和静态初始化块,按代码顺序;

(3)父类实例成员和实例初始化块,按代码顺序;

(4)父类构造方法;

(5)子类实例成员和实例初始化块,按代码顺序;

(6)子类构造方法。 10.内存泄漏与内存溢出区别,产生原因?

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间

内存溢出的原因:

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 3.代码中存在死循环或循环产生过多重复的对象实体

4.启动参数内存值设定的过小

11.什么是线程

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位

线程和进程有什么区别?

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间

forward()和redirect()的区别

请求转发是一个请求,而重定向是两个请求; 请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求; 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用; 请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求; 重定向的第二个请求一定是GET;

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值