第一,谈谈final, finally, finalize的区别。 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? ...... ### JAVA程序员面试32问精选知识点解析 #### 第一,谈谈final, finally, finalize的区别。 - **final**:这是一个修饰符(关键字),用于定义不可变的类、变量或方法。当一个类被声明为`final`时,表示该类不能被继承;同样地,如果一个方法或变量被声明为`final`,则该方法或变量的值不能被改变。对于变量而言,这意味着一旦赋值便不可更改;对于方法,则表示该方法不能被子类覆盖。 - **finally**:这是异常处理中的一个关键词,用于确保无论是否发生异常,`finally`块中的代码都会被执行。这常用于清理资源,比如关闭文件或释放数据库连接。 - **finalize**:这是一个方法名,在`Object`类中定义。虽然在现代Java中不常用,但`finalize()`方法允许在对象被垃圾回收器回收之前执行一些清理操作。例如,可以在这里释放外部资源。 #### 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? - 匿名内部类不能直接`extends`其他类,因为它本质上是一个没有名称的内部类,且默认继承了其外围类。但是,匿名内部类可以实现接口(`implements`)。通常情况下,匿名内部类是用来实现一个接口的,特别是单个抽象方法的接口,即函数式接口。 #### 第三,Static Nested Class 和 Inner Class 的不同 - **Static Nested Class**(静态嵌套类):与普通类相似,但它必须是静态的。它不持有对外围类实例的引用。由于它是静态的,所以可以在没有创建外围类实例的情况下访问它。 - **Inner Class**(内部类):非静态嵌套类,它可以访问外围类的所有成员,包括私有成员。每个内部类实例都隐含了一个对其外围类实例的引用。 #### 第四,& 和 && 的区别 - **&**:逻辑与运算符,也是按位与运算符。对于布尔表达式,如果左边的表达式为`false`,右边的表达式也会计算。 - **&&**:短路逻辑与运算符。如果左边的表达式为`false`,右边的表达式不会计算,从而提高了效率。 #### 第五,HashMap 和 Hashtable 的区别 - `HashMap`允许使用`null`键和`null`值,而`Hashtable`不允许。 - `HashMap`不是线程安全的,`Hashtable`则是线程安全的,因此`Hashtable`的性能相对较低。 - `HashMap`使用`putIfAbsent`方法插入新条目,`Hashtable`使用`put`方法。 - `HashMap`的初始容量为16,增长因子为1.5;`Hashtable`的初始容量为11,增长因子为0.75。 #### 第六,Collection 和 Collections 的区别 - `Collection`是一个接口,它是所有集合类的根接口,定义了集合的基本操作。 - `Collections`是一个工具类,提供了各种静态方法来操作或返回`Collection`的实例,例如排序、查找等。 #### 第七,什么时候用 assert - `assert`关键字用于声明断言,主要用于开发阶段进行调试。通过`assert`可以指定一个条件,当该条件为假时,程序会抛出`AssertionError`异常。 #### 第八,GC 是什么?为什么要有 GC? - **GC**(Garbage Collection,垃圾收集)是自动管理内存的过程,它自动识别不再使用的对象并回收其占用的内存空间,从而避免内存泄漏。 - Java 的垃圾收集机制可以自动检测并回收未引用的对象,这样开发者就不必手动管理内存分配和释放。 #### 第九,Strings = new String("xyz"); 创建了几个 String Object? - 这行代码创建了一个新的`String`对象,但是只创建了一个对象。字符串常量池中并不会创建额外的对象,因为"xyz"已经是字符串常量池的一部分。 #### 第十,Math.round(11.5) 等于多少?Math.round(-11.5) 等于多少? - `Math.round(11.5)`的结果为12,`Math.round(-11.5)`的结果为-11。这是因为`Math.round()`使用了向最近整数舍入的规则。 #### 第十一,short s1 = 1; s1 = s1 + 1; 有什么错?short s1 = 1; s1 += 1; 有什么错? - `s1 = s1 + 1`会导致编译错误,因为`s1 + 1`的结果是`int`类型,而`s1`是`short`类型。`s1 += 1`则不会导致错误,因为Java会自动进行类型转换。 #### 第十二,sleep() 和 wait() 有什么区别? - `Thread.sleep(long millis)`会使当前线程暂停执行指定的时间,然后恢复执行。`Object.wait()`则会使当前线程放弃对象锁,进入等待状态,直到其他线程唤醒。 #### 第十三,Java 有没有 goto? - Java 不支持传统的`goto`语句,但是提供了一个类似的结构化跳转语句——`break`和`continue`,可以用来控制循环或`switch`语句的流程。 #### 第十四,数组有没有 length() 这个方法?String 有没有 length() 这个方法? - 数组没有`length()`方法,而是有一个`length`属性,可以直接获取数组的长度。`String`类有一个`length()`方法,用于获取字符串的长度。 #### 第十五,Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的类型? - **Overload**(重载):在同一类中,方法名相同但参数列表不同的多个方法。重载的方法可以有不同的返回值类型。 - **Override**(重写):子类重写父类的方法。要求方法名、参数列表以及返回类型完全相同,但可以有不同的异常声明。 #### 第十六,Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 还是 equals()?它们有何区别? - `Set`容器使用`equals()`方法来判断元素是否重复。`==`用于比较两个对象的引用是否相同,而`equals()`用于比较两个对象的内容是否相同。为了使`Set`正确工作,必须正确实现`equals()`方法。 #### 第十七,给我一个你最常见到的 RuntimeException。 - 常见的`RuntimeException`之一是`NullPointerException`,当尝试访问一个空对象的属性或方法时抛出。 #### 第十八,Error 和 Exception 有什么区别? - **Error**:表示系统级的错误或程序无法处理的情况,如内存耗尽等。这些情况通常不可恢复,也不建议捕获。 - **Exception**:表示合理条件下可以捕获并处理的异常,分为`RuntimeException`(运行时异常)和`CheckedException`(检查型异常)两大类。 #### 第十九,List, Set, Map 是否继承自 Collection 接口? - `List`和`Set`是`Collection`接口的子接口,而`Map`并不是`Collection`接口的子接口,它具有自己的接口体系。 #### 第二十,Abstract class 和 Interface 有什么区别? - **Abstract Class**:可以包含具体的方法实现,可以拥有实例变量。继承抽象类时,子类需要实现其中所有未实现的方法。 - **Interface**:只包含抽象方法和常量,Java 8 之后允许有默认方法和静态方法。实现接口时,类需要实现接口中定义的所有方法。 #### 第二十一,Abstract 的 method 是否可同时是 static, 是否可同时是 native,是否可同时是 synchronized? - `abstract`方法不能是`static`,因为抽象方法必须被子类重写,而静态方法是与类关联的,而不是与对象关联的。 - `abstract`方法可以是`native`,表示该方法将在本地代码中实现。 - `abstract`方法可以是`synchronized`,表示该方法将在实现时具有同步特性。 #### 第二十二,接口是否可继承接口?抽象类是否可实现(interface)接口?抽象类是否可继承实体类(concrete class)? - 接口可以继承其他接口。 - 抽象类可以实现接口。 - 抽象类可以继承实体类。 #### 第二十三,启动一个线程是用 run() 还是 start()? - 启动线程应该使用`Thread.start()`方法,这会启动一个新的线程并调用`run()`方法。直接调用`run()`方法不会启动新线程,而是在当前线程中执行。 #### 第二十四,构造器 Constructor 是否可被 override? - 构造器不能被`override`,因为构造器没有继承性,不能在子类中重写父类的构造器。 #### 第二十五,是否可以继承 String 类? - `String`类是`final`的,因此不能被继承。 #### 第二十六,当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法? - 如果其他方法也是`synchronized`的,并且锁的是同一个对象,那么其他线程将无法进入。如果锁的是不同的对象,则其他线程可以进入。 #### 第二十七,try{} 里有一个 return 语句,那么紧跟在这个 try 后的 finally{} 里的 code 会不会被执行,什么时候被执行,在 return 前还是后? - `finally`块中的代码一定会被执行,即使`try`块中有`return`语句。`finally`块在`return`之前执行。 #### 第二十八,编程题: 用最有效率的方法算出 2 乘以 8 等于几? - 使用左移位运算符`<<`,即`2 << 3`,结果等于16。 #### 第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对? - 如果`x.equals(y)`为`true`,根据`equals()`和`hashCode()`的一致性原则,它们应当具有相同的哈希码。但是,某些实现可能允许这种情况发生,但这并不推荐。 #### 第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? - Java 中传递的是对象的引用,而不是值。因此,如果一个对象被传递到方法中,方法可以改变这个对象的状态,但不能改变对象本身的引用。 #### 第三十一,switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上? - `switch`可以从 Java 7 开始支持`byte`、`short`、`char`、`int`及其包装类。从 Java 7 起,`switch`也支持`String`类型。 - `switch`不支持`long`类型。 #### 第三十二,编程题: 写一个 Singleton 出来。 - 单例模式可以通过多种方式实现,其中最简单的方式是饿汉式单例: ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 以上是对“JAVA程序员面试32问”中部分问题的详细解答,希望能够帮助您更好地理解和掌握这些核心概念和技术细节。
剩余6页未读,继续阅读
- 粉丝: 5
- 资源: 10
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助