一直跟着老师做项目,平时也看了一些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' --- 这个值是函数。