se amethod is private
3)Output of “Base.amethod”;
4)Output of “Over.amethod”;
答案:4
答案:垃圾回收是指对于那些没有被引用的对象,JVM会自动回收。
但是,如果很多对象依然被其他对象引用,那么JVM就不会回收,这就造成“内存泄漏”现象
Hibernate中的对象有三种状态: 瞬时状态(Transient),持久状态(Persistent),脱管状态(Detached)
l 瞬时状态(Transient):由new命令开辟内存空间的Java对象,也就是平时所熟悉的普通Java对象。如:Student stu = new Student();。瞬时对象特点:(1)不和Session实例关联;(2)在数据库中没有和瞬时对象关联的记录。
l 持久状态(Persistent):持久的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。持久对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而必须在Transaction终止,也就是执行commit()之后,才在数据库中真正运行SQL进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏(dirty)对象。持久化对象的特点:(1) 和Session实例关联(2) 在数据库中有和持久对象关联的记录。
l 脱管状态(Detached):与持久对象关联的Session被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改。脱管对象特点:(1) 本质上和瞬时对象相同;(2) 只是比爱瞬时对象多了一个数据库记录标识值id.。
持久对象转为脱管对象:
l 当执行close()或clear(),evict()之后,持久对象会变为脱管对象。
瞬时对象转为持久对象:
l 通过Session的save()和saveOrUpdate()方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。
l 使用fine(),get(),load()和iterater()待方法查询到的数据对象,将成为持久化对象。
脱管对象转为持久对象:
通过Session的update(),saveOrUpdate()和lock()等方法,把脱管对象变为持久对象。
答案:static所修饰的对象全局对象,static所修饰的属性是类属性。static对象和属性在内存中只存在一份。
final修饰的对象是不可更改的对象,final修饰的属性是常量,也不可更改。
public class Test{
public static void main(string []args){
amethod();
}
public void amethod(){
System.out.prinln(“this amethod “);
}
}
答案:在静态方法中不能调用非静态方法和属性。
两种改法:要么把amethod()声明为static,要么在main方法中构造Test对象,由Test对象调用amethod()方法。
public String setout(){
String s=”";
for(int i=0;i<500;i++){
s+=i;
}
return i;
}
答案:字符串连接操作(+=)会产生很多中间对象,性能不好。
public String setout(){
StringBuffer buffer=new StringBuffer();
for(int i=0;i<500;i++){
buffer.append(i);
}
return buffer.toString();
}
答案:
public class Fibonacci{
int fib(int n){
if (n == 0) return 0;
else if (n == 1) return 1;
else return fib(n-1) + fib(n-2);
}
public static void main(String[] args){
int[] fi=new int[30];
Fibonacci f = new Fibonacci();
for(int i=0;i<30;i++){
fi[i]=f.fib(i+1);
System.out.print(fi[i]+“\t“);
}
}
}
答案:request.setAttribute();以及URL方式
答案:SQL资料隐码攻击(SQL injection)又称为隐码攻击、SQL注入等,是发生于应用程式之资料库层的安全漏洞。简而言之,是在输入的资料字串之中夹带SQL指令,在设计不良的程式当中忽略了检查,那麽这些夹带进去的指令就会被资料库伺服器误认为是正常的SQL指令而执行,因此招致到破坏。
例子
某个网站的登入验证的SQL查询代码为
strSQL = “SELECT * FROM users WHERE (name = ‘” + userName + “‘) and (pw = ‘”+ passWord +”‘);”
恶意填入userName = “‘ OR ’1′=’1″;与passWord = “‘ OR ’1′=’1″;时,将导致原本的SQL字串被填为
strSQL = “SELECT * FROM users WHERE (name = ” OR ’1′=’1′) and (pw = ” OR ’1′=’1′);”
也就是实际上运行的SQL命令会变成下面这样的
strSQL = “SELECT * FROM users;”
因此达到无帐号密码,亦可登入网站。所以SQL隐码攻击被俗称为骇客的填空游戏。
答案:public String getWeek(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
switch (dayOfWeek) {
case 1:
return “星期日”;
case 2:
return “星期一”;
case 3:
return “星期二”;
case 4:
return “星期三”;
case 5:
return “星期四”;
case 6:
return “星期五”;
case 7:
return “星期六”;
}
return “”;
}
答案: Hibernate提供了两级缓存,第一级是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法比卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。
第二级缓存是一个可插拔的的缓存插件,它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。第二级对象有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。缓存适配器用于把具体的缓存实现软件与Hibernate集成。第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存。
什么样的数据适合存放到第二级缓存中?
1、很少被修改的数据.
2、不是很重要的数据,允许出现偶尔并发的数据.
3、不会被并发访问的数据.
不适合存放到第二级缓存的数据?
1、经常被修改的数据.
2、财务数据,绝对不允许出现并发.
3、与其他应用共享的数据.
无论何时,当你给save()