几道java面试题。
1.数据库中的行转列,列转行。
①.行转列
建立tb_rtc表。
|
|
向该表插入数据。
|
|
在oracle与mysql都可用下面方法翻转:
|
|
UNION与UNION ALL的区别:union与union all 都是查询结果的并集,但是union多了一步去重复数据,所以效率上没union all高,另外union会对查询结果做排序。
②.列转行
建立tb_ctr表。
|
|
向该表插入数据。
|
|
用下面的方法翻转(mysql)。
|
|
用下面的方法可以达到上面相同的结果(mysql)。
|
|
在oracle中可以使用下面的方法。
|
|
③.统计数据
|
|
|
|
2.Spring中IOC和AOP的应用场景。
AOP:
AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,对象池管理、事务管理、日志记录以及缓存。
AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中。AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。
具体应用场景:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
IOC:
通过使用Spring框架,开发人员将不在自己的代码中维护对象之间的依赖关系,只需要在配置文件中进行设定就可以,Spring会自动地依据配置信息来维护对象之间的依赖关系,将被依赖关系的对象设置给依赖对象。
3.抽象类和接口的区别
接口是public,而抽象类是可以有私有方法或私有变量的。
接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
抽象类里可以没有抽象方法。
类单根继承,而接口可以实现多个。
参数 | 抽象类 | 接口 |
---|---|---|
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符。 |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它。 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
4.字符流和字节流的区别
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。
程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
在Java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)
InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象。
Reader和 Writer两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串。
字节流与字符流的区别详解
5.sql递归查询
mysql:
创建表t_areainfo。
|
|
插入测试数据。
|
|
①.向下递归(利用find_in_set()函数和group_concat()函数实现递归查询):
创建一个函数:
|
|
FIND_IN_SET(str,strlist):使用FIND_IN_SET函数一次返回多条记录。
如果str不在strlist或strlist为空字符串,则返回值为 0。如任意一个参数为NULL,则返回值为 NULL。
假如字符串str在由N子链组成的字符串列表strlist中,则返回值的范围在 1 到 N 之间。
一个字符串列表就是一个由一些被’ , ‘符号分开的子链组成的字符串。
str是一个表的字段,然后每条记录分别是str等于strlist中的值的时候 ,有点类似in(集合)。
调用方法:
|
|
查询id为”4”下面的所有节点。
|
|
|
|
|
|
|
|
②.向上递归
|
|
调用方式:
查询id为”7”的节点的所有上级节点:
|
|
6.如何在后台进行非空验证/只在前台不在后台进行非空等验证的缺点
如果你开发的是商业应用,那么稳定性和安全性是相当重要的,而这里就存在有安全漏洞。
因为你的前台验证并不一定在每个客户端都会执行,比如某个客户端把IE的安全等级调到最高(或者禁用了js),那么所有JS实现的效果都会失效,那这时的前台验证就形同虚设,这时后台的验证也就显得很重要了。
拿用户注册表单来说,用户在获得注册表单后,可以查看其HTML源代码,并且将其保存下来,将其中的JavaScript代码去掉,另存为一个本地HTML文件,再在本地运行,填写数据,同样可以成功达到向服务器提交不合理数据的目的。
客户端验证给用户带来方便,其存在的原因主要是对用户考虑,但是它不能保证安全性,用户可以轻易绕过。因此,对于一个安全的数据验证方案,服务器端的验证是必须的,在设计应用系统时,必须考虑到这个要求。
7.如何对form表单提交到后台的大量数据进行验证
可以将多余的代码写在一个公共的工具类里面,再调用。
史上最全Java表单验证封装类
8.JUnit及断言
断言是编写测试用例的核心实现方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过。
Junit使用教程(二)
9.jdk1.5新特性
①.自动装箱与拆箱
②.枚举
③.静态导入
④.可变参数(Varargs)
⑤.泛型(Generic)
⑥.foreach循环
……
JDK1.5以后各版本新特性
10.解决过哪些浏览器兼容性的问题
。。。这个问题真的会不知道咋回答…
前端开发要注意的浏览器兼容性问题整理