1. 什么是向上转型,向下转型?
向上转型:父类引用指向子类对象。
向下转型:子类对象指向父类引用(强转),先向上转型,在向下转型,没有经过向上转型,会提示编译错误。
2.什么是数组,有什么特点?
数组是一种容器,可以同时存放多个类型相同的数据。
数组是一种引用数据类型,当有多个数据类型必须统一,数组长度在运行期间不可改变长度在创建时给定。
3.什么是集合,和数组的区别?
是Java中提供的一种容器,用来存储多个数据。
数组的长度是固定的,集合的长度是可变的;数组中存储的是同一类型的元素,集合存储的类型可以不一致;
4.你所知道的List有哪些,特点分别是什么?
ArrayList:底层的数据结构是数组,所以查询快,增删慢,线程不安全
LinkList:底层的数据结构是链表,所以查询慢,增删快,线程不安全
Vector:底层的数据结构是数组,查询快,增删慢,线程安全
5.TreeSet是如何排序的?
实现Comparable接口,覆写compareTo()方法,只能对该类的对象进行比较
匿名内部类比较器,Comparator重写compare方法,相当于一个外部比较器
6.Queue有哪些,各有什么特点?
高性能队列ConcurrentLinkedQueue:使用于高并发场景的队列,基于链接结点的无界线程安全队列,先进先出,不允许有null元素
阻塞队列BlockingQueue分为以下五种:
-
ArrayBlockingQueue:基于数组的阻塞队列,也叫有界队列
-
LinkedBlockingQueue:基于链表的阻塞队列,无界队列
-
PriorityBlockingQueue:基于优先级的阻塞队列,优先级的判断通过构造器传入的比较器来决定,是一个无界队列
-
DelayQueue:带有延迟时间的队列,是一个没有大小的队列
-
SynchronousQueue:一种没有缓冲的队列
7.Hashtable和HashMap的区别?
HashTable继承自Dirctionary(一个抽象类,用来存储键值对,作用和map类相似,字典类),HashMap继承自AbstractMap,两者均实现了Map接口;
HashTable线程安全,key和value都不能为空;,HashMap线程不安全,key和value都可以为空;
遍历:HashTable和HashMap两者都实现了Iterator,但是HashTable还是用了Enumeration;
哈希值:HashTable是直接使用对象的hashCode,HashMap是重新计算hash值
8.Vector和ArrayList的区别?
Vector是线程安全的,ArrayList是线程不安全的;
ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍;
9.说出几个IO流对象,各有什么特点?
File:文件类
InputStream:抽象类,字节输入流
OutputStream:抽象类,字节输出流
Reader:抽象类,字符输入流
Writer:抽象类,字符输出流
文件字节输入输出流:FileInputStream,FileOutputStream
文件字符输入输出流:FileReader,File
字节输入输出缓冲流:BufferedInputStream,BufferedOutputStream
字符输入输出缓冲流:BufferedReader,BufferedWriter
10.线程和进程的关系和区别?
线程是进程的基本执行单元,一个进程的所有任务都在线程中执行,进程如果想要执行任务,必须要有线程,进程至少要有一条线程,进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,同一进程的线程共享本进程的地址空间、资源。
11.线程池有哪些,各有什么特点?
newCachedThreadPool:可缓存线程池,线程数量不定
newFixedThreadPool:定长线程池,线程数量固定,当处于闲置状态也不会被回收
newScheduledThreadPool:周期性执行任务的线程池,核心线程数是固定的,非核心线程数是没有限制的,非核心线程闲置时会被立即回收
newSingleThreadExecutor:单线程化的线程池,只有一个核心线程,以无界队列方式来执行该线程,这使得这些任务之间不需要处理线程同步的问题,它确保所有的任务都在同一个线程中按顺序中执行,并且可以在任意给定的时间不会有多个线程是活动的。
12.为什么要使用数据库连接池?
如果没有用连接池,每次发起SQL查询时首先通过TCP协议的三次握手和数据库服务建立连接,然后发送账号密码,验证过后才提交SQL语句执行,执行完毕后再TCP四次挥手最后完成关闭。如果执行多个SQL就会频繁的建立连接然后关闭,如果用连接池就是用空间换时间思想,系统启动预先创建多个数据库连接对象,虽然会占用一定的内存空间,但是可以省去每次SQL查询时创建连接和关闭连接所消耗的时间。
常用的数据库连接池:DBCP,C3P0,阿里的DRUID
13.Socket用的是什么协议,四层协议分别是什么?
TCP/IP协议,Socket用于通信,因此需要可靠的网络协议,UDP是不可靠协议,
应用层:HTTP应用程序间沟通的层
传输层:TCP、UDP这一层负责数据格式化,数据确认和丢失重传(传送数据,并且确定数据已经被送达并接收)
互联网络层:IP负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(邮件的地址)
网络接口层:接收IP数据包并进行传输(送邮件的车)
14.详细说一下三次握手的过程?
所谓的“三次握手”:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。
为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。
15.想要让SQL查询效率高,可以做哪些工作?
16.什么是游标,有哪些分类?
用来存储多条查询数据的一种数据结构(数据集),它有一个指针,从上往下移动,从而能够遍历每条记录。游标就是位于内存中的数据集,加快对数据的操作。牺牲内存,提高sql执行效率
系统游标(隐式游标):系统定义好的游标,一般在做DML操作时自动触发,一般用于看影响行数
用户游标(显式游标):
- 静态游标:创建游标的SQL语句是固定的
- 动态游标:创建游标的SQL语句是动态的,带有参数或变量
17.GET方式和POST方式有哪些区别?
-
GET在浏览器回退时是无害的,POST会在次提交请求
-
GET请求产生的URL地址可以被看到,而POST不可以
-
GET请求会被浏览器主动缓存,而POST不会,除非主动设置
-
GET请求只能进行url编码,而POST支持多种编码方式
-
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
-
GET请求在URL中传送的参数是有长度限制的,而POST没有
-
对参数的数据类型,GET只接受ASCII字符,而POST没有限制
-
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
-
GET参数通过URL传递,POST放在Request body中
-
GEt和POST请求是HTTP协议中的两种请求的方法,底层是TCP/IP。GET产生一个TCP数据包,POST产生两个TCP数据包。对于GET请求浏览器会把http header和data一并发送出去;POST请求会先发送header,服务器响应100 continue,浏览器在发送data;注:据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
18.CSS选择器有哪些?
标签选择器
ID选择器
类选择器
组选择器
通配符选择器
后代选择器
子元素选择器
兄弟选择器
相邻选择器
属性选择器
伪类选择器
19.什么是盒子模型的坍塌?
父子坍塌:父亲没有设置padding border内容时,子元素垂直方向的margin会赋给父亲,父亲最终垂直方向的margin为父子中最大的margin值,并非相加
解决方法:把儿子的margin装换成父亲的padding;或给父元素增加position:absolute
并列元素坍塌:垂直方向相遇的盒子模型,会发生margin坍塌,现象就是元素两者之间的距离并非之和,而是二者之间最大的
解决方法:给第一个元素只设置margin
20.去掉元素的浮动怎么做?
-
为父元素添加overflow:hidden
-
clear:both
-
floatfix类
21.接口和抽象类的区别?
-
都不能被实例化,但是抽象类里可以有构造方法,接口里不能有构造方法
-
接口只有定义,不能有方法的实现,java1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可以在抽象类中实现
-
接口强调特定功能的实现,而抽象类强调所属关系
-
接口成员变量默认为public static final,必须赋值,不能被修改,其所有的成员方法都是public abstract的,抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值,
抽象方法被abstract修饰,不能被private、static、synchrornized和native等修饰。
22.什么是DI和IoC?什么是AOP?
23.什么是本地线程,有什么好处?
线程类Thread有个变量叫做threadLocals,它的类型就是ThreadLocal.ThreadLocalMap类型,key是当前线程的ThreadLocal对象,值就是要保存的数据。每个线程自己的本地变量,在每个线程里面对变量单独记录保存。
在多线程并发执行时,有时需要进行数据共享,所以有了volatile变量解决多线程间的数据可见性,也有了锁的同步机制,使变量或代码在某一时刻,只能被一个线程访问,确保数据共享的正确性。有时不需要数据共享,让每个线程都有自己独立的变量,ThreadLocal就是用于线程间的数据隔离的。
24.数据库事务有哪些特点?
-
原子性:指事务包含的所有操作要么全部成功,要么全部失败回滚
-
一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态
-
隔离性:当多个用户并发访问数据库时,不能被其他事务的操作所干扰
-
持久性:一个事务一旦被提交了,对数据库中的数据的改变就是永久性的
-
脏读:一个事务处理过程中,读取了另一个未提交的事务中的数据
-
不可重复读:对于数据库中的某一条数据在一个事务范围内,多次查询却返回了不同的数据值
-
幻读:事务非独立执行时发生的一种现象,例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
25.数据库有哪些锁?
为了保证数据的一致性,MySQL各存储引擎使用了三种类型的锁机制:表级锁定,行级锁定和页级锁定
-
表级锁:一次会将整个表锁定,可以避免死锁问题,锁定力度大,锁冲突概率高,并发度底,开销小,获取锁和释放锁的速度很快,适用于查询为主,少量更新
-
行级锁:锁定对象的力度小,发生锁冲突概率低,并发度高,但是开销大,加锁慢,行级锁容易发生死锁。适用于对事务完整性要求较高的系统。
InnoDB行级锁类型
- 共享锁:读锁,多个事务对同一数据进行共享一把锁,都能访问到数据,但是只能读不能修改
- 排它锁:写锁,排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制。
- 意向锁是InnoDB自动加的,不需用户干预,意向锁不会与行级的共享/排它锁互斥
- 页面锁:介于行级锁和表级锁之间,会发生死锁,锁定的数据资源比行锁要多,因为一个业种可以有多个行记录,我们使用页锁的时候,会出现数据浪费的现象。
26.什么是视图,视图有什么作用?
存储的查询语句,当调用的时候,产生结果集,视图充当的是虚拟表的角色。
简单:使用视图的用户完全不需要关心后面对应的表的结构,关联条件和筛选条件对用户来说已经是过滤好的复合条件的结果集
安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行,某个列,但是通过视图就可以简单的实现。
数据独立:一旦视图的结构确认了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响,源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响
综上,使用视图的大部分情况是为了保障数据安全性,提高查询效率
27.Servlet是单例还是多例,是否线程安全?如何解决安全问题?
servlet是单例的,严格地说是一个ServletMapping对应一个单例实例(如果一个Servlet被映射了两个URL地址,会生成两个实例)。线程不安全。维护Servlet线程安全通常是使用同步块(或方法)来保护共享数据,其次可以是volatile、Lock一些锁机制,还可以使用ThreadLocal来打通安全通道,另外还有原子操作也是用来保护数据安全
28.Spring是单例还是多例?如何配置?
spring生成的对象默认是单例的,通过scope="prototype"可以更改为多例