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)
- 数组([])