Java SE 面试高频问题:篇一(1-10)

Java SE 面试高频问题:篇一(1-10)

1、Java语言有什么特性

  1. 简单易学,又丰富的类库。
  2. 面向对象,他是Java的主要特性,是代码的耦合性更低,内聚性更高
  3. 跨平台(与平台无关性,jvm是Java跨平台的根本)。
  4. 可靠安全
  5. 支持多线程编程。

2、面向对象和面向过程的区别?

面向过程:通过分析解决问题的步骤,然后利用函数来把这些步骤一步步地实现,然后使用的时候一调用即可。性能较高,所以单片机、嵌入式开发一般采用面向过程的语言开发。

面向对象:把构成问题的事物分解成若干个对象,将现实中的问题的组成特征进行一个抽象,分析出他具有的特征和行为,从而调用这些对象去解决整个问题,他是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象具有继承、封装、多态的特点,所以易于维护、易复用、易扩展。可以设计出耦合度较低的系统。

3、八种基本数据类型以及它们的封装类

基本类型大小(字节)默认值封装类型
byte10Byte
short20Short
int40Integer
long80L(l)Long
float40.0fFloat
double80.0dDouble
boolean-falseBoolean
char2\u0000(null)Character
  1. int 是基本数据类型,所以默认值是0,Integer 是 int 的封装类,是引用类型,默认值是 null ,所以 Integer 可以区分 0 和 null 的情况,一旦Java看到有null,便会抛出 NullPointerException 异常,任何引用对象在使用前,必须为其指定一个对象。
  2. 基本数据类型在声明时,系统会自动为其分配存储空间,而引用类型声名时只是分配了引用空间,必须通过实例化才能为其开辟数据存储空间。数组对象是一个引用对象,将一个数组赋值给另一个数组时只是复制了一个引用,所以通过某一个数组所做的修改另一个数组也可以看得见。

虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有 任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java 虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素 boolean元素占8位。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字 节。使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的 是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。

4、标识符的命名规则

Java命名规范中,可以使用字母、数字、下划线、$符来命名,但是不能以数字开头且不能与关键字冲突。

类的命名一般推荐大驼峰式命名,即首字母大写,后面的每个单词的首字母大写,变量名或方法民推荐小驼峰式命名,即首字母小写,后面每个单词的首字母大写。

根据 《阿里巴巴Java开发手册》中的规范**变量或方法命名的时候要杜绝完全不规范的缩写,避免望文不知义,**为了实现的代码自解释的目标,在命名任何自定义编程元素时,都尽量使用完整的单词组合来表达。
在命名常量和变量的时候,表示类型的单词要放在词尾,以提升辨识度。
如果模块、接口、类和方法使用了设计模式,在命名时需要体现出具体的设计模式。

5、instanceof 关键字的作用

instanceof 严格来说是Java中的一个双目运算符吗,用来测试一个对象是否是一个类的实例,用法如下

boolean result = obj instanceof Class

其中,obj 是实例对象,Class 表示一个类或接口,当 obj 为class 的类或者是其直接(间接)子类的时候,会返回 true。

6、Java 的自动装箱和拆箱

装箱就是将基本数据类型转成为包装器类型,调用的方法就是 Integer 的 valueOf(int) 方法。

拆箱就是将包装器类型的数据转换成为基本类型的数据,。调用方法就是 Integer 的 intValue()方法。

在Java SE 5 之前,如果要生成一个数值为10 的 Integer 对象,必须将这样进行:

Integer integer = new Integer(10);

而从 Java SE 开始提供了自动装箱的特性,如果要生成一个数值为 10 的整数类型的封装类,只需要这样就可以了

Integer integer = 10;

在通过 valueOf 创建 Integer 对象的时候,如果数值在[-128,127]之间,便返回指向 IntegerCache.cache 中已经存在的对象,否则会创建一个新的对象。具体看以下源码:

public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
}
================================================================================
// IntegerCache累的实现如下
private static class IntegerCache {
        static final int high;
        static final Integer cache[];
        static {
            final int low = -128;
            // high value may be configured by property
            int h = 127;
            if (integerCacheHighPropValue != null) {
                // Use Long.decode here to avoid invoking methods that
                // require Integer's autoboxing cache to be initialized
                int i = Long.decode(integerCacheHighPropValue).intValue();
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - -low);
						}
						high = h;
            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
				}
        private IntegerCache() {}
} 

7、重载和重写的区别

重载(overload)发生在同一个类中,允许同名方法有不同的参数列表(参数类型不一致、参数顺序不一致、参数个数不一致)。重载对返回类型没有要求,可以想通也可以不相同,但不能通过返回类型相同来判断是否重载。

重写(Override)发生在具有继承关系的两个类中。当子类继承父类时,父类中的方法无法满足当前的需求时,就需要对该方法进行重写。被重写的方法必须具有相同的方法名、参数列表、返回值,且权限访问修饰符不能小于父类,也不能抛出新的异常且异常处理的范围要不能大于父类。

8、equals 和 == 的区别

equals 用于比较两个引用的类型的对象是相等,一般要对该方法进行覆盖,因为如果没有覆盖他调用的事 Object 中的 equals 方法,而 Object 中的 equals 方法返回的却是 == 的判断结果。两边的操作数必须是同一类型的(可以是 父子类之间)才能编译通过。

== 用于比较基本数据类型的数据内容是否相等。

所有比较是否相等时,都是用equals 并且在对常量相比较时,把常量写在前面,因为使用object的

equals object可能为null 则空指针。
在阿里的代码规范中只使用equals ,阿里插件默认会识别,并可以快速修改,推荐安装阿里插件来

排查老代码使用“==”,替换成equals。

9、HashCode 的作用

java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们在set 中插入的时候怎么判断是否已经存在该元素呢,可以通过equals方法。但是如果元素太多,用这样 的方法就会比较满。
于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域,每 个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的 哈希码就可以确定该对象应该存储的那个区域。
hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理 位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如 果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相 同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

10、String、StringBuffer、StringBuilder

String 字符串它并不是基本数据类型,它是一个对象,从底层源码来看,它是一个不可变的字符数组,一旦定义,便不可变,每次对 String 的操作都会生成一个新的对象。

private final char value[];

StringBuilder 每次操作时,都会在隐式地在堆上new 了一个和原字符串相同的 StringBuilder 对象,在调用append 方法拼接后面的字符串。

StringBuffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类,从AbstractStringBuilder抽象类中我们可以看到,他们的底层都是可变的字符数组所以在进行频繁的字符串操作时,建议使用StringBuffer和 StringBuilder来进行操作。 另外StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值