ict面试题两张,求大家解答
全部评论
1,会话保持有哪些方式?其中Session和Cookie有什么区别?请描述会话存储和交互方式。
①、session,也是最常用的一种,使用内建session对象
②、Cookie,使用持续Cookies(Persistent Cookies)
③、地址重写,重写包含额外参数的URL(URL Rewriting)
④、隐藏域,建立含有数据的躲藏表单字段(Hidden
Form Field)
Cookie和Session。二者都能记录状态,前者是将状态数据保存在客户端,后者则保存在服务端.
它们有各自的优点也有各自的缺陷。然而具有讽刺意味的是它们优点和它们的使用场景又是矛盾的,例如使用
Cookie 来传递信息时,随着 Cookie 个数的增多和访问量的增加,它占用的网络带宽也很大,试想假如 Cookie 占用
200 个字节,如果一天的 PV 有几亿的时候,它要占用多少带宽。所以大访问量的时候希望用 Session,但是 Session
的致命弱点是不容易在多台服务器之间共享,所以这也限制了 Session 的使用。
1.应用场景
Cookie的典型应用场景是Remember Me服务,即用户的账户信息通过cookie的形式保存在客户端,当用户再次请求匹配的URL的时候,账户信息会被传送到服务端,交由相应的程序完成自动登录等功能。当然也可以保存一些客户端信息,比如页面布局以及搜索历史等等。
Session的典型应用场景是用户登录某网站之后,将其登录信息放入session,在以后的每次请求中查询相应的登录信息以确保该用户合法。当然还是有购物车等等经典场景;
2.安全性
cookie将信息保存在客户端,如果不进行加密的话,无疑会暴露一些隐私信息,安全性很差,一般情况下敏感信息是经过加密后存储在cookie中,但很容易就会被窃取。而session只会将信息存储在服务端,如果存储在文件或数据库中,也有被窃取的可能,只是可能性比cookie小了太多。
Session安全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁,这在下文会进行更详细的说明。总体来讲,session的安全性要高于cookie;
3.性能
Cookie存储在客户端,消耗的是客户端的I/O和内存,而session存储在服务端,消耗的是服务端的资源。但是session对服务器造成的压力比较集中,而cookie很好地分散了资源消耗,就这点来说,cookie是要优于session的;
4.时效性
Cookie可以通过设置有效期使其较长时间内存在于客户端,而session一般只有比较短的有效期(用户主动销毁session或关闭浏览器后引发超时);
5.其他
;Cookie的处理在开发中没有session方便。而且cookie在客户端是有数量和大小的限制的,而session的大小却只以硬件为限制,能存储的数据无疑大了太多。
2,描述hashmap的存储结构。如何实现多线程并发访问(修改)同一个对象时保证线程安全?请至少说出三种方法。
①、hashmap通过数组和链表来实现对数据的存储。 ②、hashmap是线程不安全的。 ③、如何保证线程安全?
1)在对象/变量前加上
volatile
。
2)
将对象/变量加上锁
synchronized
修饰。在线程中,使用同步方法或者同步块。
3)
使用带有线程安全的线程。如:继承
TimerTask
类实现线程,用
Timer.schedule
启动线程
。
3.equals和hashcode是什么关系?为什么equals和hashcode要一起重写?
首先equals与hashcode间的关系是这样的:
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)
hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。
这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,
当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,
导致混淆,因此,就也需要重写hashcode()
。
4.Java垃圾回收的基本原理是什么?垃圾回收的收集器有哪几种?是否可以立即回收内存?有什么办法主动通知虚拟机进行垃圾回收?
垃圾回收通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
程序可以用
System.gc()
或
Runtime.getRuntime().gc()
请求垃圾回收,但并不保证立即执行垃圾回收。
虽然这个请求机制提供给程序员一个启动 GC
过程的机会,但是启动由 JVM负责。JVM可以拒绝这个请求,所以并不保证这些调用都将执行垃圾回收。
Java有四种类型的垃圾回收器:
串行垃圾回收器(Serial Garbage Collector)
并行垃圾回收器(Parallel Garbage Collector)
并发标记扫描垃圾回收器(CMS Garbage Collector)
G1垃圾回收器(G1 Garbage Collector)
下面的JVM关键配置都与Java垃圾回收有关。
运行的垃圾回收器类型
配置
描述
-XX:+UseSerialGC
串行垃圾回收器
-XX:+UseParallelGC
并行垃圾回收器
-XX:+UseConcMarkSweepGC
并发标记扫描垃圾回收器
-XX:ParallelCMSThreads=
并发标记扫描垃圾回收器 =为使用的线程数量
-XX:+UseG1GC
G1垃圾回收器
GC的优化配置
配置
描述
-Xms
初始化堆内存大小
-Xmx
堆内存最大值
-Xmn
新生代大小
-XX:PermSize
初始化永久代大小
-XX:MaxPermSize
永久代最大容量
使用JVM GC参数的例子
1
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m
-XX:MaxPermSize=20m -XX:+UseSerialGC -jar
java-application.jar
5.栈(stack)和堆(heap)之间的区别是什么?在编写一个基础算法时,实现算法高效性,一般用哪一种类型多,?请说明理由
Java中的堆(Heap)是一个运行时数据区,用来存放类的对象;栈(Stack)主要存放基本的数据类型(int、char、double等8种基本数据类型)和对象句柄。
连接:
http://blog.csdn.net/shenshibaoma/article/details/53023661
6.spring管理bean一般是在什么时候被始化?这种方式有什么缺点?spring事务隔离级别如何设置?
spring管理的bean在默认情况下是会在服务器启动的时候初始化的。 spring的bean在被依赖的时候实例化;
分为以下几种Bean:
1. 如果指定的是convertrService,beanPostProcessor等实例的时候,则会在ApplicationContext初始化的时候就实例化;
2. 如果指定的是自定义的Bean,那么会在第一次访问的时候实例化; Spring 容器中的 Bean 是有生命周期的,spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。下面是常用的三种指定特定操作的方法:
通过实现InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
通过<bean> 元素的 init-method/destroy-method属性指定初始化之后
/销毁之前调用的操作方法;
在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。
spring隔离级别
1)@Transactional(isolation = Isolation.SERIALIZABLE):最严格的级别,事务串行执行,资源消耗最大;
2)@Transactional(isolation = Isolation.REPEATABLE_READ):保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
3)@Transactional(isolation = Isolation.READ_COMMITTED):大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”,该级别适用于大多数系统。
4)@Transactional(isolation = Isolation.READ_UNCOMMITTED):保证了读取过程中不会读取到非法数据。
注意的几点:
1)@Transactional只能被应用到public方法上,对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.
2)用spring事务管理器,由spring来负责数据库的打开,提交,回滚。默认遇到运行期例外(throw
new
RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw
new
Exception("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚
要想所有异常都回滚,要加上 @Transactional(
rollbackFor={Exception.class,其它异常})。如果让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
如下:
@Transactional(rollbackFor=Exception.class) //指定回滚,遇到异常Exception时回滚
public void methodName() {
throw new Exception("注释");
}
@Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw
new RuntimeException("注释");)会回滚
public ItimDaoImpl
getItemDaoImpl() {
throw new RuntimeException("注释");
}
3)@Transactional注解应该只被应用到public可见度的方法上。如果你在
protected、private或者package-visible的方法上使用@Transactional注解它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。
4)@Transactional注解可以被应用于接口定义和接口方法、类定义和类的public方法上。然而,请注意仅仅@Transactional注解的出现不足于开启事务行为,它仅仅
是一种元数据,能够被可以识别@Transactional注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是
<tx:annotation-driven/>元素的出现 开启 了事务行为。
5)Spring团队的建议是你在具体的类(或类的方法)上使用@Transactional注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用
@Transactional
注解,但是这将只能当你设置了基于接口的***时它才生效。因为注解是不能继承的,这就意味着如果你正在使用基于类的***时,那么事务的设置将不能被基于类的***所识别,而且对象也将不会被事务***所包装(将被确认为严重的)。因此,请接受Spring团队的建议并且在具体的类上使用
@Transactional 注解。
7.javascript中有几种对象类型?他们之间能否相互转换?
JS中有6种数据类型:Undefined、Null、Boolean、Number、String和Object。JS中不支持任何创建自定义类型的机制,而所有值最终都将是这6种数据类型。其数据类型的动态性特点足以表示所有数据。JS提供typeof操作符来检测变量的数据类型。
(typeof返回的是字符串有六种可能:"number","string","boolean","object","function","undefined")。
我们先来看看Undefined这个数据类型吧,Undefined类型只有一个特殊的值——undefined。
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
JavaScript中检测对象类型的运算符有:typeof、instanceof,还有对象的constructor属性:
1) typeof 运算符 typeof
是一元运算符,返回结果是一个说明运算数类型的字符串。如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在)。
但 typeof 的能力有限,其对于Date、RegExp类型返回的都是"object"。如:
?
1
2
3
typeof{};// "object"
typeof[];// "object"
typeofnewDate();// "object"
所以它只在区别对象和原始类型的时候才有用。要区一种对象类型和另一种对象类型,必须使用其他的方法。如:instanceof
运算符或对象的 constructor 属。
2)instanceof 运算符。 instanceof
运算符要求其左边的运算数是一个对象,右边的运算数是对象类的名字或构造函数。如果 object 是 class 或构造函数的实例,则
instanceof 运算符返回 true。如果 object 不是指定类或函数的实例,或者 object 为 null,则返回
false。如:
?
1
2
3
4
[]instanceofArray;// true
[]instanceofObject;// true
[]instanceofRegExp;// false
newDateinstanceofDate;// true
所以,可以用instanceof运算符来判断对象是否为数组类型:
?
1
2
3
functionisArray(arr){
returnarrinstanceofArray;
}
JS 数据类型转换 方法主要有三种:
转换函数、强制类型转换、利用js变量弱类型转换。
1. 转换函数:
js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not
a Number)。
2. 强制类型转换
还可使用强制类型转换(type
casting)处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。
ECMAScript中可用的3种强制类型转换如下:
Boolean(value)——把给定的值转换成Boolean型;
Number(value)——把给定的值转换成数字(可以是整数或浮点数);
String(value)——把给定的值转换成字符串。 用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这会造成意想不到的后果。
当要转换的值是至少有一个字符的字符串、非0数字或对象(下一节将讨论这一点)时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。
3. 利用js变量弱类型转换
举个小例子,一看,就会明白了。 <script> var str=
'012.345 '; var x = str-0; x = x*1;
</script>
如图数据库题目解答?
1.按月查出电信每个月的总话费收入。
SELECT sum(pf.fare) as '月总话费' from tab_phome_fare pf
GROUP BY pf.`month`;
2.查出2016年的总话费超过150元的人员的姓名,手机号码和话费。
SELECT * from tab_customer c
INNER JOIN
(
select pf.phone,SUM(pf.fare) as sumFare from tab_phome_fare
pf GROUP BY pf.phone
) as b
on
c.phone = b.phone
where b.sumFare>150
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
![](https://static.nowcoder.com/fe/file/oss/1716965564844UEBJN.png)
![](https://static.nowcoder.com/fe/file/oss/1716965585666UBBME.png)
腾讯
| 实习
| 超多精选岗位
点赞 评论 收藏
分享