以下为《基础面试题》的无排版文字预览,完整格式请下载
下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。
同步锁/读写锁
多个读者可以同时进行读
写者必须互斥(只允许一个写者写,也不能读者写者同时进行)
写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
互斥锁特点:
一次只能一个线程拥有互斥锁,其他线程只有等待
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字内容到此结束,中间部分内容请查看底下的图片预览]请点击下方选择您需要的文档下载。
以上为《基础面试题》的无排版文字预览,完整格式请下载
下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。