java面试题(自己学习,不定时上传)

Java面试题

1.java基础

1.1 为什么Java代码可以实现一次编写、到处运行?

因为jvm(java虚拟机)是java跨平台的关键

在运行前,java源代码会通过编译器编译为字节码,再通过jvm将对应的字节码翻译为机器码并运行,即在不同的平台下,只要安装对应的jvm就可以运行字节码文件。故在不同的平台下,同一份java源代码不需要任何改变,只需要编译一次都可以运行。Jvm起着这样一种桥梁的作用

1.2 一个Java文件里可以有多个类吗(不含内部类)?

Java文件中可以有多个类,但是只能有一个被public修饰的类

且被public修饰的类的类名必须和java文件的文件名相同

1.3 说一说你对Java访问权限的了解

Java语言通过了3种修饰符:private、protected、public。

修饰权限分为4种:private、protected、public、default

如果不用修饰符时,默认的修饰权限为default

在修饰成员变量或成员方法时

Private:该成员变量可被该类内部成员访问

Protected:该成员方法可以被该类内部成员访问,也可以被同一个包下的其它类访问还可以被它的子类访问

Default:该成员方法可以被该类内部成员访问,可以被同一个包下的其它类访问

Public:该成员方法可以被任意包下的任意类访问

在修饰类时

Default:同一包下的类可以访问

Public:任意包下的任意类访问

1.4 介绍一下Java的数据类型

Java数据类型可以分为两大类分别为基本数据类型和引用数据类型

基本数据类型一共有8个分为4类

整数数据类型:byte(1字节) 、 short(2字节)、 int(4字节) 、 long(8字节)

浮点类型:float(4字节) 、 double(8字节)

字符类型:char(2字节)

布尔类型boolea  (java规范没有明确的规定,不同的JVM有不同的实现机制)

1.5Java语言有哪些特点

1 、简单易学、有丰富的类库
2 、面向对象( Java 最重要的特性,让程序耦合度更低,内聚性更高)
3 、与平台无关性( JVM Java 跨平台使用的根本)
4 、可靠安全
5 、支持多线程

1.6 请介绍全局变量和局部变量的区别

Java中没有真正意义上的全局变量,java的变量分为成员变量和局部变量

成员变量:

1.成员变量是类范围里定义的变量

2.成员变量有默认的初始值

3.未被static修饰的成员变量也叫实例变量,它存储在对象所在的堆内存中,生命周期与对象相同

4.被static修饰的成员变量也叫类变量,它存储在方法区中,生命周期与当前类相同

局部变量:

1.局部变量是在方法中定义的变量

2.局部变量没有默认初始值

3.局部变量存储在栈内存中,作用范围结束,就会释放变量空间

1.7 请介绍一下实例变量的默认值

实例变量若未引用类型那么它的默认值皆未null

若为基本类型

Byte:0           short:0          int:0               long:0L                  float:0.0F     doube:0.0

Char:\u000’            Boolean:false

1.8 为啥要有包装类?

Java是一种面向对象的语言,它设计的基本概念为一切皆对象,而基本数据类型不具有对象的特征,为了解决这一问题所以对每一种基本数据类型设计了对应的引用类型,即包装类

1.9 说一说自动装箱、自动拆箱的应用场景

自动装箱、自动拆箱是jdk1.5提供的功能

自动装箱:可以把一个基本数据类型的数据直接赋值给对应的包装类型

自动拆箱:可以把一个包装类型的数据直接赋值给对应的基本数据类型

应用场景:通过自动拆箱和自动装箱可以简化基本数据类型和包装类型的转化过程,比如某一个方法的参数是为包装类型,而我们调用时,我们持有的参数却是基本数据类型,这时通过自动装箱和自动拆箱我们就可以不做任何处理直接来调用这个方法

1.10 如何对Integer和Double类型判断相等?

Integer和Double不能直接进行比较在,这包括:

不能用 == 直接进行比较因为Integer和Double是不同的数据类型

不能转为字符串进行比较,因为转字符串后,浮点值后面带小数点,整数值不带,所以它们永远不会相等

不能使用compareTo方法进行比较,虽然他们两个都有compareTo方法,但是该方法只能对相同的类型进行比较

我们应该将Integer类型转化为Double类型,再使用==进行比较。

1.11 int和Integer有什么区别,二者在做==运算时会得到什么结果?

Int是基本类型,integer是包装类型,在用==进行运算时,Integer会自动拆箱成为int类型再进行比较,如果两个int类型的值相同返回true反之亦然。

1.12重载和重写的区别?

重载:一个类中,同名的方法有不同的参数列表,就叫做重载,重载对方法的返回值类型没有要求,不能根据返回值类型来判断是否重载。

重写:子类继承父类时,对于父类原有的方法并不想原封不动的继承,对父类原有的方法的方法体进行修改或重写,该方法的方法名、参数列表、返回值类型与父类方法保存一致。这就是重写,注意重写的方法的权限不能比父类方法权限小

1.13Hashcode的作用

Java集合有两大类list和set。List是有序可重复,set是无序不可重复,当set集合中插入新的元素时,我们该怎样判断,该集合中是否存在这个元素,这时我们就能调用equals方法进行比较,但是当集合中元素过多时,这样的方法就太慢了,此时就有人发明了哈希算法。

Hashcode:可以这样理解,它返回的就是根据对象内存地址计算出的一个值,当集合插入新元素时,我们就可以根据这个元素的hashcode方法准确的找到它应该存放的物理位置,如果这个位置上没有元素,就将这个元素存储在这个位置上,如果这个位置有元素,就调用equals方法进行比较,如果这两个元素相同就不用存储,如果不同就散列其它地址,这样一来实际调用equals方法的次数就大大减少,几乎只需调用一两次

1.14String、StringBuffffer 和 StringBuilder 的区别是什么?

String只是可读字符串不是基本类型,而是一个对象,从源码来看是一个final修饰的字符数组,所引用的字符串不能被改变,一旦被定义就不能进行增删改,每次对String进行的操作都是创建一个新的String对象。每次操作都是隐式的在堆上创建一个跟原字符串相同的StringBuilder对象,再调用append方法进行拼接后面的字符。

StringBuffer和StringBuilder都继承于AbstractStringBuilder,他们的底层都是可变字符数组,所以对字符串进行频繁的操作时,建议使用StringBuffer或StringBuilder,StringBuffer对方法加了同步锁或对调用的方法加了同步锁,是线程安全的,StringBuilder没有对方法加同步锁是非线程安全的。

1.15ArrayList和linkedList的区别

Array数组是一个基于索引index的数据结构,它根据索引对数据进行搜索和读取的速度很快。其时间复杂度为O(1),然而对数据的删除较慢,因为它会对数组重新排序即将后面的元素前移。

缺点:数组初始化时需要指定长度否则报错

List是一个有序可重复的集合,提供了按索引访问的方式继承于Collection

List集合有两个重要的实现类ArrayList和linkedList

ArrayList:可以看成一个自动增长容量的数组,toArray方法返回一个数组,toList方法返回一个列表,ArrayList的底层是Array,数组扩容实现。

LinkList是一个双链表,它对数据的增删操作比ArrayList有更好的性能,但是在get和set方面弱于ArrayList,当然这些比较都是在大量数据或者频繁的数据操作时。

1.16HashMap和HashTable的区别

1.它们的父类不同,HashMap的父类为AbstractMap类,HashTable的父类为Dictionary类不过它们都同时实现类map,Serializable(序列化),Cloneable(可复制)这三个接口

2.对外接口不同,HashTable比HashMap多了elments方法和contains方法,elments方法继承于父类Dictionary,作用是返回HashTable中value的枚举。contains方法是判断HashTable是否包含传入的value,它的作用与containsValue一致,实际上containsValue就是调用contains方法

3.对null支持不同,HashTable的key和value都不能为null。HashTable的key可以为null,因为要保持key的唯一性所以只能有一个key为null而value可以有多个为null

4.安全性不同,HashMap是非线程安全的,在多线程并发的环境下可能会产生死锁等问题,需要程序员自己处理线程安全问题。HashTable是线程安全的可以直接用于多线程中,因为它的每个方法都使用了synchronized关键字

5.初始容量大小和每次扩容大小不同

6.计算hash值的方法不同

1.17Collection包结构,与Collections的区别

Collections是集合类的上级接口,它的子接口有list、set、ArrayList、LinkList等

Collections是一个集合的帮助类,它提供了各种关于集合操作的静态多态方法,实现了各种关于集合搜索、排序、线程安全等操作,此类不能实例化就像一个工具类,服务于java的Conllection框架

1.18泛型常用特点

泛型意味着编码可以被不同类型的对象所重用,我们提供了泛型的概念,但是在使用时我们可以制定不同的规则来进行约束。

使用泛型的好处:以集合为例,使用泛型的好处是我们可以不因为添加不同类型的元素而创建不同类型的集合,不管是什么类型的数据,我们都可以将底层存储设置为Object,添加数据都可以向上转换为Object类型,更重要的是我们可以按自己的想法来控制存储的数据类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值