Web篇
1.在浏览器输入地址http://www.baidu.com并回车,整个过程发生了什么?
1、DNS解析,将域名解析为IP地址;2、浏览器与服务器建立TCP连接(三次握手);3、浏览器
向服务器发起HTTP请求;4、服务器接收请求并响应,返回相应的HTML文件;5、浏览器接收从
服务器端返回的数据,并进行页面渲染。
2.你常见的content-type有哪些?分别代表什么含义?
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
application/json : JSON数据格式
application/xml : XML数据格式
3.为什么建立HTTP连接需要三次握手,而断开却需要四次握手?
1、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(当然确认信号还是可
以发),就会发FIN给主机B。 2、主机B收到A发送的FIN,表示收到了,就会发送ACK回复。
3、但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而
是等到B数据发送完了,才会发送FIN给主机A。 4、A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL以后,没有收到B传来
的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。
4.get和post请求的区别有哪些?
请求方式 GET POST
参数位置 url的query中 一般在content中,query也可
参数大小 受限于浏览器url大小,一般不超过32K 1G
服务器数据接收 接收1次 根据数据大小,可分多次接收
适用场景(语义) 从服务器端获取数据,不做增删改 向服务器提交数据,如做增删改操作
安全性 参数携带在url中,安全性低 相对于GET请求,安全性更高
Java篇
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的
字节码文件。
2.“static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是
static的方法?
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访
问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静
态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
3.是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时
候,会对stati c变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报
错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
4.Java支持的数据类型有哪些?什么是自动拆装箱?
Java语言支持的8中基本数据类型是:
• byte
• short
• int
• long
• float
• double
• boolean
• char
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转
化成Integer,double转化成double,等等。反之就是自动拆箱。
5.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子
类之间多态性的一种表现,重载O verloading是一个类中多态性的一种表现。如果在子类中定义
某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方
法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。如果在一个类中定义了
多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载
(Overloading)。Overloaded的方法是可以改变返回值的类型。
6.Java支持多继承么?
不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。
7.接口和抽象类的区别是什么?
Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
• 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
• 类可以实现很多个接口,但是只能继承一个抽象类
• 类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的
所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
• 抽象类可以在不提供接口方法实现的情况下实现接口。
• Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
• Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是
public。
• 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法
的话是可以被调用的。
也可以参考JDK8中抽象类和接口的区别
8.什么是值传递和引用传递?
对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对
象的值。
对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所
做的改变会反映到所有的对象上。
9.创建线程有几种不同的方式?你喜欢哪一种?为什么?
有三种方式可以用来创建线程:
• 继承Thread类
• 实现Runnable接口
• 应用程序可以使用Executor框架来创建线程池
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了
别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是
非常高效的,很容易实现和使用。
10.同步方法和同步代码块的区别是什么?
在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。
synchronized关键字可应用在方法级别(粗粒度锁:这里的锁对象可以是This)或者是代码块级别
(细粒度锁:这里的锁对象就是任意对象)。
11.什么是死锁(deadlock)?
两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷
入了无限的等待中。
数据库篇
表结构
Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(Sid,C#,score) 成绩表 Teacher(T#,Tname) 教师表
Sql题1、查询“001”课程比“002”课程成绩高的所有学生的学号; select a.S# from (select s#,score from SC where C#=‘001’) a,(select s#,score from SC where C#=‘002’) b where a.score>b.score and a.s#=b.s#;
2、查询平均成绩大于60分的同学的学号和平均成绩; select S#,avg(score) from sc group by S# having avg(score) >60;
3、查询所有同学的学号、姓名、选课数、总成绩; select Student.S#,Student.Sname,count(SC.C#),sum(score) from Student left Outer join SC on Student.S#=SC.S# group by Student.S#,Sname
4、查询姓“李”的老师的个数; select count(distinct(Tname)) from Teacher where Tname like ‘李%’;
5、查询没学过“叶平”老师课的同学的学号、姓名; select Student.S#,Student.Sname
from Student where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=‘叶平’);
6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名; select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001’and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#=‘002’);
7、查询学过“叶平”老师所教的所有课的同学的学号、姓名; select S#,Sname from Student where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=‘叶平’ group by S# having count(SC.C#)= (select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname=‘叶 平’));
8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名; Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#=‘002’) score2 from Student,SC where Student.S#=SC.S# and C#=‘001’) S_2 where score2 <score;
9、查询所有课程成绩小于60分的同学的学号、姓名; select S#,Sname from Student where S# not in (select S.S# from Student AS S,SC where S.S#=SC.S# and score>60);
10、查询没有学全所有课的同学的学号、姓名; select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
Sql理论
1.什么是数据库事务,事务四大特性是什么?
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性
(Consistency)、隔离性(Isolation)、持久性(Durability)。
2.什么是脏读、幻读、不可重复读?
脏读:读取未提交数据
不可重复读:前后多次读取,数据内容不一致
幻读:前后多次读取,数据总量不一致
3.mysql两个存储引擎innodb和myisam区别是什么?
最主要的区别是:MyISAM表不支持事务、不支持行级锁、不支持外键。 InnoDB表支持事
务、支持行级锁、支持外键。
Spring篇
1.说说你常用的Spring注解,并解释它的作用。
…
2.说说Spring和Spring Boot的区别。
主要是自动化配置,答出这个最重要。
3.说说什么是IOC和AOP。
IOC即控制反转(Inversionof Control)是Spring的核心,即将创建当前类实例的工作的控制权交
给第三来完成并交给spring容器进行管理。
AOP即面向切面编程,可用于抽象具有非业务,以及通用这两大特点的代码统一应用于业务代
码,比如实现统一的日志管理。
Dubbo篇
dubbo是什么?
是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方
案。
如何声明并暴露一个dubbo服务?
…
Zookeeper篇
Zookeeper是什么?
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源
的实现,是Hadoop和Hbase的重要组件。
编程题
请用Java实现一个死锁。
package com.zr.demo.controller; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MainDemo { public static void main(String[] args) { Lock lock1 = new ReentrantLock(); Lock lock2 = new ReentrantLock(); new Thread(new Runnable() { @Override public void run() { lock1.lock(); System.out.println(“线程1开始执行”); try {Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }lock2.lock(); System.out.println(“线程1执行结束”); lock2.unlock(); lock1.unlock(); } }).start(); new Thread(new Runnable() { @Override
public void run() { lock2.lock(); System.out.println(“线程2开始执行”); try {Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }lock1.lock(); System.out.println(“线程2执行结束”); lock1.unlock(); lock2.unlock(); } }).start(); } }
发散题
JAVA中高访问量高并发的问题怎么解决?
- 尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库
的交互,提高性能。 - 用jprofiler等工具找出性能瓶颈,减少额外的开销。
- 优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询
做优化)。 - 优化数据库结构,多做索引,提高查询效率。
- 统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功
能。 - 能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显
示)。 - 解决以上问题后,使用服务器集群来解决单台的瓶颈问题