java基础面试题

1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 

第一种情况,s1是short类型,在计算s1=s1+1时,前边是short型,后边是int型,不能自动转换。由于没有强转,要报类型错误。

第二种情况,使用了+=这个java自带的运算符,java内部会对其进行处理,所以编译通过,不会报错。

2.&和&&的区别。 

&和&&都表示与的意思,既表达式俩边都成立,结果才成立。

&&是逻辑运算符,&&有短路作用,既当表达式左边为假释,不需要计算右边,整个的结果直接为假;&没有

&是位运算符,&的左右俩边可以是布尔类型,也可以是数值;&&俩边只能是布尔类型

3.Integer与int的区别 

int是八大基本数据类型之一,Integer是int的封装类。

int的默认值是0,Integer的默认值是null,此时的0代表这个数赋值0,而null代表没接收到这个值

Integer提供了与整数相关的操作,int没有

4.Collection 和 Collections的区别

Collection是集合的最顶层接口,这个接口下有List和Set俩个子接口

Collections是针对集合的一个工具类,里边有很多静态方法,用于集合的搜索排序等

5.什么是序列化,如何实现序列化?

序列化机制(包括序列化和反序列化)的本质是用流将对象读到内存和写入外存。

序列化机制的意义就是将对象脱离程序运行独立存在

应用场景是在RMI(远程方法调用)中应用,即通过网路或跨平台传输对象,而RMI是javaEE开发基础,所以javaEE要求传递的参数与返回值都实现序列化机制

序列化是用流将java对象转成二进制写入硬盘或网络

反序列化是用流将二进制数据转为java对象写入内存

实现序列化需要实现Serializable或Externalizable接口,如果某个成员变量是引用数据类型,那么要求该引用类也是可序列化的。如果类中每个成员变量不想被序列化,可以用transient关键字修饰。

序列化通常与IO中的ObjectInputStream(readObject方法)和ObjectOutputStream(writeObject方法)搭配使用

6.什么是单例模式?

单例模式是指一个类只创建一个实例。

单例模式是经常用到的一种设计模式,它分为饿汉式、懒汉式、静态内部类、枚举

饿汉式:在类加载时就创建本类对象为私有静态常量,构造方法写成私有的,使用共有静态方法代替构造方法获取到这个单例

懒汉式:在饿汉式的基础上给静态方法加synchronized,在方法里判断本类对象是否为空,为空时创建。

静态内部类:将单例放在静态内部类中,避免在类加载的时候就创建对象,然后用静态方法代替私有构造

7.list,set,map的区别

1>集合和数组的区别

数组是固定长度的;集合可变长度的。

数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。

数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。

2> List , Set , Map 三者的区别?
Java 容器分为 Collection 和 Map 两大类, Collection 集合的子接口有 Set 、 List 、 Queue 三种子接
口。我们比较常用的是 Set 、 List , Map 接口不是 collection 的子接口。
Collection 集合主要有 List 和 Set 两大接口
List :一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多
个 null 元素,元素都有索引。常用的实现类有 ArrayList 、 LinkedList 和 Vector 。
Set :一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一
个 null 元素,必须保证元素唯一性。 Set 接口常用实现类是 HashSet 、 LinkedHashSet 以及
TreeSet 。
Map 是一个键值对集合,存储键、值和之间的映射。 Key 无序,唯一; value 不要求有序,允许重
复。 Map 没有继承于 Collection 接口,从 Map 集合中检索元素时,只要给出键对象,就会返回对应
的值对象。
Map 的常用实现类: HashMap 、 TreeMap 、 HashTable 、 LinkedHashMap 、
3> ArrayList 和 LinkedList 的区别是什么?
数据结构实现: ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实
现。
随机访问效率: ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数
据存储方式,所以需要移动指针从前往后依次查找。
增加和删除效率:在非首尾的增加和删除操作, LinkedList 要比 ArrayList 效率要高,因为
ArrayList 增删操作要影响数组内的其他数据的下标。
内存空间占用: LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储
了两个引用,一个指向前一个元素,一个指向后一个元素。
线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList ,而在插入和删除操作较多
时,更推荐使用 LinkedList 。
LinkedList 的双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向
直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结
点和后继结点。
4>多线程场景下如何使用 ArrayList ?

ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用

5>HashSet 的实现原理?
HashSet 是基于 HashMap 实现的, HashSet 的值存放于 HashMap 的 key 上, HashMap 的 value 统
一为 present ,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层
HashMap 的相关方法来完成, HashSet 不允许重复的值。
6>HashMap 的实现原理?
HashMap 概述: HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的映射
操作,并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap 的数据结构: 在 Java 编程语言中,最基本的结构就是两种,一个是数组,另外一个是模
拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的, HashMap 也不例外。
HashMap 实际上是一个 “ 链表散列 ” 的数据结构,即数组和链表的结合体。
HashMap 基于 Hash 算法实现的

8.,面向对象编程的原则是什么?

多态,继承和封装

9.final, finally, finalize的区别

  • final用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.
  • finally是异常处理语句结构的一部分,表示总是执行.
  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. JVM不保证此方法总被调用.

10.  两个对象的hashCode()相同,则 equals()是否也一定为 true?

两个对象equals相等,则它们的hashcode必须相等,如果两个对象的hashCode()相同,则equals()不一定为true。

11.抽象类和接口有什么区别

  • 抽象类要被子类继承,接口要被子类实现。
  • 抽象类可以有构造方法,接口中不能有构造方法。
  • 抽象类中可以有普通成员变量,接口中没有普通成员变量,它的变量只能是公共的静态的常量
  • 一个类可以实现多个接口,但是只能继承一个父类,这个父类可以是抽象类。
  • 接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
  • 抽象级别(从高到低):接口>抽象类>实现类。
  • 抽象类主要是用来抽象类别,接口主要是用来抽象方法功能。
  • 抽象类的关键字是abstract,接口的关键字是interface

12.String,Stringbuffer,StringBuilder的区别

String:

  • String类是一个不可变的类,一旦创建就不可以修改。
  • String是final类,不能被继承
  • String实现了equals()方法和hashCode()方法

StringBuffer:

  • 继承自AbstractStringBuilder,是可变类。
  • StringBuffer是线程安全的
  • 可以通过append方法动态构造数据。

StringBuilder:

  • 继承自AbstractStringBuilder,是可变类。
  • StringBuilder是非线性安全的。
  • 执行效率比StringBuffer高。

12.静态代理和动态代理的区别

静态代理中代理类在编译期就已经确定,而动态代理则是JVM运行时动态生成,静态代理的效率相对动态代理来说相对高一些,但是静态代理代码冗余大,一但需要修改接口,代理类和委托类都需要修改。

13.说说Java中多态的实现原理

  • 多态机制包括静态多态(编译时多态)和动态多态(运行时多态)
  • 静态多态比如说重载,动态多态一般指在运行时才能确定调用哪个方法。
  • 我们通常所说的多态一般指运行时多态,也就是编译时不确定究竟调用哪个具体方法,一直等到运行时才能确定。
  • 多态实现方式:子类继承父类(extends)和类实现接口(implements)
  • 多态核心之处就在于对父类方法的改写或对接口方法的实现,以取得在运行时不同的执行效果。
  • Java 里对象方法的调用是依靠类信息里的方法表实现的,对象方法引用调用和接口方法引用调用的大致思想是一样的。当调用对象的某个方法时,JVM查找该对象类的方法表以确定该方法的直接引用地址,有了地址后才真正调用该方法。

14.java获取反射的三种方法

  • 第一种,使用 Class.forName 静态方法。
  • 第二种,使用类的.class 方法
  • 第三种,使用实例对象的 getClass() 方法。

15.Java有哪些数据类型

定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分 配了不同大小的内存空间。

基本数据类型

  • 数值型
  • 整数类型(byte,short,int,long)
  • 浮点类型(float,double)
  • 字符型(char)
  • 布尔型(boolean)

引用数据类型

  • 类(class)
  • 接口(interface)
  • 数组([])
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值