原创 spring-ApplicationCotext初始化之component-scan

    在我們配置的Spring-ApplicationContext文件中,context:component-scan是一個很重要的節點,它主要能幫助我們掃描指定包下面,需要加載到beanFactory容器的類,現在我們就來鑽研一下這

原创 用Redis實現頻繁操作的攔截,例如一天內只允許一個用戶登錄5次

    上次看到一個問題:如何用Redis實現只允許一個用戶一天內登錄五次。    想到Redis中可以給string設置過期時間,所以我們可以利用這個特性來實現。    作爲一個java程序猿,我們使用Jedis,具體使用到的API是:

原创 JAVA虛擬機學習總結——Java內存模型與線程

JAVA內存模型 Java內存模型規定了所有的變量都存儲在主內存中。 每條線程還有自己的工作內存,線程的工作內存中保存了被該線程使用到的變量的主內存副本拷貝。線程對變量所有的操作(讀取,賦值)都必須在工作內存中進行,而不能直接讀寫主內存

原创 JAVA虛擬機學習總結——垃圾收集與內存回收

垃圾收集器與內存回收策略 判斷對象是否已死 引用計數器 可達性分析算法 四種引用類型 強引用:只要這類引用還存在,就不會回收。 軟引用:在系統將要發生內存溢出異常之前,將會把這些對象列進回收範圍之中進行二次回收。 弱引用:只能生存到

原创 帶環鏈表問題 查找帶環鏈表的起始環節點

這個問題是 LintCode 上面的一個算法題目( 帶環鏈表 II ),主要考察的是對於鏈表,帶環鏈表的理解。原問題描述:給定一個鏈表,如果鏈表中存在環,則返回到鏈表中環的起始節點,如果沒有環,返回null。樣例:給出 -21->10->

原创 算法 啤酒 酒瓶 瓶蓋 兌換問題

今天有人在java交流羣裏面有人問到一個算法問題:一個算法題:啤酒2塊錢1瓶,4個瓶蓋換1瓶2個空瓶換1瓶問:10塊錢可以喝幾瓶?首先,可以用10元買下5瓶啤酒,然後得到5個酒瓶和5個瓶蓋,然後又可以用酒瓶和瓶蓋兌換啤酒,得到的啤酒又可以

原创 且說 死鎖 synchronize

死鎖是面試中常考的一個點,也是我們工作中應該儘量避免的BUG。在多線程任務中,死鎖是很容易產生的。    死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用, 它們都將無法推進下去。

原创 揹包問題 LintCode

首次在LintCode上做了一個打敗了100%提交的答案,一定要紀念一下下面進入正題:揹包問題-LintCode問題描述:在n個物品中挑選若干物品裝入揹包,最多能裝多滿?假設揹包的大小爲m,每個物品的大小爲A[i]注意事項:不可以將物品進

原创 用Callable實現在走完10個線程之後再進行操作

昨天一個碰到了一個題目:如何編程,使得主線程在跑完十個線程之後,再進行後續操作。看到這個問題,我的第一反應就是可以使用Callable來實現。因爲實現線程有兩種方式,實現Callable接口或者實現Runnable接口(至於繼承Threa

原创 滑動窗口的最大值 LintCode

這個是我完成的第一個 LintCode 上面的超難的題目,特此紀念一下,並分享一下結題的思路。原題目鏈接:滑動窗口的最大值 問題描述:給出一個可能包含重複的整數數組,和一個大小爲 k 的滑動窗口, 從左到右在數組中滑動這個窗口,找到數組中

原创 帶環鏈表 判斷鏈表是否有環 LintCode算法題目

這是 LintCode 上面的一個算法題目--帶環鏈表,目的是判斷鏈表是否有環。問題描述:給定一個鏈表,判斷它是否有環。樣例說明:給出 -21->10->4->5, tail connects to node index 1,返回 tru

原创 使用枚舉緩存SimpleDateFormat實例

在我們的項目中,時常需要對日期進行操作,因此常常會大量的產生SimpleDateFormat實例,但是,1.SimpleDateFormat的初始化其實是比較耗費性能的,2.這個日期的格式大部分都是那麼幾種,諸如yyyy-MM-dd HH

原创 JAVA虛擬機學習總結-內存區域

虛擬機學習總結-內存區域 虛擬機的內存區域劃分 JAVA虛擬機在執行java程序的過程中會把它所管理的內存劃分爲若干個不同的數據區域 1.程序計數器 當前線程所執行的字節碼的行號指示器,字節碼解釋器就是通過改變這個計數器的值來選取下一條需

原创 JAVA虛擬機學習總結——運行期優化

JAVA虛擬機的運行期優化 解釋器與編譯器 java 程序最初就是通過解釋器進行解釋執行的。當虛擬機發現某個方法或代碼塊的運行特別頻繁時,就會把這些代碼認定爲“熱點代碼”。爲了提高熱點代碼的運行效率,在運行時,虛擬機會把這些代碼編譯成於本

原创 用CountDownLatch實現在走完10個線程之後再進行操作

    在上一篇博客中,我們用Callable實現了這個功能:用Callable實現在走完10個線程之後再進行操作,其中也提到了使用CountDownLatch實現是一個更好地選擇,下面,我們就來看看如何使用用CountDownLatch