2017年12月3日 星期日

關於Java queue類說明


Java5中的queue類是隊伍數據結構管理類,
在它裡面的元素可以按照添加他們的相同順序被移除。
使用方法
offer 添加一個元素並返回 如果隊伍已滿,則返回false
poll 移除並返回隊伍頭部的元素 如果隊伍為空,則返回null
peek 返回隊伍頭部元素 如果隊伍為空,則返回null
put 添加一個元素 如果隊伍滿,則阻塞
take 移除並返回隊伍頭部的元素 如果隊伍為空,則阻塞
element 返回隊伍頭部的元素 如果隊伍為空,則拋出一個NoSuchElementException
add 增加一個元素 如果隊伍已滿,則拋出一個IegaISalbEePeplian
remove 移除並返回隊伍頭部的元素 如果隊伍為空,則拋出一個NoSuchElementException



方法\處理方法 拋出異常 返回特殊值 一直阻塞 超時退出
插入方法 add(e) offer(e) put(e) offer(e,time,unit)
移除方法 remove() poll() take() poll(time,unit)
檢查方法 element() peek() 不可用 不可用

但poll和peek方法出錯會返回null,因此向隊伍插入null是不合法的行為。

還有帶超時的 offer和poll方法重載,例如下面的呼叫

boolean result=q.offer(value,100,TimeUnit.MILLISECONDS)

嘗試在100毫秒內向隊伍尾部插入一個元素,如果成功返回true,但當超時進入時會返回false,同樣地,呼叫

Object head=q.pll(100,TimeUnit.MILLSECONDS)

如果在100毫秒內成功地移除了隊伍頭元素,則立即返回頭部元素,否則到達超時,返回null。

阻塞的操作有put和take,put方法是隊伍滿時阻塞,take方法是隊伍空時阻塞。

(阻塞的意思就是此條線程會處於等待卡死狀態,解鎖的條件是隊列中有另一條線程存入或取出數據了,就會解鎖,說白了就是滿了不能再存,空了不能取,都得等著,就相當於隊列是倉庫,倉庫沒有貨了就生產,倉庫有貨就能消費,鎖條件是notFull和notEmpty)

Queue接口和List、Set同一級別,都是繼承Collection 接口,LinkedList實現Queue介面,Queue介面窄化了對LinkedList的方法訪問權限(即是方法中的參數類型是Queue時,就完全只能訪問Queue接口所定義的方法了,而不能直接訪問LinkedList的非Queue方法

JDK7提供了7个阻塞队列。分别是
  • ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
  • LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
  • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列。
  • SynchronousQueue:一个不存储元素的阻塞队列。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
參考網站,如有不妥,請告知,立即刪除
http://www.infoq.com/cn/articles/java-blocking-queue
https://zhidao.baidu.com/question/541161936.html
http://www.itread01.com/content/1501578122.html

2017年10月23日 星期一

Word 數字 數值加上千分位和金錢符號$

在某ㄧ次的機遇,我需要把整份Word數值改成有千分位並開頭加上$符號

上網查了一下,幾乎都說要插入Excel,但其實使用Word替代和正規表示法就可以解決了



例如Word有下列ㄧ串數字,則就使用右方格式做轉換

76543210  =>尋找目標([0-9]{2})([0-9]{3})([0-9]{3})   取代為$\1,\2,\3

6543210    =>尋找目標([0-9]{1})([0-9]{3})([0-9]{3})   取代為$\1,\2,\3

543210      =>尋找目標([0-9]{3})([0-9]{3})   取代為$\1,\2

43210       =>尋找目標([0-9]{2})([0-9]{3})   取代為$\1,\2

3210         =>尋找目標([0-9]{1})([0-9]{3})   取代為$\1,\2

210          =>尋找目標([!,$])([0-9]{3})  取代為\1$\2

10       

0         

如果要使用的話,請從上至下開始取代,然後數值為百位數時最好自己手動輸入,因為容易因為其他項目符號,或者是不需要當作金錢的數值,ㄧ起取代掉

2017年7月12日 星期三

Java 對於視窗事件處理流程

有沒有想過,當使用者按下按鈕時,是如何觸發回應視窗,或者是其他動作呢?

一開始我們先記得,在事件處理的過程中,涉及主要下面內容:

1. Event Source(事件源)(Object):事件發生的場所,通常是各個元件,例如按鈕、視窗、選單...等。

2.Event(事件)(Object):當我們對某個元件,做出一些動作時,他會封裝所做的動作相關資訊。

3.Event Listener(事件監聽器)(Object):當有事件源發生事件時(監聽),會對各種事件派送給事件處理器來做相關處理及回應。

4.Event Handler(事件處理器)(Function):當事件監聽器將事件派遣給事件處理器,他會做一連串的回應動作。






















參考:細說Java 8 異常處理與圖形介面程式設計 一書

2017年7月6日 星期四

正規表達式(Regular Expression, regex) for Java


--------------------------------------------------------------------------------------------------------------------------
普通字元組

[0-9], \d    =>比對數字串
[a-z]    =>比對小寫英文字母串
[0-9A-Za-z], \w=>比對數字串大小寫英文字母串

-g         =>(global) 全域比對,如果沒家只會比對第一個
-i          =>(ignore case) 大小寫不區分
-m        =>(mulltiline) 多行比對

[...]      =>代表那些括號內的字元
[^...]    =>代表不要那些括號內的字元

+         =>代表出現1次以上
*         =>代表出現0次以上
?         =>代表出現0次或1次

\n       =>換行(newLine, ASCII=0x0a)
\t        =>跳格(tab)
\r        =>windows中常接著\n一起代表換行(ASCII=0x0c)
\s       =>空白型字元
\b       =>匹配邊界
.         =>代表任何字母(換行除外)
^        =>不在[...]裡面時,代表字串手
$        =>代表字串結尾

(預設)Greedy   =>貪婪模式會一直匹配下去,直到無法匹配為止
(?)Reluctant      =>勉強模式,只會匹配最少字元。
(+)Possessive    =>只有Java

\X代表不是\x的那些字母
(...)    =>代表一個群組

*可以看這個網頁,補充很多知識
https://atedev.wordpress.com/2007/11/23/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F-regular-expression/
--------------------------------------------------------------------------------------------------------------------------

POSIX字元組

e.gs., test1檔案,可以更改1或a來看一下執行結果


--------------------------------------------------------------------------------------------------------------------------



利用Java來練習

e.gs.,
(1).
可以觀看test2檔案執行結果
inputStr="abdZZcdeQQbe";
需找出c或d所在的位置。
regex="[c-d]{1}";
而如果要連續重複兩次的話,則
regex="[c-d]{2}";
matcher的start=5,group=cd;

(2).
可以觀看test3檔案執行結果
來看一下+,*,? 和貪婪模式、勉強模式的差別。


(3).
可以觀看test4檔案執行結果
來看一下group的執行結果,其中他會依序尋找其結果

(4)
可以觀看test5檔案執行結果
用一個簡單的例子,試著抓出他的電話號碼

(5)
可以觀看test6檔案執行結果
找出每個句首大寫的單字

(6)
可以觀看test7檔案執行結果
可以利用此程式,知道該號碼為手機、家裡電話、或錯誤號碼

*
http://notes.maxwi.com/2015/10/06/Regex-practice/
* 如果想看更多範例可以到下面網址
http://www.iteye.com/topic/350789

2016年11月15日 星期二

面試問題

今天面試考白版題,整個頭腦轉不過來...就只好回家檢討一下問題了

1.寫出一個反轉字串的方法

2.一樣是反轉字串的方法,但不行使用迴圈的方式

這部分我分兩個...一個是我自己寫的,一個是看網路上比較簡易的==

2.1

2.2

然後需要檢討時間複雜度和空間複雜度的運算和StringBuffer...完全忘記了,這部分下次再補齊

補充知識

今天和一個朋友聊天,聊了很多知識東西,我想要把它記下來和補充


1.Override and overload的差別

override:子類別繼承父類別的函式,然後改寫其繼承的函式,但必須是函式名稱相同、參數型態個數相同,傳回型態相同。

overload:相同的函式名稱,但參數型態、參數個數、傳回型態只要任一個不同,就會呼叫不同的函數。

2.IO dead lock 是什麼如何處理

process的通常流程=要求資源->使用資源->釋放資源

而dead lock通常要滿足下面條件

  a.Mutul exclusion:一個資源(Instances)一次只能被ㄧ 個process使用。

  b.Hold and wait:當多個process發生mutul exclusion,然後尋求下一個資源時,都有process在      使用,造成一個等待資源動作出現。

  c.No preemption:而資源又不能經過其他方法來釋放,只能依靠使用的process來自行處理。

  d.Circular wait:就造成每個process都握有另一個process請求的資源,然後各自沒有釋放本身      持有的資源,造成一個循環出現。

那我們該如何處理
  a.完全無視他...反正出現死結機率很低,大不了重開機或重開程式讓他重新來過就好了...

  b.偵測死結發生,然後經由自己寫的程式邏輯來恢復運作。

  c.使用一個protocol來預防或避免死結發生。

3.繼承、封裝、多型,如何用最普通的講話來解釋?

因為我只會實作,真的沒想過如何用普通的講話說出來,我這裡試著用我想法講出來

這裏我舉一個汽車工廠的例子

當母公司做了一個汽車模組出來分送給底下的子公司,然後子公司依照所待的國家區域,來做調整,例如是顏色問題、燈的明暗度、和左右邊駕駛問題,而這就是「子繼承父」的觀念了。

而封裝就像是避免存取一些你不想讓人知道的東西,舉個例子來說,每個汽車裡都有一個微電腦,而開發汽車微電腦的人,不想有人亂動裡面機密的設定,避免造成車禍事件發生,所以他們就只提供,供應微電腦的電源連接器、微電腦輸出設定到儀表板上,而微電腦就是被封裝的東西,而電源連接器和輸出設定就是提供微電腦的介面方法。

多型,我就在繼承的例子,再改一下,當母公司做了一個汽車模組設計圖,而這個汽車模組設計圖依照各個國家、地區、氣候、政治的不同,有不同的設計成品出來,而這些設計成品的原型是從「同一個名稱的汽車模組設計圖」出來的。

4.Clean code and dirty code

dirty code指的是讓人覺得很難看得懂的程式,有可能是重複宣告、同樣的程式碼、髒亂的排版、沒有註解...等等,而會造成這個原因有可能是自身實力不足或者是為圖方便之類,從而造成程式碼越來越髒、當越髒時Bug也會越多,因為當你看不懂時就會亂改參數或者是重新寫一個新的,而通常這都會造成下一個問題出現,因為你看不懂程式碼,無法全面觀察改變之後會造成什麼事情出現,而clean code就是除去這些問題所寫的完美程式碼,我這裡推薦兩個網址,這裡詳述一些dirty code的問題。
http://www.ithome.com.tw/node/83209
http://keystonegame.pixnet.net/blog/post/17243817-%E7%A8%8B%E5%BC%8F%E7%A2%BC%E5%A3%9E%E5%91%B3%E9%81%93(code-bad-smell)

5.IPv4 Internal IP

6.Agile Scrum


參考資料:
http://sls.weco.net/node/21327
http://www.ithome.com.tw/node/83209
http://keystonegame.pixnet.net/blog/post/17243817-%E7%A8%8B%E5%BC%8F%E7%A2%BC%E5%A3%9E%E5%91%B3%E9%81%93(code-bad-smell)
https://toggl.com/developer-methods-infographic


2016年10月11日 星期二

C/C++ call by value, call by address, call by reference

標頭都加上
#include <iostream>
using namespace std;
然後使用dev c++

==============================================

int main()
{
  int i=1;
  cout<< i <<endl;  // print 1
}

==============================================

int main()
{
  int i=1;
  cout<< &i <<endl; // print i address
}

==============================================

int main()
{
  int i=1;
  int &j=i;  //讓j的位址指向i的位址(兩個位址會一樣)
  cout<< j << endl; //print j values (That is i values)
  cout<< &j << endl;  // print j address (That is i address)
}

==============================================

int main()
{
  int i=1;
  int *k=&i; //讓k的變數參照i的位址(兩個位址會不一樣)
  cout << k << endl;  // print k values => i address (所以k變數數值列印出來是i的位址
  cout << &k << endl; // print k address (是指k的位址不關變數i的事情)
  cout << *k << endl; // print i address pointer values (指的是k指標變數所參照i位址的數值)
}

=============================================