java基础知识

77 阅读5分钟

1、Java 中应该使用什么数据类型来代表价格?

如果不是很关心内存和性能的话,使用BigDecimal(大数据对象)。否则使用预定义精度的double类型。

2 、怎么将 byte 转换为 String?

1、使用String 接受byte[] 参数的构造器来进行转换

    (注意:使用正确编码,否则会是平台默认编码)

3、我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?

1、可以强制将int转换为byte类型的变量

2int32位,byte8位,所以int类型的高24位将会被丢弃,出现精度损失问题。

3byte类型范围-128128

4、哪个类包含 clone 方法?是 Cloneable 还是 Object?

1、java.lang.Cloneable 是一个标示性接口,不包含任何方法

2、clone方法被定义在Object类中

3、clone()方法是一个本地方法,底层是用C或者C++实现的

5 、Java 中 ++操作符是否是线程安全的?

Java中的++操作符不是线程安全的。

    其涉及多个指令,例如:读取、增加、存储,这个过程可能涉及多个线程交叉。

6、a = a + b 与 a += b 的区别

1、性能:
    
    a = a + b,需要两次寻址
    a += b,只需要一次寻址
    效率后者自然略高于前者

2、可读性:

    a = a + b,可读性高
    a += b,可读性相对低一点

3、数据类型不同时:

    【1short a = 10;
             a = a + 20; //    编译时报错  20是int --> 转short时报错2short a = 10;
             a += 20; //    30    

    【注:高精度转为低精度必须强制类型装换,且有精度损失现象】

7、为什么 Java 中的 String 是不可变的(Immutable)?

Java中String变量是不可变的。
    
    因为设计者认为String使用很频繁,将其设置为不可更改方便多个客户端之间共享

8、Java 中的构造器链是什么?

1、构造器链:从一个构造器中调用另一个构造器。

2、构造器链只有在重载了类的构造器的时候才会出现。

9、怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位?

通过检查某些系统属性如,sun.arch.data.model或者os.arch来获取该信息。

10、JRE、JDK、JVM、JIT分别是什么?

1、JRE:Java runtime environment,java运行环境。运行Java所必须的

2、JDK:Java development kit,java开发工具包。比如java编译器

3、JVM:Java virtual machine,Java虚拟机。用来运行Java应用

4、JIT:just in time compilation,即时编译。

11、解释 Java 堆空间及 GC?

1、当通过Java命令启动Java进程时,JVM就会分配内存,而内存的一部分用于创建堆空间。

2、当程序继续创建对象时,就会从堆空间中分配内存。

3、而GC就是JVM内部的一个进程,回收无效对象时的内存用于将来的分配。

12、能保证 GC 执行吗?

不能。虽然可以调用System.gc()或者Runtime.gc(),但是没有办法保证GC执行。

13、Java 中堆和栈有什么区别?

1、栈:

    用于保存方法帧和局部变量,不允许多个线程共享。

2、堆:

    对象总是在堆上分配,被JVM上的所有线程共享。

【注:栈通常比堆小】

14、 “a==b”和”a.equals(b)”有什么区别?

1、当a 与 b 都是对象时,a == b 是比较两个对象的引用。
    
    只有当a和b指向堆中的同一个对象时,才返回true2、a.equals(b)是进行逻辑比较,通常需要重写该方法来提供逻辑一致性。

    比如,重写String类的equals()方法。

15、final、finalize、finally的不同?

final:
    
    是一个修饰符,用于修饰变量、方法、类。被它修饰的意味着初始化后不能再更改。

finalize():
    
    是对象被回收之前调用的finalize()方法,给对象一个复活的机会,但是是什么时候调用,没法保证。

finally:

    是一个关键字,与try/catch一起用于异常处理,finally一定会执行,用于关闭一些流。

16、Java中什么是编译器常量?实用风险

编译器常量:即,公共静态不可变变量(public static final)。

风险:实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,
    并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使
    用了一个内部 的或第三方库中的公有编译时常量,但是这个值后面被
    其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了
    一个新的jar。为了避免这种情况, 当你在更新依赖 JAR 文件时,确
    保重新编译你的程序。

17、poll() 方法和 remove() 方法的区别?

poll():

    从队列中取出一个元素,获取元素失败时,返回空。

remove():

    从队列中获取一个元素,获取元素失败时,抛出异常。

18、实现集合的排序的方法?

1、使用有序集合,TreeSet或者TreeMap

2、使用有顺序的集合list,通过Collections.sort()来实现排序。

19、java中数组如何打印?

使用Arrays.toString()和Arrays.deepToString()