Java基础面试题 Q&A

1.final finally finalize比较

final:修饰类(不可被继承),方法(不能被重写),引用(引用只能有一次指向对象的机会),基本类型的变量(值只能赋值一次)

finally:用于异常处理的try-catch-finally。 finally块的语句在try或catch中的return语句  执行之后返回之前 执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。

finalize:Object的方法,垃圾收集器回收对象时调用的方法

2.Exception, Error, RuntimeException的区别

Exception包括RuntimeException、 otherException

RuntimeException(非检查型异常): 编译器不会检查,代码中不用捕获和抛出,一般是由于程序逻辑错误导致。比如:NullPointerException, IndexOutOfBoundsException, ClassCastException, IllegalArgumentException, ArithmaticException, NumberFormatException

Error描述了运行时系统的内部错误和资源耗尽错误

3. int和Integet的对比:

通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。

Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)

对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

4. String StringBuilder StringBuffer的区别

1). 运行速度上:StringBuilder > StringBuffer(线程安全) > String (在字符串长度较短的情况下,三者差距不大)
因为String为常量,不能修改,另外两个是变量/对象,可以修改。Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。

而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多.


StringBuffer 比 StringBuilder 慢,是因为 StringBuffer 是线程安全的,它的方法使用 synchronized 进行加锁,所以速度自然慢了。

2). 线程安全上:StringBuffer是线程安全的,StringBuilder不是线程安全的。 因为StringBuffer的很多方法有synchronized关键字。

3). String适用于少量字符串的操作;
    StringBuilder适用于单线程下在缓冲区进行大量操作;
    StringBuffer 适用于多线程下在缓冲区进行大量操作。

5.重写和重载的区别

重写:子类重写父类的方法,重写的方法的方法名、参数列表、返回值必须相同。子类的访问修饰权限不能小于父类,抛出的检查型异常不能大于父类(里氏替换原则)。

重载:一个类中同名的方法有不同的参数列表(参数类型、参数个数、参数顺序不同)。仅返回值不同不能算作重载。

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

6. 抽象类和接口的区别

抽象类的特点:
抽象方法必须为public/protected;
抽象类不能用来创建对象(不能实例化);
一个类继承于抽象类,子类必须实现父类抽象方法,如果子类没有实现,则子类也必须声明为abstract。
抽象类中可以存在成员方法的实现细节,但是成员方法的类型不能是static类型

接口的特点: 接口中可以包含public static final变量,public abstract方法。

区别:

  • 1)一个是类,一个是接口。类只能继承自一个父类,但可以实现多个接口。
  • 2)接口中的方法,子类必须要实现;抽象类的子类只要重写abstract 修饰的方法。
  • 3)抽象类中可以有构造方法,普通成员遍量,普通方法,静态方法;接口中不能有这些,接口中的方法只能有 public abstract 或 default 修饰的方法,public static final修饰的变量。

相同点: 1)都是为了复用,减少重复代码 2)抽象方法只有方法声明,没有具体实现 3)子类都能从父类获得实现的方法:抽象类的非abstract方法,接口的 default 方法

7.说说反射的用途及实现

1、获得Class对象

1). Class.forName
2). xxx.class
3). new xxx().getClass()

使用1),3)获取类对象会导致静态属性被初始化

2、判断是否为某个类的实例

用instanceof关键字来判断是否为某个类的实例

3、创建实例

使用Class对象的newInstance()方法来创建Class对象对应类的实例。

  先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。

4、获取方法

getDeclaredMethods()

5、获取构造器信息

getConstructor()

6、获取类的成员变量(字段)信息

getFiled: 可以访问public的成员变量

 getDeclaredField:可以访问所有的成员变量,包括private的字段,但是不能访问private字段上的值。不访问继承来的字段
        Hero h =new Hero();
        //使用传统方式修改name的值为garen
        h.name = "garen";
        try {
            //获取类Hero的名字叫做name的字段
            Field f1= h.getClass().getDeclaredField("name");
            //修改这个字段的值
            f1.set(h, "teemo");
            //打印被修改后的值
            System.out.println(h.name);
             
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

7、调用方法

invoke()
    Hero h = new Hero();
    try {
        // 获取这个名字叫做setName,参数类型是String的方法
        Method m = h.getClass().getMethod("setName", String.class);
        // 对h对象,调用这个方法
        m.invoke(h, "master");
        // 使用传统的方式,调用getName方法
        System.out.println(h.getName());
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

8、利用反射创建数组

Array.newInstance()

8.说说自定义注解的场景及实现

@Target: 注解的作用域: 类、方法、字段

@Retention:注解什么时候生效:源代码、运行时、编译时

@Inherited:表明注解具有继承性

@Documented:注解会出现在javadoc生成的api文档中

@Repeatable: 注解可以在一处重复使用

9• HTTP请求的GET与POST方式的区别

get与post:

1)、get在浏览器后退/刷新时是无害的,post的数据会被重新提交

2)、GET请求会被浏览器主动cache,而POST不会,除非手动设置。

3)、GET请求只能进行url编码(application/x-www-form-urlencoded),而POST支持多种编码方式。 (application/x-www-form-urlencoded 或 multipart/form-data。)

4)、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

5)、GET 方法向 URL 添加数据,URL的长度是受限制的(URL 的最大长度是 2048 个字符,2K),而POST没有。

6)、对于参数的数据类型,GET只接受ASCII字符,而POST没有限制。

7)、GET不如POST安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

8)、GET参数通过URL传递,POST放在Request body( HTTP 消息主体)中。

9)、GET产生一个TCP数据包;POST产生两个TCP数据包。 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

10. Session与Cookie区别

1、cookie数据存放在第三方应用的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE,进行COOKIE欺骗,考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议: 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在COOKIE

11. 列出自己常用的JDK包

java.lang: 这个是系统的基础类,比如String等都是这里面的,这个package是唯一一个可以不用import就可以使用的Package

java.io: 这里面是所有输入输出有关的类,比如文件操作等

java.net: 这里面是与网络有关的类,比如URL,URLConnection等。

java.util : 这个是系统辅助类,特别是集合类Collection,List,Map等。

java.sql: 这个是数据库操作的类,Connection, Statememt,ResultSet等

12. MVC设计思想

MVC是model、view、controller的简称,model 负责存取数据 view负责数据渲染,结果呈现;controller 负责处理请求,

13. equals() 和== 的区别

equals()比较对象的值 == 用来比较两个对象是否指向同一个引用,基本变量的值

14. hashcode() equals() 的区别和联系

如果两个对象equals()相同,hashcode()一定相同;反过来不成立。

15. 什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用

序列化:把对象一流的形式存储; 反序列化:把流数据转换为Java对象 将类实现Serializable接口,它的子类也都是可序列化的。该接口是个空接口。

16. Object类中常见的方法,为什么wait notify会放在Object里边?

hashcode(), equals(), clone(), toString(), notify(), finalize()... 因为Java提供的所是对象级的锁,不是线程级的锁

17.Java的平台无关性如何体现出来的

Java文件编译后为class文件,即字节码文件,jvm把字节码翻译成机器上码再执行。所以说jvm虚拟机实现了平台无关性。

18.JDK和JRE的区别

jdk是开发工具包,jdk包含jre和其它的开发工具。 jre是程序的运行环境,包含jvm和Java核心类库。

Java 8有哪些新特性

a. lamda表达式:将函数当成参数传递给某个方法,或者把代码本身当作数据处理; 接口中可以有default修饰的方法的实现;
b. 函数式接口@FunctionalInterface:接口中只有一个方法 
c: Date/Time API 
d: Stream API

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值