Java面试知识点

JVM垃圾回收(GC)特点:

1)垃圾回收机制回收 JVM 堆内存里的对象空间,不负责回收栈内存数据。
2)对其他物理连接,比如数据库连接、输入流输出流、Socket 连接无能为力。
3)垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。
4)可以将对象的引用变量设置为 null,暗示垃圾回收机制可以回收该对象。

现在的 JVM 有多种垃圾回收实现算法,表现各异。垃圾回收机制回收任何对象之前,总会先调用它的 finalize 方法(如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象)。程序员可以通过 System.gc()或者 Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定。永远不要主动调用某个对象的 finalize 方法,应该交给垃圾回收机制调用。

为什么为基本类型引入包装类

1.基本数据类型有方便之处,简单、高效。
2.但是 Java 中的基本数据类型却是不面向对象的(没有属性、方法),这在实际使用时存在很多的不便(比如集合的元素只能是 Object)。为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行包装,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。
例如:
Integer 与 int 的区别
int是 java 提供的 8 种原始数据类型之一,Java 为每个原始类型提供了封装类,Integer 是 java 为 int 提供的封装类。int的默认值为 0,而 Integer 的默认值为 null,即 Int和值为 0 的区别,int 则无法表达出未赋值的情况,参加考试和考试成绩为 0 的区别,则只能使用 Inteeger 的默认为 null,所以用 el 表达式在文本框中显,而 int 默认的默认值为 0,所以用 el 表达式在文本所以,int 不适合作为 web 层的表单数据的。

什么是 Java 的序列化,如何实现 Java 的序列化?列举在哪些程序中见过 Java 序列化?

答:Java 中的序列化机制能够将一个实例对象(只序列化对象的属性值,而不会去序列化什么所谓的方法。)的状态信息写入到一个字节流中使其可以通过 socket 进行传输、或者持久化到存储数据库或文件系统中;然后在需
要的时候通过字节流中的信息来重构一个相同的对象。一般而言,要使得一个类可以序列化,只需简单实现 java.io.Serializable 接口即可。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。

在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是 Web 服务器中的 Session 对象,当有 10 万用户并发访问,就有可能出现 10 万个 Session 对象,内存可能吃不消,于是 Web 容器就会把一些 seesion 先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个 Java 对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为 Java 对象。

不通过构造函数也能创建对象吗?

答:Java 创建对象的几种方式(重要):
1、 用 new 语句创建对象,这是最常见的创建对象的方法。
2、运用反射手段,调用 java.lang.Class 或者 java.lang.reflect.Constructor类的 newInstance()实例方法。
3、 调用对象的 clone()方法。
4、运用反序列化手段,调用 java.io.ObjectInputStream 对象的readObject()方法。
(1)和(2)都会明确的显式的调用构造函数 ;(3)是在内存上对已有对象的影印,所以不会调用构造函数 ;(4)是从文件中还原类的对象,也不会调用构造函

在 Java 中,为什么基本类型不能做为 HashMap 的键值,而只能是引用类型,把引用类型做为 HashMap 的健值,需要注意哪些地方。

(1) 在 Java 中是使用泛型来约束 HashMap 中的 key 和 value 的类型的,即 HashMap;而泛型在 Java 的规定中必须是对象 Object 类型的,也就是说 HashMap可以理解为 HashMap,很显然基本数据类型不是 Object 类型的,因此不能作为键值,只能是引用类型。虽然我们在 HashMap 中可以这样添加数据:“map.put(1, “Java”);”,但实际上是将其中的 key 值 1 进行了自动装箱操作,变为了 Integer 类型。
(2) 引用数据类型分为两类:系统提供的引用数据类型(如包装类、String等)以及自定义引用数据类型。系统提供的引用数据类型中已经重写了HashCode()和 equals()两个方法,所以能够保证 Map 中 key 值的唯一性;但是自定义的引用数据类型需要自己重写 HashCode()和 equals()这两个方法,以保证 Map 中 key 值的唯一性。

实现多态三个前提条件:

1、 继承的存在;(继承是多态的基础,没有继承就没有多态)。
2、子类重写父类的方法。(多态下会调用子类重写后的方法)。
3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)

接口和抽象类的区别

相同点
1)抽象类和接口均包含抽象方法,类必须实现所有的抽象方法,否则是抽象类
2) 抽象类和接口都不能实例化,他们位于继承树的顶端,用来被其他类继承和实现

不同
两者的区别主要体现在两方面:语法方面和设计理念方面
语法方面的区别是比较低层次的,非本质的,主要表现在:
1) 接口中只能定义全局静态常量,不能定义变量。抽象类中可以定义常量和变量。
2)接口中所有的方法都是全局抽象方法。抽象类中可以有 0 个、1 个或多个,甚至全部都是抽象方法。
3) 抽象类中可以有构造方法,但不能用来实例化,而在子类实例化是执行,完成属于抽象类的初始化操作。接口中不能定义构造方法。
4)一个类只能有一个直接父类(可以是抽象类),但可以充实实现多个接口。一个类使用 extends 来继承抽象类,使用 implements 来实现接口。

二者的主要区别还是在设计理念上,其决定了某些情况下到底使用抽象类还是接口。
1)抽象类体现了一种继承关系,目的是复用代码,抽象类中定义了各个子类的相同代码,可以认为父类是一个实现了部分功能的“中间产品”,而子类是“最终产品”。父类和子类之间必须存在“is-a”的关系,即父类和子类在概念本质上应该是相同的。
2) 接口并不要求实现类和接口在概念本质上一致的,仅仅是实现了接口定义的约定或者能力而已。接口定义了“做什么”,而实现类负责完成“怎么做”,体现了功能(规范)和实现分离的原则。接口和实现之间可以认为是一种“has-a 的关系

同步代码块和同步方法有什么区别

相同点:
同步方法就是在方法前加关键字 synchronized,然后被同步的方法一次只能有一个线程进入,其他线程等待。而同步代码块则是在方法内部使用大括号使得一个代码块得到同步。同步代码块会有一个同步的“目标”,使得同步块更加灵活一些(同步代码块可以通过“目标”决定需要锁定的对象)。一般情况下,如果此“目标”为 this,同步方法和代码块没有太大的区别。
区别:
同步方法直接在方法上加 synchronized 实现加锁,同步代码块则在方法内部加锁。很明显,同步方法锁的范围比较大,而同步代码块范围要小点。一般同步的范围越大,性能就越差。所以一般需要加锁进行同步的时候,范围
越小越好,这样性能更好。

反射的概念与作用

反射的概念:
反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。
1)Java 反射可以于运行时加载,探知和使用编译期间完全未知的类.
2)程序在运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用他的任意一个方法和属性;
3)加载完类之后, 在堆内存中会产生一个 Class 类型的对象(一个类只有一个 Class 对象), 这个对象包含了完整的类的结构信息,而且这个 Class 对象就像一面镜子,透过这个镜子看到类的结构,所以被称之为:反射.
4)java 反射使得我们可以在程序运行时动态加载一个类,动态获取类的基本信息和定义的方法,构造函数,域等。
5) 除了检阅类信息外,还可以动态创建类的实例,执行类实例的方法,获取类实例的域值。反射使 java 这种静态语言有了动态的特性。
反射的作用:
通过反射可以使程序代码访问装载到 JVM 中的类的内部信息

  1. 获取已装载类的属性信息
  2. 获取已装载类的方法
  3. 获取已装载类的构造方法信息
    反射的优点:
    增加程序的灵活性。
    如 struts 中。请求的派发控制。当请求来到时。struts 通过查询配置文件。找到该请求对应的 action。已经
    方法。然后通过反射实例化 action。并调用响应 method。如果不适用反射,那么你就只能写死到代码里了。所以说,一个灵活,一个不灵活。很少情况下是非用反射不可的。大多数情况下反射是为了提高程序的灵活性。因此一般框架中使用较多。因为框架要适用更多的情况。对灵活性要求较高。

如何将字符串转换为基本数据类型?

调用基本数据类型对应的包装类中的方法 parseXXX(String)或valueOf(String)即可返回相应基本类型;

如何将基本数据类型转换为字符串?

一种方法是将基本数据类型与空字符串(””)连接(+)即可获得其所对应的字符串;另一种方法是调用 String 类中的 valueOf(…)方法返回相应字符串

怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?

String s1 = “你好”;
String s2 = newString(s1.getBytes(“GB2312”), “ISO-8859-1”);

字符串如何转换为 int 类型

   public class Test {
   		 public static void main(String[] args) {
   		 //方式一
   		 int num=Integer.parseInt("123");
    	//方式二
    	int num2=Integer.valueOf("123");
   	 	System.out.println(num+" "+num2);
    	}
 }

集合和数组的比较(为什么引入集合)

数组不是面向对象的,存在明显的缺陷,集合完全弥补了数组的一些缺点,比数组更灵活更实用,可大大提高软件的开发效率而且不同的集合框架类可适用于不同场合。具体如下:
1)数组的效率高于集合类.
2)数组能存放基本数据类型和对象,而集合类中只能放对象。
3)数组容量固定且无法动态改变,集合类容量动态改变。
4)数组无法判断其中实际存有多少元素,length 只告诉了 array 的容量。
5)集合有多种实现方式和不同的适用场合,而不像数组仅采用顺序表方式。
6)集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率

List,Set,Map 各有什么特点

List 接口存储一组不唯一,有序(插入顺序)的对象。
Set 接口存储一组唯一,无序的对象。
Map 接口存储一组键值对象,提供 key 到 value 的映射。key 无序,唯一。value 不要求有序,允许重复。(如果只使用 key 存储,而不使用 value,那就是 Set)。
其中Map 接口继承了 java.lang.Object 类,但没有实现任何接口
List,Set继承了Collection接口

你可能感兴趣的:(学习笔记,面试)