### Java面试题知识点详解 #### 1. super()与this()的区别? - **super()**:用于调用父类的构造方法。它必须是子类构造方法的第一条语句。 - **this()**:用于调用同一类中的另一个构造方法。同样地,它也必须是构造方法的第一条语句。 #### 2. 作用域public, protected, private,以及不写时的区别? - **public**:公共访问级别,可以在任何地方被访问。 - **protected**:受保护访问级别,只能在同一包内或不同包中的子类中访问。 - **private**:私有访问级别,只能在定义它的类内部访问。 - **默认**:即不写访问修饰符,默认访问级别仅限于同一包内的类可以访问。 #### 3. 编程输出如下图形 此类题目通常涉及循环结构和字符串拼接技术。例如输出如下图形: ``` * ** *** **** ***** ``` 可以使用两层循环实现,外层控制行数,内层控制每行星号的数量。 #### 4. JAVA的事件委托机制和垃圾回收机制 - **事件委托机制**:是一种处理用户界面事件的方式,通过将事件处理器注册到组件上,当用户触发特定事件时,这些处理器会被自动调用。 - **垃圾回收机制**:自动管理内存的一种机制,它会自动追踪不再使用的对象并释放其占用的内存空间,从而避免内存泄漏。 #### 5. 在JAVA中,如何跳出当前的多重嵌套循环? 可以使用标签化循环结构,即在外层循环前加一个标签,在内层循环中使用`break`语句后面跟上标签名来跳出。 #### 6. 什么是java序列化,如何实现java序列化? - **序列化**:将对象的状态信息转换为可存储或传输的形式的过程。 - **实现方式**:让类实现`Serializable`接口,然后使用`ObjectOutputStream`和`ObjectInputStream`类进行对象的写入和读取。 #### 7. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? - 可以包含多个类,但每个源文件最多只能有一个公共类,并且该公共类的名字必须与文件名相同。 - 其他类必须声明为私有的或默认访问级别。 #### 8. 排序都有哪几种方法?请列举。用JAVA实现一个快速排序? 常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序等。快速排序的实现如下: ```java public class QuickSort { public static void quickSort(int[] arr, int low, int high) { if (arr == null || arr.length == 0) return; if (low >= high) return; // partition index int middle = low + (high - low) / 2; int pivot = arr[middle]; int i = low, j = high; while (i <= j) { while (arr[i] < pivot) { i++; } while (arr[j] > pivot) { j--; } if (i <= j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } } if (low < j) quickSort(arr, low, j); if (high > i) quickSort(arr, i, high); } } ``` #### 9. Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? - **重载(Overload)**:在同一类中,方法名相同但参数列表不同的两个或多个方法。 - **重写(Override)**:在子类中重新定义父类的方法。 - **重载的方法**:可以改变返回值的类型,但方法签名必须不同。 #### 10. Final类有什么特点? - `final`类不能被继承。 - `final`方法不能被重写。 - `final`变量一旦赋值就不能修改。 #### 11. 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 此类问题主要考查构造方法的执行顺序。遵循以下原则: 1. 如果子类构造器中显式调用了父类构造器,则先执行父类构造器。 2. 子类构造器中如果没有显式调用父类构造器,则默认调用无参构造器。 3. 构造器中的语句按照出现顺序执行。 #### 12. 内部类的实现方式? 内部类分为静态内部类和非静态内部类。实现方式如下: - **静态内部类**:使用`static`关键字定义。 - **非静态内部类**:不使用`static`关键字定义。 #### 13. 用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? - **排序**:除了前面提到的快速排序外,还可以实现冒泡排序等。 - **序列化**:实现`Serializable`接口或使用`Externalizable`接口进行自定义序列化。 #### 14. 如在COLLECTION框架中,实现比较要实现什么样的接口? 为了在集合框架中实现比较,需要实现`Comparable`接口或提供一个实现了`Comparator`接口的对象。 #### 15. 用插入法进行排序代码如下 插入排序是一种简单的排序算法,其实现逻辑是遍历数组并将每个元素插入到已排序序列的正确位置。 ```java public class InsertionSort { public static void sort(int[] arr) { for (int i = 1; i < arr.length; i++) { int current = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > current) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = current; } } } ``` #### 16. 编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串 此类问题需要考虑到中文字符占3个字节的情况,因此需要逐字节截取直到满足条件为止。 ```java public class StringTruncator { public static String truncateByBytes(String str, int byteCount) { if (str == null || byteCount >= str.getBytes().length) { return str; } StringBuilder result = new StringBuilder(); int currentByteCount = 0; for (char c : str.toCharArray()) { if (currentByteCount + Character.charCount(c) > byteCount) { break; } result.append(c); currentByteCount += Character.charCount(c); } return result.toString(); } } ``` #### 17. 指出下面程序的运行结果。 这类题目通常需要理解程序的执行流程,尤其是构造函数的调用顺序、静态初始化块、实例初始化块等。 #### 18. 抽象类和接口的区别? - **抽象类**:可以包含抽象方法和具体方法,可以有状态(属性),支持单继承。 - **接口**:只允许定义抽象方法,不能有具体实现,没有状态,支持多重继承。 #### 19. 什么是类的返射机制? 反射机制允许程序在运行时动态地获取类的信息并操纵对象。 #### 20. 类的返射机制中的包及核心类? 主要涉及到`java.lang.reflect`包中的类,如`Class`、`Constructor`、`Method`、`Field`等。 #### 21. 得到Class的三个过程是什么? - 通过类名直接获取。 - 通过对象的getClass()方法获取。 - 通过Class类的forName()方法加载获取。 #### 22. 如何唤起类中的一个方法? 使用反射中的`Method`对象的`invoke()`方法来调用类中的方法。 #### 23. 如何将数值型字符转换为数字(Integer,Double)? 可以使用`Character.getNumericValue(char)`方法或者`Integer.parseInt(String)`、`Double.parseDouble(String)`等方法进行转换。 #### 24. 如何将数字转换为字符? 使用`Integer.toString(int)`或`Double.toString(double)`等方法将数字转换为字符串,再转换为字符。 #### 25. 如何去小数点前两位,并四舍五入。 使用`Math.round()`或`DecimalFormat`类进行格式化。 #### 26. 如何取得年月日,小时分秒? 使用`java.time`包中的`LocalDateTime`、`LocalDate`、`LocalTime`等类。 #### 27. 如何取得从1970年到现在的毫秒数 使用`System.currentTimeMillis()`方法。 #### 28. 如何获取某个日期是当月的最后一天? 可以使用`java.time.MonthDay`类的`from()`和`atEndOfMonth()`方法组合。 #### 29. 如何格式化日期? 使用`java.time.format.DateTimeFormatter`类。 #### 30. 编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 使用`new String(byte[], "targetCharset")`方法进行编码转换。 #### 32. Strings=newString("xyz");创建了几个StringObject? 只创建了一个`String`对象。 #### 33. float型floatf=3.4是否正确? 不正确,因为3.4默认为`double`型,应写为`float f = 3.4F;`。 #### 35. 说出一些常用的类,包,接口,请各举5个 - **类**:`String`、`Integer`、`ArrayList`、`HashMap`、`Thread` - **包**:`java.util`、`java.io`、`java.lang`、`java.awt`、`javax.swing` - **接口**:`Comparable`、`Comparator`、`Runnable`、`Serializable`、`Cloneable` #### 36. java中会存在内存泄漏吗,请简单描述。 虽然Java有垃圾回收机制,但在某些情况下也会发生内存泄漏,比如长期持有不再使用的对象引用。 #### 37. java中实现多态的机制是什么? 多态性是通过继承和接口实现的,同时利用方法的重写和覆盖来体现。 #### 38. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? - **基本原理**:跟踪不再使用的对象,并释放其占用的内存。 - **能否立即回收**:不能,垃圾回收由JVM自动触发。 - **主动通知**:可以使用`System.gc()`方法请求进行垃圾回收。 #### 39. 静态变量和实例变量的区别? - **静态变量**:属于类,被所有对象共享。 - **实例变量**:属于对象,每个对象都有自己的一份副本。 #### 41. 是否可以从一个static方法内部发出对非static方法的调用? 不可以,因为非静态方法需要通过对象来访问,而静态方法无法访问对象。 #### 42. 写clone()方法时,通常都有一行代码,是什么? 通常使用`super.clone()`来完成克隆操作。 #### 43. JAVA语言如何进行异常处理,关键字:throws, throw, try, catch, finally代表什么意义?在try块中可以抛出异常吗? - **throws**:用于声明一个方法可能抛出的异常。 - **throw**:用于抛出异常。 - **try**:用于捕获异常。 - **catch**:用于处理异常。 - **finally**:无论是否有异常都会执行。 - **try块中可以抛出异常**:可以在try块内部使用`throw`关键字抛出异常。 #### 45. 冒泡排序法 冒泡排序是一种简单的排序算法,通过重复地交换相邻的未正确排序的元素来工作。 #### 46. String and StringBuffer的区别? - **String**:不可变的字符序列。 - **StringBuffer**:可变的字符序列,线程安全。 #### 47. 用java代码编写堆栈 堆栈可以通过继承`Vector`类并覆盖一些方法来实现。 #### 48. 集合的作用是什么? 集合框架提供了多种数据结构,用于存储和操作数据集合。 #### 49. 集合的通用方法有那些?通用方法是什么?(操作) 通用方法包括添加元素(add)、删除元素(remove)、获取元素数量(size)等。 #### 50. 说出ArrayList, Vector, LinkedList的存储性能和特性 HashMap和Hashtable的区别 - **ArrayList**:基于数组实现,适用于频繁查询操作。 - **Vector**:线程安全的ArrayList。 - **LinkedList**:基于链表实现,适用于频繁增删操作。 - **HashMap**:允许键值对为null。 - **Hashtable**:不允许键值对为null,线程安全。 #### 51. Collection和Collections的区别。 - **Collection**:集合接口,定义了集合的基本操作。 - **Collections**:工具类,提供了一系列静态方法来操作或返回集合类的实例。 #### 52. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别? - **区分重复**:使用`equals()`方法。 - **区别**:`==`检查的是对象引用的相等性;`equals()`检查的是对象内容的相等性。
- 粉丝: 17
- 资源: 25
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助