一直跟着老師做項目,平時也看了一些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' --- 這個值是函數。