是的,一切都会成为过去;
没关系,一切都还来得及;
都过去了,算了吧。
1.面向对象的特征有哪些方面?
封装,继承,多态
2.访问修饰符public protected default(不写默认) private区别?
类内部 | 本包 | 子类 | 外部包 | |
public | ✅ | ✅ | ✅ | ✅ |
protected | ✅ | ✅ | ✅ | ❌ |
default | ✅ | ✅ | ❌ | ❌ |
private | ✅ | ❌ | ❌ | ❌ |
3.String是最基本的数据类型吗?
不是 String是一个类(Java编程语言中的字符串)
4.float f = 3.4是否正确?
不正确 精度不够准确
应该强制类型转换float f = (float)3.4或者float f = 3.4f
没小数点默认是int,有小数点默认是double
5.short s1 =1;s1 =s1+1;有错吗?short s1 =1 ;s1+=1;有错吗?
s1=s1+1有错,其类型是int类型不能用short类型接收(类型转换错误)
s1+=1正确,+=是Java语言规定的运算符,编译器自动进行了隐式类型转换
6.Java有没有goto?
是java语言中的保留字,目前Java中还没有使用。C语言使用
7.int和integer有什么区别?
integer | int |
是int的包装类 | 基本数据类型 |
必须实例化 | 不用实例化 |
是对象的引用 | 直接存储数据值 |
默认值为null | 默认值为0 |
8.&和&&的区别?
& 不管前面的条件是否正确,后面都会执行
&& 前面条件正确时,才执行后面。前面条件不正确时,后面不执行。效率更好
同理|和||
9.解释内存中的栈(stack),堆(heap)和静态区(static area)的用法?
stack:只保存基本数据类型的对象和自定义对象的引用(不是对象),都是私有的。
heap:存储的都是对象,只存放对象本身。只有一个堆区被所有线程共享
静态区:包含所有的class和static变量,都是在整个程序中永远唯一的元素
String str = new String("hello");
str放在栈上,用new创建出来的字符串放在堆上,hello放在静态区上
10.Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
12 -11
11.switch是否能作用在 byte上,是否能作用在long上,是否能作用在String上?
int byte short char都可以,对应的包装类型也可以
long double float boolean不可以(包括他们的包装类型)
JDK1.7之后可以用String类型
12.用最有效率的方法计算2乘以8
2<<3
13.数组有没有length()方法?String有没有length()方法?
数组没有length(),只有size属性
String有length()方法
14、在Java中,如何跳出当前的多重嵌套循环?
在最外层循环定义一个标号,想跳出直接break该标号即可
15、构造器(constructor)是否可被重写(override)?
构造器不能被继承,所以不能被重写,但是可以被重载。
16、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对 如果满足(x.equals(y) == true)那么他们的hashcode一定相同
17、是否可以继承String类?
不可以 因为String有final修饰符,所以不能被继承。
18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
Java只有值传递参数,对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
19、String和StringBuilder、StringBuffer的区别?
运行速度:StringBuilder>StringBuffer>String
StringBuilder和StringBuffer类的对象能够被多次操作,并不产生新的未使用对象,适合对字符串频繁的修改
StringBuffer是线程安全的 StringBuiler是线程不安全的
20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
重写:方法名 参数 列表 返回值相同,内容不一样。
重载:方法名相同,参数类型个数数序至少有一个不相同的
不能,因为调用时不能指定类型信息,编译器不知道你要调用哪个函数
21、描述一下JVM加载class文件的原理机制?
1.装载:查找和导入class文件
2.连接:检查载入的class文件数据的正确性
为类的静态变量分配存储空间
将符号引用转换成直接引用(可选)
3.初始化静态变量,静态代码块
22、char 型变量中能不能存贮一个中文汉字,为什么?
用来存储unicode编码的,汉字包含在unicode编码中,所以可以存储汉字。但如果unicode不包含某个特殊字符那不能存储这个汉字。占2个字节。
23、抽象类(abstract class)和接口(interface)有什么异同?
抽象类可以有构造方法,方法体;接口没有构造方法,不能有方法体。
抽象类可以继承一个类或实现多个接口;接口只可以实现一个或多个接口
抽象类可以做方发声明,也可以做方法实现;接口只能做方发声明
24、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
静态嵌套类的实例话对象不能也无法绑定外围类的实例话对象
内部类的实例话对象需要绑定一个外围类的实例话对象
25、Java 中会存在内存泄漏吗,请简单描述。
理论上有垃圾回收机制不会存在,但是确实存在
比如创建了一个对象,以后一直不在使用这个对象,这个对象却一直被引用。即这个对象无用但是却无法被垃圾回收器回收
26、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
都不能
抽象的方法需要子类重写,静态方法无法被重写。二者矛盾
本地方法是由本地代码实现的方法,抽象方法是没有实现的。所以矛盾
synchronized和方法实现的细节有关,抽象方法不涉及实现细节,矛盾!
27、阐述静态变量和实例变量的区别。
静态变量是所有对象共有的,某一个对象将它的值改变了,其他对象再获取它的值,得到的是改变后的值
实例变量则是每个对象私有的,某一个对象将它的值改变了,不影响其他对象取值的结果,其他对象仍会得到实例变量一开始就被赋予的值。
28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
不可以,因为非static方法是要与对象关联一起的,必须创建一个对象后。才可以在该对象进行方法调用,而static方法调用时不需要创建对象,可以直接调用
29、如何实现对象克隆?
实现Cloneable接口并重写object类中的clone()方法
实现Serializable接口,通过对象的序列化和反序列化。实现真正的深度克隆
30、String s = new String("xyz");创建了几个字符串对象?
两个
new一个String对象,需要现在字符串常量中查找相同的值或创建一个字符串常量。然后再在内存中创建一个String对象
31、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
都可以
32、一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制?
可以包含多个类,但只允许有一个public类 ,并且类名跟文件名一致
因为每个编译单元只能有一个公开的接口,由public表示
33、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
匿名内部类必须借助一个类或一个接口,从上方面说它是可以继承其他类或实现接口的。但若是通过extends或implements关键字是不可能的
34、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?
可以 如果不是静态内部类,没有限制!
35、Java 中的final关键字有哪些用法?
修饰变量(不可改变) 参数(不可被修改) 方法(不可被覆盖) 类(不可被继承)
36、数据类型之间的转换:
低级到高级的自动类型转换
高级到低级的强制类型转换
基本类型向类类型转换
类类型向字符串转换
基本类型向字符串类型转换
37、如何实现字符串的反转及替换?
用StringBuffer,调用reverse方法可实现反转 replace方法替换
38、怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
String result = new String(s.getBytes("GB2312"),"iso-8859-1");
39、日期和时间:
40、打印昨天的当前时刻。
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(cal.getTime());
41、比较一下Java和JavaSciprt。
Java 面向对象; JavaSciprt基于对象
Java必须编译;JavaSciprt由浏览器解释执行
Java强类型变量,编译之前必须声明;JavaSciprt弱类型变量,变量在使用前不需作声明,而是解释器在运行时检查其数据类型;
代码格式不一样
42、什么时候用断言(assert)?
如果希望在不满足某些条件时阻止代码的执行的时候
43、Error和Exception有什么区别?
Error 是不可控制的,用来表示系统错误或底层资源的错误,系统级错误
Exception可以是可控制也可以是不可控制,由程序员导致的错误,应用程序级被处理
44、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?
Finally里的代码会执行 再执行完try后执行 在return之前
45、Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?
Try用来执行一段代码
Catch紧跟在try后面,用来指定想要捕获的异常
Finally不管发生什么异常都要被执行
Throw明确地抛出一个异常
Throws用来声明一个方法可能抛出的各种异常
46、运行时异常与受检异常有何异同?
运行时异常不用必须作出处理
受检异常必须处理捕获抛出
47、列出一些你常见的运行时异常?
ClassNotFoundException
FileNotFoundException
ClassCaseException
IOException
NullPointerException
SQLException
48、阐述final、finally、finalize的区别。
Final用于声明属性 方法和类
finally异常处理的一部分,try/catch语句中使用
finalize是object类的一个方法
50、List、Set、Map是否继承自Collection接口?
Map 不是
51、阐述ArrayList、Vector、LinkedList的存储性能和特性。
Arraylist实现长度可变的数组,内存中分配连续的空间,遍历元素和随机访问元素效率比较高(查)
Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。
linkedList链表示存储方式,增加删除修改时效率比较高(增删改)
52、Collection和Collections的区别?
Collection是一个接口
Collections是集合类的一个包装工具帮助类,提供一系列静态方法,用于对集合中元素的操作
53、List、Map、Set三个接口存取元素时,各有什么特点?
List有先后顺序的集合
Map键到值的映射,不能有重复的key
Set不允许有重复的元素
54、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
TreeMap和TreeSet在排序比较元素要求元素对象必须实现Comparable接口
Collections工具类中的sort()方法:1.实现Comparable接口
2. 自定义比较器,创建比较器实现接口
55、Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
Sleep()调用此方法会让当前线程暂停执行指定的时间,将执行机会给其他线程。但是对象的锁依然保持,等时间结束后自动恢复。
Wait()调用后当前线程放弃对象的锁,进入对象的等待池,调用notify或者notifyall才可唤醒。
56、线程的sleep()方法和yield()方法有什么区别?
sleep()方法和yield()方法都是Thread类的静态方法,都会使当前处于运行状态的线程放弃CPU,把运行机会让给别的线程。两者的区别在于:
sleep()方法会给其他线程运行的机会,不考虑其他线程的优先级,因此会给较低优先级线程一个运行的机会;yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会。
当线程执行了sleep(long millis)方法,将转到阻塞状态,参数millis指定睡眠时间;当线程执行了yield()方法,将转到就绪状态。
sleep()方法声明抛出InterruptedException异常,而yield()方法没有声明抛出任何异常。
sleep()方法比yield()方法具有更好的可移植性。
57、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
不能,一个对象的一个synchronized方法只能由一个线程访问。
58、请说出与线程同步以及线程调度相关的方法。
-wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
-sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
-notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;
-notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;
59、编写多线程程序有几种实现方式?
继承Thread类实现多线程
实现Runnable接口方式实现多线程
使用ExecutorService、Callable、Future实现有返回结果的多线程
60、synchronized关键字的用法?
修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象(这里是指同一对象);
修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
61、举例说明同步和异步。
同步:发送一个请求,等待返回,然后再发送下一个请求
异步:发送一个请求,不等待返回,随时可以再发送下一个请求
62、启动一个线程是调用run()还是start()方法?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
63、什么是线程池(thread pool)?
线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。
64、线程的基本状态以及状态之间的关系?
基本状态:就绪、阻塞和运行三种基本状态。
就绪状态,指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;
运行状态,指线程占有处理机正在运行;
阻塞状态,指线程在等待一个事件(如信号量),逻辑上不可执行。
65、简述synchronized 和java.util.concurrent.locks.Lock的异同?
Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个接口,通过这个类可以实现同步访问;
Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。
66、Java中如何实现序列化,有什么意义?
实现Serializable接口
序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)
67、Java中有几种类型的流?
字节流 字符流 输入流 输出流
68、写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。
int count=0;
StringBuilder sb=new StringBuilder(5000);//将整个文件作为字符串存放在程序内
//建立流读取文件
BufferedReader br=new BufferedReader(new FileReader(fileName));
String s="";//临时存放读取的一行
while((s=br.readLine())!=null){
sb.append(s);
}
//split()方法返回以参数为分隔符的数组,那么数组的大小就是分隔符的个数+1
count=sb.toString().split(str).length-1;
return count;
69、如何用Java代码列出一个目录下所有的文件?
public class IODemo01
{
public static void main(String[] args)
{
File file = new File("E:"+File.separator);
list(file);
}
public static void list(File file)
{
if(file.isDirectory())//判断file是否是目录
{
File [] lists = file.listFiles();
if(lists!=null)
{
for(int i=0;i { list(lists[i]);//是目录就递归进入目录内再进行判断 } } } System.out.println(file);//file不是目录,就输出它的路径名,这是递归的出口 } } dtd文档类型定义和schema模式 本质区别:schema本身是xml的,可以被XML解析器解析 DOM解析 SAX解析 JDOM解析 DOM4J解析 数据交换和信息配置 1)加载(注册)数据库驱动(到JVM)。 2)建立(获取)数据库连接。 3)创建(获取)数据库操作对象。 4)定义操作的SQL语句。 5)执行数据库操作。 6)获取并操作结果集。 7)关闭对象,回收数据库资源(关闭结果集-->关闭数据库操作对象-->关闭连接)。 PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。 作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数 要提升读取数据的性能,可以通过结果集(ResultSet)对象的setFetchSize()方法指定每次抓取的记录数(典型的空间换时间策略);要提升更新数据的性能可以使用PreparedStatement语句构建批处理,将若干SQL语句置于一个批处理中执行。 为了提升系统访问数据库的性能,可以事先创建若干连接置于连接池中,需要时直接从连接池获取,使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销,这是典型的用空间换取时间的策略(浪费了空间存储连接,但节省了创建和释放连接的时间)。 就是后台数据进行的数据库操作,就是dao层里做的只是和数据库相关的内容。增删改查 原子性 整个事务是不可分割的,要么全部成功,要么全部回滚 一致性 无论多少个线程操作数据库跟一个线程操作的结果必须相同 隔离性 事务跟事务之间互不影响 持久性 必须支持提交(持久化),一旦commit()则不会再修改 Jdbc,事务操作默认是自动提交。可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交。倘若其中一个表达式操作失败,都不会执行到commit() Blob是指大二进制对象,而Clob是指大字符对象。JDBC的PreparedStatement和ResultSet都提供了相应的方法来支持Blob和Clob操作。 在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。 ava中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作 类型.class 对象.getClass() Class.forName(), 通过类对象调用newInstance()方法,例如:String.class.newInstance() 通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance("Hello"); 可以通过类对象的getDeclaredField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true)将其设置为可以访问,接下来就可以通过get/set方法来获取/设置字段的值了。 Method m = str.getClass().getMethod("toUpperCase"); 单一职责原则 开闭原则 依赖倒转原则 里氏替换原则 接口隔离原则 合成聚合复用原则 迪米特法则 23种设计模式 工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作(多态方法)。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。 public class Singleton { private Singleton(){} private static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } } 用来对软件密集系统进行可视化建模的一种语言。UML为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言。 用例图 静态图 交互图 行为图 实现图 见https://blog.csdn.net/Hanjiangdudiao11/article/details/81095318 见https://blog.csdn.net/Hanjiangdudiao11/article/details/81095318 Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet。 Init service destroy getServletInfo getServletConfig forward:转发页面和转发到的页面可以共享request里面的数据. 效率高。一般用于用户登陆的时候,根据角色转发到相应的模块.效率低 Page指的是JSP被翻译成Servlet的对象的引用. pageContext对象可以用来获得其他8个内置对象,还可以作为JSP的域范围对象使用.pageContext中存的值是当前的页面的作用范围》 request代表的是请求对象,可以用于获得客户机的信息,也可以作为域对象来使用,使用request保存的数据在一次请求范围内有效。 Session代表的是一次会话,可以用于保存用户的私有的信息,也可以作为域对象使用,使用session保存的数据在一次会话范围有效 Application:代表整个应用范围,使用这个对象保存的数据在整个web应用中都有效。 Response是响应对象,代表的是从服务器向浏览器响应数据. Out:JSPWriter是用于向页面输出内容的对象 Config:指的是ServletConfig用于JSP翻译成Servlet后 获得Servlet的配置的对象. Exception:在页面中设置isErrorPage=”true”,即可使用,是Throwable的引用.用来获得页面的错误信息。 get是从服务器上获取数据,post是向服务器传送数据。 Jetty nginx tomcat apache JSP可以被看作一个特殊的Servlet,它只不过是对Servlet的扩展,只要是JSP能够完成的工作,使用Servlet都可以完成,例如生成动态的页面。由于JSP页面最终要被转换成Servlet来运行,因此处理请求实际上是编译后的Servlet。 对象作用域从小到大顺序如下:pageContext----request----session----application。 (1)pageContext:页面域 页面作用域仅限于当前页面对象,可以近似于理解为java的this对象,离开当前JSP页面(无论是redirect还是forward),则pageContext中的所有属性值就会丢失。 (2)request:请求域 请求作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。如果通过redirect方式进行页面跳转,由于redirect相当于重新发出的请求,此种场景下,request中的属性值会丢失。 (3)session:会话域 会话作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。 (4)application: 应用域 应用作用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享。 <%@ page isThreadSafe=”false” %> 1).隐藏表单域:,非常适合步需要大量数据存储的会话应用。 3).Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP 可以实现代码的定向执行和预处理。 可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。 在客户端的请求访问后端资源之前,拦截这些请求。 在服务器的响应发送回客户端之前,处理这些响应。 编写java类实现Filter接口,并实现其doFilter方法。 是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控。 首先需要创建一个监听器,实现某种接口, 监听器(listener)、过滤器(filter)、Servlet、相关参数、会话超时时间、安全验证方式、错误页面等 使用标签库的好处包括以下几个方面: 编写一个Java类实现实现Tag/BodyTag/IterationTag接口(开发中通常不直接实现这些接口而是继承TagSupport/BodyTagSupport/SimpleTagSupport类,这是对缺省适配模式的应用),重写doStartTag()、doEndTag()等方法,定义标签要完成的功能 pageContext、initParam(访问上下文参数)、param(访问请求参数)、paramValues、header(访问请求头)、headerValues、cookie(访问cookie)、applicationScope(访问application作用域)、sessionScope(访问session作用域)、requestScope(访问request作用域)、pageScope(访问page作用域)。 算术运算符:+、-、*、/或div、%或mod Model 1是以页面为中心的Java Web开发,使用JSP+JavaBean技术将页面显示逻辑和业务逻辑处理分开,JSP实现页面显示,JavaBean对象用来保存数据和实现业务逻辑。 Model 2是基于MVC(模型-视图-控制器,Model-View-Controller)架构模式的开发模型,实现了模型和视图的彻底分离,利于团队开发和代码复用, 如果一个任务处理时间相当长,那么Servlet或Filter会一直占用着请求处理线程直到任务结束,随着并发用户的增加,容器将会遭遇线程超出的风险,这种情况下很多的请求将会被堆积起来而后续的请求可能会遭遇拒绝服务,直到有资源可以处理请求为止。异步特性可以帮助应用节省容器中的线程,特别适合执行时间长而且用户需要得到结果的任务,如果用户不需要得到结果则直接将一个Runnable对象交给Executor并立即返回即可。 HTML的元素有一个method属性,用来指定提交表单的方式,其值可以是get或post。我们自定义的Servlet一般情况下会重写doGet()或doPost()两个方法之一或全部,如果是GET请求就调用doGet()方法,如果是POST请求就调用doPost()方法 1、<%@include file="xxx.jsp"%>为jsp中的编译指令,其文件的包含是发生在jsp向servlet转换的时期,而 2、使用静态包含只会产生一个class文件,而使用动态包含会产生多个class文件 3、使用静态包含,包含页面和被包含页面的request对象为同一对象,因为静态包含只是将被包含的页面的内容复制到包含的页面中去;而动态包含包含页面和被包含页面不是同一个页面,被包含的页面的request对象可以取到的参数范围要相对大些,不仅可以取到传递到包含页面的参数,同样也能取得在包含页面向下传递的参数 可以通过请求对象(HttpServletRequest)的getParameter()方法通过参数名获得参数值。如果有包含多个值的参数(例如复选框),可以通过请求对象的getParameterValues()方法获得。当然也可以通过请求对象的getParameterMap()获得一个参数名和参数值的映射(Map)。 可以通过重写Servlet接口的init(ServletConfig)方法并通过ServletConfig对象的getInitParameter()方法来获取Servlet的初始化参数。 可以通过ServletConfig对象的getServletContext()方法获取ServletContext对象,并通过该对象的getInitParameter()方法来获取服务器上下文参数。当然,ServletContext对象也可以在处理用户请求的方法(如doGet()方法)中通过请求对象的getServletContext()方法来获得。 请求对象(ServletRequest)的setCharacterEncoding(String)方法可以设置请求的编码,其实要彻底解决乱码问题就应该让页面、服务器、请求和响应、Java程序都使用统一的编码,最好的选择当然是UTF-8;通过响应对象(ServletResponse)的setContentType(String)方法可以设置响应内容的类型,当然也可以通过HttpServletResponse对象的setHeader(String, String)方法来设置。 B/S、C/S、P2P。其中B代表浏览器(Browser)、C代表客户端(Client)、S代表服务器(Server),P2P是对等模式,不区分客户端和服务器 基于HTTP协议传输数据,这使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。 • 瞬时态:当new一个实体对象后,这个对象处于瞬时态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被JVM的垃圾回收机制回收。这个对象所保存的数据与数据库没有任何关系,除非通过Session的save()、saveOrUpdate()、persist()、merge()方法把瞬时态对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久态对象。 • 持久态:持久态对象的实例在数据库中有对应的记录,并拥有一个持久化标识(ID)。对持久态对象进行delete操作后,数据库中对应的记录将被删除,那么持久态对象与数据库记录不再存在对应关系,持久态对象变成移除态(可以视为瞬时态)。持久态对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。 • 游离态:当Session进行了close()、clear()、evict()或flush()后,实体对象从持久态变成游离态,对象虽然拥有与数据库对应记录一致的持久化标识值,但是因为对象已经从会话中清除掉,对象不在持久化管理之内,所以处于游离态(也叫脱管态)。游离态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。 例如:商品和订单、学生和课程都是典型的多对多关系。可以在实体类上通过@ManyToMany注解配置多对多关联或者通过映射文件中的和标签配置多对多关联,但是实际项目开发中,很多时候都是将多对多关联映射转换成两个多对一关联映射来实现的。 继承关系的映射策略有三种: #将传入的数据都当成一个字符串,会对传入的数据自动加上引号; $将传入的数据直接显示生成在SQL中 注意:使用 $ 占位符可能会导致SQL注入攻击,能用#的地方就不要使用 $ 在大型项目中,可能存在大量的SQL语句,这时候为每个SQL语句起一个唯一的标识(ID)就变得并不容易了。为了解决这个问题,在MyBatis中,可以为每个映射文件起一个唯一的命名空间,这样定义在这个映射文件中的每个SQL语句就成了定义在这个命名空间中的一个ID。只要我们能够保证每个命名空间中这个ID是唯一的,即使在不同映射文件中的语句ID相同,也不会再产生冲突了。 在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体的业务逻辑来拼接不同的SQL语句。 IoC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠释。控制反转是把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。DI是对IoC更准确的描述,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。 Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。 singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例 prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例 request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效 session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效 globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。 AOP(Aspect-Oriented Programming)指一种程序设计范型,该范型以一种称为切面(aspect)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)。 "横切关注"是会影响到整个应用程序的关注功能,它跟正常的业务逻辑是正交的,没有必然的联系,但是几乎所有的业务逻辑都会涉及到这些关注功能。通常,事务、日志、安全性等关注就是应用中的横切关注功能。 a. 连接点(Joinpoint):程序执行的某个特定位置(如:某个方法调用前、调用后,方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring仅支持方法的连接点。 b. 切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。 c. 增强(Advice):增强是织入到目标类连接点上的一段程序代码。 d. 引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。 e. 织入(Weaving):织入是将增强添加到目标类具体连接点上的过程,AOP有三种织入方式:①编译期织入:需要特殊的Java编译器(例如AspectJ的ajc);②装载期织入:要求使用特殊的类加载器,在装载类的时候对类进行增强;③运行时织入:在运行时为目标类生成代理实现增强。Spring采用了动态代理的方式实现了运行时织入,而AspectJ采用了编译期织入和装载期织入的方式。 f. 切面(Aspect):切面是由切点和增强(引介)组成的,它包括了对横切关注功能的定义,也包括了对连接点的定义。 1. no:这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。 2. byName:该选项可以根据bean名称设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。 3. byType:该选项可以根据bean类型设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。 4. constructor:造器的自动装配和byType模式类似,但是仅仅适用于与有构造器相同参数的bean,如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。 5. autodetect:该模式自动探测使用构造器自动装配或者byType自动装配。 首先需要在Spring配置文件中增加如下配置: 然后可以用@Component、@Controller、@Service、@Repository注解来标注需要由Spring IoC容器进行对象托管的类。这几个注解没有本质区别,只不过@Controller通常用于控制器,@Service通常用于业务逻辑类,@Repository通常用于仓储类(例如我们的DAO实现类),普通的类用@Component来标注。 每个Bean都有一个代理 所有Bean共享一个代理基类 使用拦截器 使用tx标签配置的拦截器 全注 自定义要使用的IoC容器而不使用默认的XmlApplicationContext容器: 1 2 3 4 将IoC容器加载到Web容器中: 1 2 3 org.springframework.web.context.ContextLoaderListener 4 class> 5 要使用Spring MVC需要在Web项目配置文件中web.xml中配置其前端控制器DispatcherServlet 1.客户端发送请求 2.dispatcherServlet接收并分析得到HandlerMapping 3. dispatcherServlet根据得到的Handler对象,选择一个合适的HandlerAdapter,创建其对象 4.执行Handler 5.返回一个ModelAndView对象给DispatcherServlet 6.DispatcherServlet通过ViewResolver视图解析器将逻辑视图转化为真正的视图 7.DispatcherServlet通过Model将ModelAndView中得到的处数据解析后用于渲染视图,通过http响应返回客户端 class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
1. IoC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归测试。有了IoC容器,程序员再也不需要自己编写工厂、单例,这一点特别符合Spring的精神“不要重复的发明轮子”。 2. AOP:面向切面编程,将所有的横切关注功能封装到切面(aspect)中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑和系统服务之间的分离。另一方面,有了AOP程序员可以省去很多自己写代理类的工作。 3. MVC:Spring的MVC框架是非常优秀的,从各个方面都可以甩Struts 2几条街,为Web表示层提供了更好的解决方案。 4. 事务管理:Spring以宽广的胸怀接纳多种持久层技术,并且为其提供了声明式的事务管理,在不需要任何一行代码的情况下就能够完成事务管理。 1.通过全类名(反射) 2.通过工厂方法(静态工厂方法&实例工厂方法) 3.FactoyBean ① Spring IoC容器找到关于Bean的定义并实例化该Bean。 ② Spring IoC容器对Bean进行依赖注入。 ③ 如果Bean实现了BeanNameAware接口,则将该Bean的id传给setBeanName方法。 ④ 如果Bean实现了BeanFactoryAware接口,则将BeanFactory对象传给setBeanFactory方法。 ⑤ 如果Bean实现了BeanPostProcessor接口,则调用其postProcessBeforeInitialization方法。 ⑥ 如果Bean实现了InitializingBean接口,则调用其afterPropertySet方法。 ⑦ 如果有和Bean关联的BeanPostProcessors对象,则调用这些对象的postProcessAfterInitialization方法。 ⑧ 当销毁Bean实例时,如果Bean实现了DisposableBean接口,则调用其destroy方法 可以在定义Bean属性时,通过
70、用Java的套接字编程实现一个多线程的回显(echo)服务器。
71、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
72、你在项目中哪些地方用到了XML?
73、阐述JDBC操作数据库的步骤。
74、Statement和PreparedStatement有什么区别?哪个性能更好?
75、使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?
76、在进行数据库编程时,连接池有什么作用?
77、什么是DAO模式?
78、事务的ACID是指什么?
79、JDBC中如何进行事务处理?
80、JDBC能否处理Blob和Clob?
81、简述正则表达式及其用途。
82、Java中是如何支持正则表达式操作的?
83、获得一个类的类对象有哪些方式?
84、如何通过反射创建对象?
85、如何通过反射获取和设置对象私有字段的值?
86、如何通过反射调用对象的方法?
87、简述一下面向对象的"六原则一法则"。
88、简述一下你了解的设计模式。
- 代理模式:给一个对象提供一个代理对象,并由代理对象控制原对象的引用。实际开发中,按照使用目的的不同,代理可以分为:远程代理、虚拟代理、保护代理、Cache代理、防火墙代理、同步化代理、智能引用代理。
- 适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起使用的类能够一起工作。
- 模板方法模式:提供一个抽象类,将部分逻辑以具体方法或构造器的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法(多态实现),从而实现不同的业务逻辑。
89、用Java写一个单例类。
90、什么是UML?
91、UML中有哪些常用的图?
92、用Java写一个冒泡排序。
93、用Java写一个折半查找。
94、阐述Servlet和CGI的区别?
95、Servlet接口中有哪些方法?
96、转发(forward)和重定向(redirect)的区别?
redirect:不能共享数据,一般用于用户注销登陆时返回主页面和跳转到其它的网站等
97、JSP有哪些内置对象?作用分别是什么?
98、get和post请求的区别?
在客户端, get方式在通过URL提交数据,数据在URL中可以看到;post方式,数据放置在HTML HEADER内提交
对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
get方式提交的数据最多只能有1024字节,而post则没有此限制
99、常用的Web服务器有哪些?
100、JSP和Servlet是什么关系?
101、讲解JSP中的四种作用域。
102、如何实现JSP或Servlet的单线程模式?
即同一时刻,只能有一个实例,如果有两个请求过来,那么会先执行前面的,后面的只能等待
这种情况,每个请求都会分发一个servlet实例,会造成线程的不安全
103、实现会话跟踪的技术有哪些?
2).URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个
Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至
在客户端计算机重启后它仍可以保留其值。
4).Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话
104、过滤器有哪些作用和用法?
在web.xml 文件中使用
105、监听器有哪些作用和用法?
106、web.xml文件中可以配置哪些内容?
107、你的项目中使用过哪些JSTL标签?
108、使用标签库有什么好处?如何自定义JSP标签?
- 分离JSP页面的内容和逻辑,简化了Web开发;
- 开发者可以创建自定义标签来封装业务逻辑和显示逻辑;
- 标签具有很好的可移植性、可维护性和可重用性;
- 避免了对Scriptlet(小脚本)的使用
编写扩展名为tld的标签描述文件对自定义标签进行部署,tld文件通常放在WEB-INF文件夹下或其子目录中
在JSP页面中使用taglib指令引用该标签库
109、说一下表达式语言(EL)的隐式对象及其作用。
110、表达式语言(EL)支持哪些运算符?
关系运算符:==或eq、!=或ne、>或gt、>=或ge、<或lt、<=或le
逻辑运算符:&&或and、||或or、!或not
条件运算符:${statement? A : B}(跟Java的条件运算符类似)
empty运算符:检查一个值是否为null或者空(数组长度为0或集合中没有元素也返回true)
111、Java Web开发的Model 1和Model 2分别指的是什么?
112、Servlet 3中的异步处理指的是什么?
113、如何在基于Java的Web项目中实现文件上传和下载?
114、服务器收到用户提交的表单数据,到底是调用Servlet的doGet()还是doPost()方法?
115、JSP中的静态包含和动态包含有什么区别?
116、Servlet中如何获取用户提交的查询参数或表单数据?
117、Servlet中如何获取用户配置的初始化参数以及服务器上下文参数?
118、如何设置请求的编码以及响应内容的类型?
119、解释一下网络应用的模式及其特点。
120、什么是Web Service(Web服务)?
121、阐述实体对象的三种状态以及转换关系。
122、举一个多对多关联的例子,并说明如何实现多对多关联映射。
123、谈一下你对继承映射的理解。
① 每个继承结构一张表(table per class hierarchy),不管多少个子类都用一张表。
② 每个子类一张表(table per subclass),公共信息放一张表,特有信息放单独的表。
③ 每个具体类一张表(table per concrete class),有多少个子类就有多少张表。
第一种方式属于单表策略,其优点在于查询子类对象的时候无需表连接,查询速度快,适合多态查询;缺点是可能导致表很大。后两种方式属于多表策略,其优点在于数据存储紧凑,其缺点是需要进行连接查询,不适合多态查询
124、MyBatis中使用#
和$
书写占位符有什么区别?
125、解释一下MyBatis中命名空间(namespace)的作用。
126、MyBatis中的动态SQL是什么意思?
127、什么是IoC和DI?DI是如何实现的?
128、Spring中Bean的作用域有哪些?
129、解释一下什么叫AOP(面向切面编程)?
130、你是如何理解"横切关注"这个概念的?
131、你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?
132、Spring中自动装配的方式有哪些?
133、Spring中如何使用注解来配置Bean?有哪些相关的注解?
134、Spring支持的事务管理类型有哪些?你在项目中使用哪种方式?
135、如何在Web项目中配置Spring的IoC容器?
136、如何在Web项目中配置Spring MVC?
137、Spring MVC的工作原理是怎样的?
138、如何在Spring IoC容器中配置数据源?
140、选择使用Spring框架的原因(Spring框架为企业级开发带来的好处有哪些)?
141、Spring IoC容器配置Bean的方式?
142、阐述Spring框架中Bean的生命周期?
143、依赖注入时如何注入集合属性?/
分别为其注入列表、集合、映射和键值都是字符串的映射属性。