面试习题总结

逐步扩展的内容

Java 面试习题

  1. Java 中 == 和 equals 和 hashCode 的区别 ?
1、 == 
Java 数据类型分为两类:基本数据类型与引用类型。
1.1 基本数据类型中 使用 “==”直接进行数值的比较。
1.2 引用数据类型中 使用 “==” 进行内存地址的比较,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
1.3 对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。

2、equals,根据两个对象的内存地址判断是否是同一对象。
如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
如果两个对象不equals,他们的hashcode有可能相等。

3、hashCode 
如果两个对象 hashcode 相等,他们不一定equals。
如果两个对象 hashcode 不相等,他们一定不equals。
  1. int与integer的区别
  • 1、Integer是int的包装类,int则是java的一种基本数据类型
  • 2、Integer变量必须实例化后才能使用,而int变量不需要
  • 3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
  • 4、Integer的默认值是null,int的默认值是0
package chao.base;
public class Equalis {
	public static void main(String[] args) {  
		// 基本数据类型
        int int1 = 12;  
        int int2 = 12; 
        // 引用数据类型,开辟堆内存
        Integer Integer1 = new Integer(12);  
        Integer Integer2 = new Integer(12);  
        Integer Integer3 = new Integer(127);  
        // 引用数据类型,
        Integer a1 = 127;  
        Integer b1 = 127;  
        // 引用数据类型,
        Integer a = 128;  
        Integer b = 128;
        // 字符串比较
        String s1 = "str";  
        String s2 = "str";  
        String str1 = new String("str");  
        String str2 = new String("str");  
        
        System.out.println("int 和 int 值进行比较。");
        System.out.println("int1==int2:" + (int1 == int2));
        System.out.println("int 和Integer在进行比较的时候,Integer会进行拆箱,转为int值与int进行比较。");
        System.out.println("int1==Integer1:" + (int1 == Integer1));
        System.out.println("Integer 实例化两个对象,开辟出两个堆内存,有两个堆地址。");
        System.out.println("Integer1==Integer2:" + (Integer1 == Integer2));  // 开辟两个堆内存
        System.out.println("new Integer(1) 和Integer a = 1不同,前者会创建对象,存储在堆中,而后者因为在-128到127的范围内,不会创建新的对象,而是从IntegerCache中获取的。");
        System.out.println("Integer3==b1:" + (Integer3 == b1));
        System.out.println("同是 Integer 声明赋值的变量,都在 -128 到 127 之间的数值,相等");
        System.out.println("a1==b1:" + (a1 == b1));
        System.out.println("同是 Integer 声明赋值的变量,都不在 -128 到 127 之间的数值,属于新建的两个对象");
        System.out.println("a==b:" + (a == b)); // -128 ~ 127
        System.out.println("String 字符串比较的内容");
        System.out.println("s1==s2:" + (s1 == s2));
        System.out.println("new String(); 和 String str ,属于创建两个对象。");
        System.out.println("s1==str1:" + (s1 == str1));
        System.out.println("创建两个对象");
        System.out.println("str1==str2:" + (str1 == str2));
    }  
}
  1. String、StringBuffer、StringBuilder区别
  • String:字符串常量 不适用于经常要改变值得情况,每次改变相当于生成一个新的对象
  • StringBuffer:字符串变量 (线程安全)
  • StringBuilder:字符串变量(线程不安全) 确保单线程下可用,效率略高于StringBuffer
  1. 什么是内部类?内部类的作用
  • 内部类可直接访问外部类的属性。
  • Java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static成员变量和方法, 不依赖外围类)
  1. 进程和线程的区别
  • 进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。
  • 进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。
  • 一个进程内可拥有多个线程,进程可开启进程,也可开启线程。
  • 一个线程只能属于一个进程,线程可直接使用同进程的资源,线程依赖于进程而存在。
  1. final,finally,finalize的区别
  • final:修饰类、成员变量和成员方法,类不可被继承,成员变量不可变,成员方法不可重写
  • finally:与try…catch…共同使用,确保无论是否出现异常都能被调用到
  • finalize:类的方法,垃圾回收之前会调用此方法,子类可以重写 finalize() 方法实现对资源的回收
  1. Serializable 和 Parcelable 的区别
  • Serializable Java 序列化接口 在硬盘上读写 读写过程中有大量临时变量的生成,内部执行大量的i/o操作,效率很低。
  • Parcelable Android 序列化接口 效率高 使用麻烦 在内存中读写(AS有相关插件 一键生成所需方法) ,对象不能保存到磁盘中
  1. 静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
    答案:可继承, 不可重写 而是被隐藏
  • 如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。
  • 如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成。
  1. 成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用
  • Java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static成员变量和方法, 不依赖外围类)
  • 使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
    因为Java不支持多继承,支持实现多个接口。但有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。
  1. string 转换成 integer的方式及原理
  • String ==》integer: Intrger.parseInt(string);
  • Integer ==》String: Integer.toString();
  1. 哪些情况下的对象会被垃圾回收机制处理掉?
  • 1.所有实例都没有活动线程访问。
  • 2.没有被其他任何实例访问的循环引用实例。
  • 3.Java 中有不同的引用类型。判断实例是否符合垃圾收集的条件都依赖于它的引用类型。
  1. 要判断怎样的对象是没用的对象。这里有2种方法:
  • 1.采用标记计数的方法:
    给内存中的对象给打上标记,对象被引用一次,计数就加1,引用被释放了,计数就减一,当这个计数为0的时候,这个对象就可以被回收了。当然,这也就引发了一个问题:循环引用的对象是无法被识别出来并且被回收的。所以就有了第二种方法:
  • 2.采用根搜索算法:
    从一个根出发,搜索所有的可达对象,这样剩下的那些对象就是需要被回收的
  1. Java中实现多态的机制是什么?

答:方法的重写Overriding和重载Overloading是Java多态性的不同表现

重写Overriding是父类与子类之间多态性的一种表现

重载Overloading是一个类中多态性的一种表现.

  1. 说说你对Java反射的理解

JAVA反射机制是在运行状态中, 对于任意一个类, 都能够知道这个类的所有属性和方法; 对于任意一个对象, 都能够调用它的任意一个方法和属性。 从对象出发,通过反射(Class类)可以取得取得类的完整信息(类名 Class类型,所在包、具有的所有方法 Method[]类型、某个方法的完整信息(包括修饰符、返回值类型、异常、参数类型)、所有属性 Field[]、某个属性的完整信息、构造器 Constructors),调用类的属性或方法自己的总结: 在运行过程中获得类、对象、方法的所有信息。

  1. 说说你对Java注解的理解

元注解

  • 元注解的作用就是负责注解其他注解。java5.0的时候,定义了4个标准的meta-annotation类型,它们用来提供对其他注解的类型作说明。

1.@Target

2.@Retention

3.@Documented

4.@Inherited

  1. Java中String的了解
  • 在源码中string是用 final 进行修饰,它是不可更改,不可继承的常量。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值