面试题 -基础记录

1. Hashcode的作用,与 equal 有什么区

a. 同样用于鉴定2个对象是否相等的,java集合中有 list 和 set 两类,其中 set不允许元素重复实现,那个这个不允许重复实现的方法,如果用 equal 去比较的话,如果存在1000个元素,你 new 一个新的元素出来,需要去调用1000次 equal 去逐个和他们比较是否是同一个对象,这样会大大降低效率。hashcode实际上是返回对象的存储地址,如果这个位置上没有元素,就把元素直接存储在上面,如果这个位置上已经存在元素,这个时候才去调用equal方法与新元素进行比较,相同的话就不存了,散列到其他地址上

2. equals与==的区别:

a. ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同

3. String、StringBuffer与StringBuilder的区别

a. String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象

b. StringBuffer和StringBuilder底层是 char[]数组实现的

c. StringBuffer是线程安全的,而StringBuilder是线程不安全的

4. Override和Overload的含义去区别

a. Overload顾名思义是重新加载,它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名、返回值、类型不能相同;或者说可以改变参数、类型、返回值但是函数名字依然不变。

b. 就是ride(重写)的意思,在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数,当子类在调用这一函数时自动调用子类的方法,而父类相当于被覆盖(重写)了。

5. 抽象类和接口的区别

a. 一个类只能继承单个类,但是可以实现多个接口

b. 接口强调特定功能的实现,而抽象类强调所属关系

c. 抽象类中的所有方法并不一定要是抽象的,你可以选择在抽象类中实现一些基本的方法。而接口要求所有的方法都必须是抽象

6. JAVA 中堆和栈的区别,说下java 的内存机制

a. 基本数据类型比变量和对象的引用都是在栈分配的

b. 堆内存用来存放由new创建的对象和数组

c. 类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中

d. 实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的”物理位置”,实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存

e. 局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

7.24种设计模式(gof23+1)

创建型模式: 
1.简单工厂模式(不包含在gof23中) 
2.工厂模式 
3.抽象工厂模式 
4.单例模式 
5.原型模式 
创建者模式 
6.结构型模式: 
7.组合模式 
8.装饰者模式 
9.外观模式 
10.适配器模式 
11.代理模式 
12.享元模式 
13.桥接模式 
行为型模式: 
14.观察者模式 
15.策略模式 
16.状态模式 
17.中介模式 
18.模板方法 
19.命令模式 
20.备忘录模式 
21.访问者模式 
22.解释器模式 
23.迭代器模式 
24.职责链模式 
这里只是简单描述了定义和特征以及设计模式的关系,具体细节不讨论。

8.&和&&的区别?

&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

9.手写单例模式(饿汉和饱汉模式)和工厂模式?

(1)单例饿汉模式://饿汉式单例类.在类初始化时,已经自行实例化 

 public class Singleton1 { 
 //私有的默认构造子 
 private Singleton1() {} 
 //已经自行实例化 
 private static final Singleton1 single = new Singleton1(); 
 //静态工厂方法 
 public static Singleton1 getInstance() { 
 return single; 
 } 
 

(2)懒汉模式://懒汉式单例类.在第一次调用的时候实例化 

public class Singleton2 { 
 //私有的默认构造子 
 private Singleton2() {} 
 //注意,这里没有final 
 private static Singleton2 single=null; 
 //静态工厂方法 
 public synchronized static Singleton2 getInstance() { 
 if (single == null) { 
 single = new Singleton2(); 
} 
 return single; 
 } 
}

(3)工厂模式: 

interface IFactory{ 
public IProduct createProduct();} 
Class Factory implements IFactory{ 
public IProduct createProduct(){return new Product();}} 
Public class client{ 
Public Static void main (String [] args){IFactory factory=new Factory(); 
IProduct product=factory.createProduct(); 
product.ProductMethod();}}


10.什么是值传递和引用传递?

值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量. 
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 
一般认为,java内的传递都是值传递. java中实例对象的传递是引用传递

11.Java支持多继承么?

Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)

12.接口和抽象类的区别是什么?

从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。 
类可以实现很多个接口,但是只能继承一个抽象类 
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。 
抽象类可以在不提供接口方法实现的情况下实现接口。 
Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。 
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。 
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。 
也可以参考JDK8中抽象类和接口的区别。

13.Java集合框架的基础接口有哪些?

Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。## 标题 ## 
Set是一个不能包含重复元素
的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。 
List是一个有序集合,可以
包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。 
Map是一个将key映射到value的对象.一个
Map不能包含重复的key:每个key最多只能映射一个value。 
一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

14.Java中的HashMap的工作原理是什么?

我们知道在Java中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现,HashMap也是如此。实际上HashMap是一个“链表散列”,如下是它数据结构:最左侧是一个数组,数组中的每一个元素都是一个链表,链表的每一个元素都是entry。

HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。

15.Java中的HashMap的工作原理是什么?

我们知道在Java中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现,HashMap也是如此。实际上HashMap是一个“链表散列”,如下是它数据结构:最左侧是一个数组,数组中的每一个元素都是一个链表,链表的每一个元素都是entry。

HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。

16.hashCode()和equals()方法有何重要性?

HashMap使用Key对象的hashCode()和equals()方法去决定key-value对的索引。当我们试着从HashMap中获取值的时候,这些方法也会被用到。如果这些方法没有被正确地实现,在这种情况下,两个不同Key也许会产生相同的hashCode()和equals()输出,HashMap将会认为它们是相同的,然后覆盖它们,而非把它们存储到不同的地方。同样的,所有不允许存储重复数据的集合类都使用hashCode()和equals()去查找重复,所以正确实现它们非常重要。equals()和hashCode()的实现应该遵循以下规则: 
(1)如果o1.equals(o2),那么o1.hashCode() == o2.hashCode()总是为true的。 
(2)如果o1.hashCode() == o2.hashCode(),并不意味着o1.equals(o2)会为true。 

17.Array和ArrayList有何区别?什么时候更适合用Array?

Array可以容纳基本类型和对象,而ArrayList只能容纳对象。 
Array是指定大小的,而ArrayList大小是固定的。 
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。 
(1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。 
(2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。 
(3)如果你要使用多维数组,使用[][]比List

18.ArrayList和Vector有何异同点?

ArrayList和Vector在很多时候都很类似。 
(1)两者都是基于索引的,内部由一个数组支持。 
(2)两者维护插入的顺序,我们可以根据插入顺序来获取元素。 
(3)ArrayList和Vector的迭代器实现都是fail-fast的。 
(4)ArrayList和Vector两者允许null值,也可以使用索引值对元素进行随机访问。 
以下是ArrayList和Vector的不同点。 
(1)Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。 
(2)ArrayList比Vector快,它因为有同步,不会过载。 
(3)ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值