基础面试题

本文由用户“lvkie”分享发布 更新时间:2020-04-20 16:38:17 举报文档

以下为《基础面试题》的无排版文字预览,完整格式请下载

下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

同步锁/读写锁

多个读者可以同时进行读

写者必须互斥(只允许一个写者写,也不能读者写者同时进行)

写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)

互斥锁特点:

一次只能一个线程拥有互斥锁,其他线程只有等待

String和StringBuilder的区别?字符串拼接优先选择什么?简述原因?

string对象时恒定不变的,stringBuider对象表示的字符串是可变的。

对于简单的字符串连接操作,在性能上stringBuilder并不一定总是优于string。因为stringBuider对象创建代价较大,在字符串目标连接较少的情况下,过度滥用stringBuilder会导致性能的浪费,只有大量的或者无法预知次数的字符串操作,才考虑stringBuilder来实现。事实上,一般连接次数设置100次以内,根本看不出两者的性能差别。

能不能写一个类继承String这个类?

不能,String是final修饰的类,final类型的不可以被继承

有没有一个List集合的实现类的特点是线程安全,但是效率比Vector要高?说明他效率高的原因?

ArrayList:

底层数据结构是数组的形式,满足数组结构的特点:查询快,增删慢

从线程安全问题来看:线程不安全的,不同步,执行效率高

Vector:

底层数据结构是数组的形式,查询快,增删慢

从线程角度看:线程安全的类,同步,执行效率低

LinkedList:

底层数据结构是链接列表,特点:查询慢,增删快

从线程角度看:线程不安全的一个类,不同步,执行效率高

重载和重写的区别

Overload是重载的意思,表示在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可,Override是覆盖的意思,也就是重写,它与返回值类型无关,只看参数列表,两者不同主要体现在:目的不同、范围不同、参数不同、多态性不同、返回类型不同。

1、目的不同

overload用于增加程序的可读性(做法不同,但是做的同一事情)。 override用于提供其超级类已经提供的方法的特定实现。

2、范围不同

overload 在相同的类范围内内执行。 override发生在两类具有继承(继承)的关系。

3、参数不同

overload参数必须不同。 override参数必须相同。

接口和抽象类的区别

同:

无法创建对象

都可以创建引用(强制使用多态)

都可以使用Object中的方法

异:

接口中的属性都是公开静态常量

接口中的方法都是公开抽象方法

接口中没有构造方法,没有静态代码块

public,protected,private的区别?

public:表示紧随其后的元素对任何人都是可用的。

private:除了类的创建者和类型的内部方法之外的任何人都不能访问的元素。

protected:作用与private相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员。

List、Set、Map是否都继承自Collection接口?存储特点分别是什么?

List和Set继承自Collection,Map不是。

存储特点:

List及实现类是可变大小的列表 ,适用于按数值索引访问元素

Set集合存储顺序无序,不可以保存重复元素。

Map中以键-值对形式存储数据

ArrayList、LinkedList和Vector之间的区别与联系

ArrayList:

底层数据结构是数组的形式,满足数组结构的特点:查询快,增删慢

从线程安全问题来看:线程不安全的,不同步,执行效率高

Vector:

底层数据结构是数组的形式,查询快,增删慢

从线程角度看:线程安全的类,同步,执行效率低

LinkedList:

底层数据结构是链接列表,特点:查询慢,增删快

从线程角度看:线程不安全的一个类,不同步,执行效率高

ArrayList,Vector的区别:

1.出现版本:

ArrayList(1.2),Vector(1.0),Collection(1.2),也就是说Vector出现的更早(老版本的动态数组,与HashTable一样在jdk1.0)

Vector:elementData,当执行构造方法时候初始化大小为10

ArrayList:调用无参构造(elementData),初始化大小为空

2.初始化策略区别:

Vector在调用无参构造执行后将对象数组初始化为10

ArrayList采用懒加载策略,在构造方法阶段并不初始化对象数组,在第一次添加元素的时候才初始化对象数组(add方法)

3.扩容策略:

ArrayList扩容的时候,新数组大小变为原数组大小的1.5倍

Vector扩容的时候,新数组大小变为原数组的2倍

4.线程安全性:

ArrayList采用异步处理,线程不安全,效率较高

Vector采用在方法上加锁,线程安全,效率较高(即便要使用线程安全的List,也不要用Vector)

5.遍历:

Vector支持较老的迭代器Enumeration

ArrayList不支持

ArrayList,Vector的共同点;

底层均使用数组实现

ArrayList,LinkedList:

LinkedList底层采用双向链表实现,所以不存在扩容,初始化问题,并且add方法没有加锁,所以它和ArrayList一样同为异步实现

ArrayList底层采用数组实现

HashMap和Hashtable TreeMap以及ConcurrentHashMap的区别

1.HashMap不是线程安全

HashMap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。

2.HashTable是线程安全的一个Collection。

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

3.TreeMap和TreeSet一样数据都是有序的使用二叉树排序,而HashMap数据是无序的。 TreeMap是基于红黑树(见注释)实现,HashMap是基于哈希表实现。HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。

4.ConcurrentMap 表现区别:不可以有null键,线程安全,原子操作。

一个ConcurrentHashMap 由多个segment 组成,每个segment 包含一个Entity 的数组。这里比HashMap 多了一个segment 类。该类继承了ReentrantLock 类,所以本身是一个锁。当多线程对ConcurrentHashMap 操作时,不是完全锁住map, 而是锁住相应的segment 。这样提高了并发效率。缺点:当遍历ConcurrentMap中的元素时,需要获取所有的segment 的锁,使用遍历时慢。锁的增多,占用了系统的资源。使得对整个集合进行操作的一些方法(例如 size() 或 isEmpty() )的实现更加困难,因为这些方法要求一次获得许多的锁,并且还存在返回不正确的结果的风险。

Error和Exception的区别

从继承方面来说,Error和Exception都是Throwable的子类。所以从根本上你可以理解他们是差不多的,程序出了问题就抛出。然后一般意义来讲,区别就是Error比Exception更严重,不易通过后续代码处理和修复,不应该被代码catch到的错误。而Exception是指严重程度较轻的程序问题,相较于Error更容易被后续代码处理和修复的,有些需要通过try catch代码处理,有些不建议通过try catch代码处理。

如何在字符流和字节流之间转换?

1:字节输入流转换为字符输入流:

InputStreamReader是字节流向字符流的桥梁,它使用指定的charset读

取字节并将其解码为字符,它使用的字符某某可以由名称指定或显示给定

根据InputStream的实例创建InputStreamReader的方法有4种:

InputStreamReader ( InputSteam in) //根据默认字符某某创建

InputStreamReader ( InputStream in,Charset cs /使用给定字符某某创建

InputStreamReader (InputStream in,CharsetDecoder ded //使用给定字

符某某解码器创建

InputStreamReader ( InputStream in,String charsetName //使用指定字

符某某创建

2:字节输出流转换为字符输出流

OutputStreamWiter是字符流通向字节流的桥梁,它使用指定的charset

将要写入流中的字符编码成字节,它使用的字符某某可以由名称指定或显示

给定,否则将接受默认的字符某某:

根据根据InputStream的实例创建OutputStreamWriter的方法有4种:

OutputStreamWriter ( outputstream out) /根据默认的字符某某创建

OutputStreamWriter ( outputstream out,charset cs)使用给定的字符某某创键

int和Integer的区别,什么是自动装箱和自动拆箱

1.Integer是int的包装类,int则是java的一种基本数据类型。

2.Integer变量必须实例化后才能使用,int则不需要。

3.Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。

4.Integer的默认值为null,int的默认值是0。

5.int等基本类型的变量存储在栈中。

(1)int和int比较:

int直接存储的数据值,因此直接比较值即可。

(2)int和Integer的比较:

Integer和int比较的时候自动拆箱,这是比较值即可。

(3)Integer和Integer的比较:

Integer是包装类型,是Object对象,因此==比较的是Integer指向的内存地址。然而-128~127直接的Integer数据直接缓存进入常量池,所以这个区间的比较返回true,其他区间返回false。当然,new的Integer对象不适用。

6、自动装箱和自动拆箱:

基本数据类型包括byte,char,short,int,long,float,double,boolean,对应的包装类型有Byte,Character,Short,Integer,Long,Float,Double,Boolean类型。基本类型变为包装类型就是自动装箱,反之就是自动拆箱,下面是具体场景。

14.创建线程的方式有哪些

通过实现Runnable接口来创建Thread线程

通过实现Callable接口来创建Thread线程

通过Callable和Future创建线程

15 synchronized 和 lock的区别

两者区别:

1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;

2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;

3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;

4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;

5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)

6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

16.wait和sleep的区别

线程sleep 和wait 的区别:

1、这两个方法来自不同的类分别是Thread和Object

2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

5、sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行。wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者。

17.线程池的作用

在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程

第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。

第三:提高线程的可管理性。

什么是数据库事务

数据库事务是指一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性

原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中

分页如何实现(Oracle,MySql)

Order:

Select * from (select b.* rownum r from t_book b)where r between 1 and 3

Mysql:

Select * from t_book 1 limit 3

get 和 post处理乱码的方式区别

出现中文乱码主要原因是:前端使用POST或者GET方法传递的参数一般使用浏览器预先设置的编码方式进行编码,中文浏览器一般是使用UTF8或者GBK,英文的一般是ISO编码;而浏览器编码完成后发送给服务器,服务器进行解码的解码方式默认是使用ISO8859-1。这就造成了编码和解码方式不统一的,进而出现了中文乱码的问题。

GET方法是直接把表单中的内容直接放在了URL中进行传值,这种方式进行传参是对用户可见的,这就有了一定的安全隐患,所以,一般这种方法都不会用在对安全性有要求的地方。

POST方法就相对安很多了,POST方法会将参数放入HTTP请求报文的实体部分,对用户来讲是不可见的。

一,get请求参数中文乱码的解决办法

修改tomcat默认的编码方式为"UTF-8"

在tomcat的server.xml里把

二,post请求参数中文乱码的解决办法

对于post请求,请求中问乱码的两种解决办法,就喜闻乐见了。一般也不会有post请求参数中文乱码吧,任何一个java的web项目应该都配置了字符某某过滤器。

(1): request.setCharacterEncoding("UTF-8");

(2):

字符某某过滤器

encodingFilter

org.springframework.web.filter.CharacterEncodingFilter

字符某某编码

encoding

UTF-8

encodingFilter

/*

21说一下数据库优化有哪些常见的方案(sql优化 缓存 读写分离)

1.索引优化。

2.添XX询缓存。

3.优化数据库SQL语句。

4.数据库Cluster。

22.说一下sql优化常见的做法有哪些

1.索引优化。

2.添XX询缓存。

3.优化数据库SQL语句。

4.数据库Cluster。

23.什么是数据库索引,有什么用,创建索引的语法是什么?

1.作用

加快以索引字段为条件的查询效率。

2.创建索引

create index idx名字 on 表(字段)

3.删除索引

drop index idx名字

4.查询某张表创建了哪些索引

Show index from 表名;

5.特点

①索引会占用存储空间,比较少。

②MySQL会自动为primary 列和unique 列自动增加索引。

③MySQL数据库对数据做DML操作时,需要同时做维护索引的操作。

隐含之意,就是索引会降低数据库增删改的效率。

6.使用原则:

一般会对sql中的where条件字段或者order by字段建立索引。

如何判断一条sql能不能使用到索引?(执行计划 需要能够写出 执行计划的关键字)

Explain SQL语句

自连接和左连接有什么区别

相同点:

都是通过外键合并两张表中对应的数据

不同点:

内连接通过外键连接的那张表中没有与之对应的数据,直接 内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 方式请求,那么POST方式请求是一定支持的。

什么是hystrix?断路器是如何生效的?

Hystrix,断路器。

什么是hystrix?

Hystrix是由Netflix开源的一个服务隔离组件,通过服务隔离来避免由于依赖延迟、异常,引起资源耗尽导致系统不可用的解决方案。

断路器是如何生效的?

当请求一直没有响应时,就会启动断路器

什么是配置中心,有什么用?SpringBoot中两种配置文件分别是什么(bootstrap和 application)

作用:

对配置文件统一管理

SpringBoot中两种配置文件分别是什么:

Bootstrap

Application

什么是zuul?两种路由的配置方式分别是什么?有什么区别

什么是zuul?(网关)

Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能

路由配置

是指配置某请求路径路由到指定的目的地址;

路由规则

是指匹配到路由配置之后,再进行自定义的规则判断,规则判断可以更改路由目的地址

[文章尾部最后500字内容到此结束,中间部分内容请查看底下的图片预览]请点击下方选择您需要的文档下载。

  1. 查理和巧克力工厂阅读测试
  2. 外部消防栓系统
  3. 英语期末测试
  4. 英语重点句式
  5. 七年级上册初中单词
  6. 英语周末练习
  7. 关于疫情的英语作文
  8. 英语书信类作文范文
  9. U3T1 SA王静
  10. A--Unit 9 知识点 课时练习(无答案)
  11. 高考英语全国卷短文改错考点分析及真题汇总(附答案)
  12. 基础面试题
  13. 时态复习公开课当堂练习-初中英语中考时态复习课件

以上为《基础面试题》的无排版文字预览,完整格式请下载

下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

图片预览