原创 重識JVM(六):內存分配原則

對象的內存分配,就是在堆上分配,對象主要分配在新生代的Eden 區上,如果啓動了本地線程分配緩衝,將按線程優先在TLAB 上分配。少數情況下也可能直接分配在老年代中,分配的規則不是固定的,其細節取決於當前使用的是哪一種垃圾收集器組合,還有

原创 重識JVM(二):虛擬機對象相關

1.對象的創建 在語言層面,創建一個對象通常是new一個關鍵字,那麼在java虛擬機中,對象的創建過程又是怎樣的呢? (1)虛擬機遇到一條new 指令時,首先將去檢查這個指令的參數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引

原创 分割回文串【JAVA實現】

給定一個字符串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回 s 所有可能的分割方案。 示例: 輸入: "aab" 輸出: [   ["aa","b"],   ["a","a","b"] ] 面對這種需要列出所有可能性的問題,

原创 尋找重複數【附java實現】

給定一個包含 n + 1 個整數的數組 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在一個重複的整數。假設只有一個重複的整數,找出這個重複的數。 示例 1: 輸入: [1,3,4,2,2] 輸出: 2 示例 2:

原创 從前序與中序遍歷序列構造二叉樹【附java實現】

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。 注意: 你可以假設樹中沒有重複的元素。 例如,給出 前序遍歷 preorder = [3,9,20,15,7] 中序遍歷 inorder = [9,3,15,20,7] 返回如下的二叉樹:  

原创 Java實現 pow(x, n) ,即計算 x 的 n 次冪函數。

示例 1: 輸入: 2.00000, 10 輸出: 1024.00000 示例 2: 輸入: 2.10000, 3 輸出: 9.26100 示例 3: 輸入: 2.00000, -2 輸出: 0.25000 解釋: 2-2 = 1

原创 重識JVM(五):垃圾收集器

如果說收集算法是內存回收的方法論,那麼垃圾收集器就是內存回收的具體實現了。 基於HotSpot 虛擬機的所有收集器如圖所示: 上圖中展示了7種用於不同分代的收集器,兩個收集器之間存在連線的,就說明它們可以搭配使用。下面讓我們來一個一個瞭

原创 重識JVM(四):GC

垃圾收集(GC)是java的重中之重,相信大家很多人喜歡使用java語言進行開發,就是因爲喜歡這一特性吧。 要了解垃圾收集,那麼我們肯定得弄明白三個問題: (1)哪些內存需要回收? (2)什麼時候回收? (3)如何回收? 1.哪些內存需要

原创 重識JVM(三):OOM異常的常見處理思路

1.堆溢出 Java 堆用於存儲對象實例,只要不斷增加對象,並且保證GC Roots 到對象之間有可達路徑來避免垃圾回收機制清除這些對象,那麼在對象數量達到最大堆的容量限制後就會產生OOM 異常。 要解決這個區域的異常,一般的手段是通過內

原创 重識JVM(一):運行時數據區域

記得上一次看jvm相關的知識還是在大四的時候,兩年過去了,記憶已經逐漸模糊。現在來重識一下jvm,希望溫故而知新,一些重要的知識點我會在博客上把學習的知識記錄下來。 想要了解jvm,就一定需要了解java虛擬機是如何使用內存的,要不在出現

原创 堆排序實現(java實現)

首先我們要明確一下堆排序的概念,堆排序就是利用大根堆和小根堆來實現的一種排序方法。 那麼什麼是堆呢?堆(heap)也被稱爲優先隊列(priority queue)。隊列中允許的操作是先進先出(FIFO),在隊尾插入元素,在隊頭取出元素。而

原创 快速排序(java實現)

快速排序作爲很經典的一種排序方法,我們怎麼能不掌握呢? 首先讓我們來理清快速排序的思路: 現在有一個數組如下: int[] nums = {4,1,6,2,3,7,9,8,0,5} ; 我們要使用快速排序使這個數組變的有序,從小到大或者

原创 記錄一個很小的問題

有些時候寫判斷的時候過於粗心了,今天就發現了自己的一個小問題,記下來是督促自己以後寫代碼切不可草率了,小問題可能引發大問題! public class TestClass { private Long testL = null;

原创 如何按層遍歷二叉樹【附java實現代碼】

說道遍歷二叉樹,我們很容易就會想到按照前序中序後序以及按層來遍歷二叉樹。 這篇博客主要是記錄一下按層來遍歷二叉樹的方法。 這個二叉樹按照層來遍歷的結果是 二叉樹的遍歷方法中,很多人最先想到的就是用遞歸的方法進行遍歷。二叉樹按層遍歷也同樣可

原创 【LeetCode】合併K個排序鏈表

合併 k 個排序鏈表,返回合併後的排序鏈表。請分析和描述算法的複雜度。 示例: 輸入: [   1->4->5,   1->3->4,   2->6 ] 輸出: 1->1->2->3->4->4->5->6 分治解決法(java版本):