笔试有感。


一直跟着老师做项目,平时也看了一些java基础的资料,例如Thinking in Java


但是今天笔试的题目,让我知道了学海无涯...


收获一

首先一个synchronized关键字问题就让我挂了。


题目是这样的:

package cn.Test;

public class Test {
	
	public synchronized static void make(){
		
	}

	public synchronized void make2(){
		
	}
	
}

问:同步吗?

我回答了 同步。正确答案应该是不同步。


首先说一下什么是同步。


简单的说就是一个线程在调用这个方法,其他线程就要等待他调用完毕。或者修改某个数据,其他线程就要等待第一个线程修改好这个数据。

在这个笔试题目里:


因为这两个方法加的锁就是不一样的。


static方法加的是类锁(class)

非static方法加的是对象锁(即:class类产生出的某个对象)。


所以当多线程情况下,两个方法可以同时执行。所以不同步。


举一些例子:


package cn.Test;

public class Test {
	
	private static Object key = new Object();
	
	public void make(){
		
		synchronized (key) {
			//body...
		}
		
	}
	
}

这里的key,大家应该都了解吧。就是为了达到同步效果,我们弄出来的临界资源。(注意要加static)


package cn.Test;

public class Test {
	
	private Object key = new Object();
	
	public void make(){
		
		synchronized (this) {
			//body...
		}
		
	}
	
}


而这里的this呢?这个this指得是object reference。或者说是这个对象的引用。


为了达到同步的效果,这种写法,前提是这个Test类是单例类,不然的话这种写法没有意义。


package cn.Test;

public class Test {
	
	private Object key = new Object();
	
	public void make(){
		
		synchronized (Test.class) {
			//body...
		}
		
	}
	
}

这里我们的同步锁是Test.class


这个就是类锁了。每个对象都是由一个class产生出来的,对于Test他只有一个Tsst.class。


所以在单例模式的时候,我们往往这么写


package cn.Test;

public class Test {
	
	private volatile static Test test = null;
	
	public static Test getTest(){
		
		if (test == null) {
			
			synchronized (Test.class) {

				if (test == null) {
					
					test = new Test();
					
				}
				
			}
			
		}
		
		return test;
		
	}
	
	public static void main(String[] args) {
		
		Test test = Test.getTest();
		
	}
	
}

收获二:


今天还问到了session什么时候产生,什么时候销毁的。


我一开始差点写  SessionFactory.openSession()的时候产生...


后来想了想,应该是问的JSP里面的session的生命周期。


可是我只记住了session的存活时间是30分钟。


application 生命周期在整个应用程序中 生命周期为:应用程序启动到停止.
session 会话你可以设置他的时间 默认的是30分钟 当你关闭浏览器 结束本次会话  用户开始进行操作就产生一个唯一的session 每个session都分配了一个唯一的Id  
request是获取信息--通过用户提交的表单,查询字符串,cookie等获得信息
session是服务端用来保存一些数据(通常是标记状态的,当然也可以保存别的)
session是服务端的记录变量,可以跟踪记录访问者动作,比如登录,退出等.
request用在数据提交,表单数据等
cookie 的话 它有一个有效期 你也可以设置时间 如一个月 一年等


收获三


还有个问题就是SQL语句的问题。


诶,真是痛心啊。平时写写项目,都够用,到笔试的时候就不行了。


题目如下:

apply表

no

state

applydetail表

no

state

idcard

name


题目一忘记了,题目二:设置idcard为3304的记录state为07。

我是较劲乳汁,愣是写出来一个update apply a,applydetail d set a.state = '07' ,d.state = '07' where a.no = d.no and d.idcard = '3304'


现在想想,应该是错的。但是实在想不出来了,求各位路过的大牛给主意。


题目三:找出idcard数量大于2的idcard

平时根本没用过having...结果写了个group by ...就没了。


答案:select idcard count(*) from  applydetail having count(*) > 2


题目四:将applydetail中姓李的记录都删了。


我的答案:delete applydetail where name like '%李%';


       回来之后查了很多SQL题目。发现平时真的是坐井观天。


聚合函数:

AVG:求平均值

SUM:求和

MAX:求最大值

MIN:求最小值

COUNT(*):返回所有行数

COUNT返回满足指定条件的记录值


inner join、left outer join、right outer join的用法

Select * from 表名1 inner join 表名2 on 条件表达式


还有一个重点就是 子查询!

子查询基本分三类:1.使用in查询返回一列或更多值

2、比较运算符,返回单个值作为外查询的参数

3、用exists查询时相当于进行一次数据测试


之前自己都不知道from后面也可以跟子查询的


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; 


这里我看了之后,对子句的看法有了翻天覆地的改变。感觉子句太灵活了。from后面的就相当于自己构造出了一个表,字段名就是子句里面select出来的,并且子句里面可以用到外查询的信息,例如上面的案例:from里面的select里的select里就用到了上一层的Student.S#。这让我吓尿了。。。


查询学过“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'); 


这里的题目都不错,可以参考

http://wenku.baidu.com/view/763418d6360cba1aa811da4c.html


收获四

 

正则表达式:


题目因为完全看不懂,直接忘记了长什么样子了。现在回来脑补下知识。


个人觉得常用的几个符号掌握了就行了,毕竟不经常用,一些生僻的学了过几天就忘记了。


下面的图片摘自

http://www.jb51.net/article/16829.htm








收获五


CSS样式优先级:

(外部样式)External style sheet <(内部样式)Internal style sheet <(内联样式)Inline style


收获六


forward与redirect的区别


1.从地址栏显示来说 
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

2.从数据共享来说 
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.

3.从运用地方来说 
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说 
forward:高.
redirect:低.


1.redirect 方式可以跨应用访问,forward 只能在同一个应用中跳转。 
2.forward 客户端访问服务器,服务器找到要跳转的相应URL并执行返回给客户端。客户端的地址栏显示的是原始URL。 redirect 客户端访问服务器,服务器找到要跳转的URL并将URL发给客户端,再由客户端对新的URL重新发送请求。客 户端的地址栏显示的是第二次请求的URL。 
3.数据的传输:在request中的数据,forward可以访问,redirect不行,因为redirect已经是一个新的请求。 


这里一篇文章不错:

http://zhulin902.iteye.com/blog/939049


收获七


这是一道选择题,问的是String str1 = “ab”,String str2 = "ab";


问这里创建了几个对象。


答案是 一个。


这里涉及了JVM中堆,栈以及字符串池的问题。


栈中只保存 基本类型 ,例如:int,char,double,float等,或者对象的引用。


堆则存储创建的对象。


栈的速度仅次于 寄存器,快于堆。


这里的一篇文章不错:


http://duzhizj.blog.163.com/blog/static/34324890201291805834778/


以前都没有这么深入的了解一个类的创建是什么样的过程,看过这篇文章,收获颇丰啊。


越发的觉得一开始没有系统的学习Java,就算会做项目了,Java的基础还是不扎实。


2014-11-12~2014-11-13 笔试收获


收获一

interface 里面可以声明 友好变量和公共变量 但是不能申明私有和保护变量


且interface申明的友好公共 变量 自动转变成Static变量


收获二


case 1,2是错误的写法。


public class Test {

	public static void main(String[] args) {
		
		int num = 1;
		
		switch (num) {
		case 1,2:
			break;

		default:
			break;
		}
		
	}
	
}

收获三


1.当使用String str="abc",这种方式时,先去内存的Heap中找是否存在"abc"这个字符串,若存在,则将地址引用。若不存在则创建。

 

2.当使用String str=new String("abc");时,不管事先是否存在"abc",每次都会创建其新的对象。


提示:可以通过 == 来验证结论是否正确


收获四


9999转化二进制方法忘记了...白白错了一道题目。回来之后才恍然大悟,诶。


题目是:

while(x){

count ++;

x= x&(x-1);

}

求count的值。x输入是9999;

2014-12-03 笔试有感

收获一:接口实现接口用extends,而非implements


public interface A {

	public void show();
	
}
public interface B extends A{

	void show();
	
}

收获二


JS中的变量是松散类型(即弱类型)的,可以用来保存任何类型的数据。

typeof 可以用来检测给定变量的数据类型,可能的返回值:1. 'undefined' --- 这个值未定义;

2. 'boolean'    --- 这个值是布尔值;

3. 'string'        --- 这个值是字符串;

4. 'number'     --- 这个值是数值;

5. 'object'       --- 这个值是对象或null;

6. 'function'    --- 这个值是函数。




发布了46 篇原创文章 · 获赞 2 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章