Java數據結構之線性表(2)

從這里開始將要進行Java數據結構的相關講解,Are you ready?Let's go~~

java中的數據結構模型可以分為一下幾部分:

1.線性結構

2.樹形結構

3.圖形或者網狀結構

接下來的幾張,我們將會分別講解這幾種數據結構,主要也是通過Java代碼的方式來講解相應的數據結構。

今天要講解的是:Java線性結構

Java數據結構之線性結構

說到線性結構的話,我們可以根據其實現方式分為兩類:

1)順序結構的線性表

2)鏈式結構的線性表

3)棧和隊列的線性表

對于1)和2)的講解,請參考下面的地址:http://www.cnblogs.com/xiohao/p/4353910.html

下面主要講解線性結構中的棧和隊列。

? 1.線性結構之棧的講解

??? 所謂棧是一種特殊的線性結構,它的特點在于只允許我們在線性表的尾端進行insert和remove操作。可以理解為是一種受限的

??? 線性表。往線性表中加入一個元素我們稱為入棧,從線性表中移除一個元素我們稱為出棧。實在不懂,百度一下你就知道了。

??? 在Java的jdk中的實現以Stack(底層繼承的是Vector類)和LinkedList(里面同樣實現了push,pop,peek等操作)為主,還是那句話,感興趣的

??? 自己查看源代碼即可。

??? 下面我們進行相關模仿,

??? 首先通過數組來模仿入棧和出棧操作:

????

package com.yonyou.test;import java.util.Arrays;/*** 測試類* @author 小浩* @創建日期 2015-3-20*/
public class Test{ public static void main(String[] args) {SequenceStack<String> stack=new SequenceStack<String>();System.out.println("順序棧的初始化長度為:"+stack.length());stack.push("Hello");stack.push("World");stack.push("天下太平");System.out.println("當前stack中的元素為:"+stack);System.out.println("當前stack.peek();中的元素為:"+stack.peek());System.out.println("當前元素線性表是否為空:"+stack.empty());}}/*** 創建一個線性棧* 注意這個類是線程不安全的,在多線程下不要使用* @author 小浩* @創建日期 2015-3-20* @param <T>*/
class SequenceStack<T>
{//線性棧的默認長度為10private int DEFAULT_SIZE = 10;// 保存數組的長度。private int capacity;// 定義當底層數組容量不夠時,程序每次增加的數組長度private int capacityIncrement = 0;// 定義一個數組用于保存順序棧的元素private Object[] elementData;// 保存順序棧中元素的當前個數private int size = 0;/*** 以默認數組長度創建空順序棧*/public SequenceStack(){capacity = DEFAULT_SIZE;elementData = new Object[capacity];}/*** 	以一個初始化元素來創建順序棧* @param element*/public SequenceStack(T element){this();elementData[0] = element;size++;}/*** 以指定長度的數組來創建順序棧* @param element 指定順序棧中第一個元素* @param initSize 指定順序棧底層數組的長度*/public SequenceStack(T element , int initSize){this.capacity = initSize;elementData = new Object[capacity];elementData[0] = element;size++;}/*** 以指定長度的數組來創建順序棧* @param element 指定順序棧中第一個元素* @param initSize 指定順序棧底層數組的長度* @param capacityIncrement 指定當順序棧的底層數組的長度不夠時,底層數組每次增加的長度*/public SequenceStack(T element , int initSize, int capacityIncrement){this.capacity = initSize;this.capacityIncrement = capacityIncrement;elementData = new Object[capacity];elementData[0] = element;size++;}/*** 獲取順序棧的大小* @return*/public int length(){return size;}/*** 入棧* @param element*/public void push(T element){ensureCapacity(size + 1);elementData[size++] = element;}/*** 很麻煩,而且性能很差* @param minCapacity*/private void ensureCapacity(int minCapacity){// 如果數組的原有長度小于目前所需的長度if (minCapacity > capacity){if (capacityIncrement > 0){while (capacity < minCapacity){// 不斷地將capacity長度加capacityIncrement,// 直到capacity大于minCapacity為止capacity += capacityIncrement;}}else{// 不斷地將capacity * 2,直到capacity大于minCapacity為止while (capacity < minCapacity){capacity <<= 1;}}elementData = Arrays.copyOf(elementData , capacity);}}/*** 出棧* @return*/@SuppressWarnings("unchecked")public T pop(){T oldValue = (T)elementData[size - 1];// 釋放棧頂元素elementData[--size] = null;return oldValue;}/*** 返回棧頂元素,但不刪除棧頂元素* @return*/@SuppressWarnings("unchecked")public T peek(){return (T)elementData[size - 1];}/*** 判斷順序棧是否為空棧* @return*/public boolean empty(){return size == 0;}/*** 清空順序棧*/public void clear(){// 將底層數組所有元素賦為nullArrays.fill(elementData , null);size = 0;}/*** 重寫toString*/public String toString(){if (size == 0){return "[]";}else{StringBuilder sb = new StringBuilder("[");for (int i = size - 1  ; i > -1 ; i-- ){sb.append(elementData[i].toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}}
}

?

?? 其次通過鏈式存儲來模仿入棧和出棧操作,具體內容可以看下面的代碼:

??

package com.yonyou.test;/*** 測試類* @author 小浩* @創建日期 2015-3-20*/
public class Test{ public static void main(String[] args) {LinkStack<String> stack=new LinkStack<String>();System.out.println("順序棧的初始化長度為:"+stack.length());stack.push("Hello");stack.push("World");stack.push("天下太平");System.out.println("當前stack中的元素為:"+stack);System.out.println("當前stack.peek();中的元素為:"+stack.peek());System.out.println("當前元素線性表是否為空:"+stack.empty());}}/*** 創建一個鏈式存儲的線性棧* 注意這個類是線程不安全的,在多線程下不要使用* @author 小浩* @創建日期 2015-3-20* @param <T>*/
class  LinkStack<T>
{// 定義一個內部類Node,Node實例代表鏈棧的節點。private class Node{// 保存節點的數據private T data;// 指向下個節點的引用private Node next;// 無參數的構造器public Node(){}// 初始化全部屬性的構造器public Node(T data , Node next){this.data = data;this.next = next;}}// 保存該鏈棧的棧頂元素private Node top;// 保存該鏈棧中已包含的節點數private int size;/*** 創建空鏈棧*/public LinkStack(){// 空鏈棧,top的值為nulltop = null;}/*** 以指定數據元素來創建鏈棧,該鏈棧只有一個元素* @param element*/public LinkStack(T element){top = new Node(element , null);size++;}/*** 返回鏈棧的長度* @return*/public int length(){return size;}/*** 進棧* @param element*/public void push(T element){// 讓top指向新創建的元素,新元素的next引用指向原來的棧頂元素top = new Node(element , top);size++;}/*** 出棧* @return*/public T pop(){Node oldTop = top;// 讓top引用指向原棧頂元素的下一個元素top = top.next;// 釋放原棧頂元素的next引用oldTop.next = null;size--;return oldTop.data;}/*** 訪問棧頂元素,但不刪除棧頂元素* @return*/public T peek(){return top.data;}/*** 判斷鏈棧是否為空棧* @return*/public boolean empty(){return size == 0;}/*** 清空鏈棧*/public void clear(){// 將底層數組所有元素賦為nulltop = null;size = 0;}/*** 重寫toString方法*/public String toString(){// 鏈棧為空鏈棧時if (empty()){return "[]";}else{StringBuilder sb = new StringBuilder("[");for (Node current = top ; current != null; current = current.next ){sb.append(current.data.toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}}
}

?

? 2.線性結構之隊列的講解

??? 隊列也是一種被限制過的線性結構,它使用固定的一端來插入元素(隊尾),在另一端刪除相關的元素(隊頭)。

??? 其基本特征為“先進先出”,而棧的基本特點為“先進后出”。

??? 在Java的jdk中主要的實現類為Dueue接口的實現類ArrayDeque(線性)和LinkedList(鏈式),

??? 其中Dueue接口是一個雙端隊列,它繼承了隊列根接口Queue,同時Queue接口有實現隊列的6個根本方法

???

?拋出異常的版本不拋出異常的版本(返回null)
插入1、 boolean add(E e);?2、 boolean offer(E e);
移除3、 E remove();?4、 E poll();
訪問5、 E element();?6、 E peek();

???

???

????如果感興趣的話,請查相關的源代碼。

??? 首先講解的是隊列的順序存儲:

??? 具體內容請看相關代碼:

???

package com.yonyou.test;import java.util.Arrays;/*** 測試類* @author 小浩* @創建日期 2015-3-20*/
public class Test{ public static void main(String[] args) {SequenceQueue<String> queue=new SequenceQueue<String>();System.out.println("隊列的初始化長度為:"+queue.length());queue.add("Hello");queue.add("World");queue.add("天下太平");System.out.println("當前stack中的元素為:"+queue);queue.remove();System.out.println("當前stack中的元素為:"+queue);System.out.println("當前元素線性表是否為空:"+queue.empty());}}/*** 創建一個存儲的線性隊列* 注意這個類是線程不安全的,在多線程下不要使用* @author 小浩* @創建日期 2015-3-20* @param <T>*/
class  SequenceQueue<T>
{//線性隊列的默認長度private int DEFAULT_SIZE = 16;// 保存數組的長度。private int capacity;// 定義一個數組用于保存順序隊列的元素private Object[] elementData;// 保存順序隊列中元素的當前個數private int front = 0;private int rear = 0;/*** 以默認數組長度創建空順序隊列*/public SequenceQueue(){capacity = DEFAULT_SIZE;elementData = new Object[capacity];}/*** 以一個初始化元素來創建順序隊列* @param element*/public SequenceQueue(T element){this();elementData[0] = element;rear++;}/*** 以指定長度的數組來創建順序隊列* @param element 指定順序隊列中第一個元素* @param initSize 指定順序隊列底層數組的長度*/public SequenceQueue(T element , int initSize){this.capacity = initSize;elementData = new Object[capacity];elementData[0] = element;rear++;}/*** 獲取順序隊列的大小* @return*/public int length(){return rear - front;}/*** 插入隊列* @param element*/public void add(T element){if (rear > capacity - 1){throw new IndexOutOfBoundsException("隊列已滿的異常");}elementData[rear++] = element;}/*** 移出隊列* @return*/@SuppressWarnings("unchecked")public T remove(){if (empty()){throw new IndexOutOfBoundsException("空隊列異常");}// 保留隊列的front端的元素的值T oldValue = (T)elementData[front];// 釋放隊列的front端的元素elementData[front++] = null;return oldValue;}/*** 返回隊列頂元素,但不刪除隊列頂元素* @return*/@SuppressWarnings("unchecked")public T element(){if (empty()){throw new IndexOutOfBoundsException("空隊列異常");}return (T)elementData[front];}/*** 判斷順序隊列是否為空隊列* @return*/public boolean empty(){return rear == front;}/**清空順序隊列* */public void clear(){//將底層數組所有元素賦為nullArrays.fill(elementData , null);front = 0;rear = 0;}/*** 重寫toString方法*/public String toString(){if (empty()){return "[]";}else{StringBuilder sb = new StringBuilder("[");for (int i = front  ; i < rear ; i++ ){sb.append(elementData[i].toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}}
}

?

  其次講解的是隊列的線性存儲的循環組成:

???? 對于上面的非循環存儲可能會非常大的浪費空間,下面我們將要創建一個對應的循環鏈表的概念,這樣的話可能會有效的節約相應的空間。

???? 因為循環鏈表可以有效的消除假滿的現象哦。

?????廢話不在多說,請看代碼:

?????

package com.yonyou.test;import java.util.Arrays;/*** 測試類* @author 小浩* @創建日期 2015-3-20*/
public class Test{ public static void main(String[] args) {LoopQueue<String> queue=new LoopQueue<String>();System.out.println("隊列的初始化長度為:"+queue.length());queue.add("Hello");queue.add("World");queue.add("天下太平");System.out.println("當前stack中的元素為:"+queue);queue.remove();System.out.println("當前stack中的元素為:"+queue);System.out.println("當前元素線性表是否為空:"+queue.empty());}}/*** 創建一個順序存儲的循環線性隊列* 注意這個類是線程不安全的,在多線程下不要使用* @author 小浩* @創建日期 2015-3-20* @param <T>*/
class LoopQueue<T>
{//循環隊列的默認長度為16private int DEFAULT_SIZE = 16;// 保存數組的長度。private int capacity;// 定義一個數組用于保存循環隊列的元素private Object[] elementData;// 保存循環隊列中元素的當前個數private int front = 0;private int rear = 0;/*** 以默認數組長度創建空循環隊列*/public LoopQueue(){capacity = DEFAULT_SIZE;elementData = new Object[capacity];}/*** 以一個初始化元素來創建循環隊列* @param element*/public LoopQueue(T element){this();elementData[0] = element;rear++;}/*** 以指定長度的數組來創建循環隊列* @param element 指定循環隊列中第一個元素* @param initSize 指定循環隊列底層數組的長度*/public LoopQueue(T element , int initSize){this.capacity = initSize;elementData = new Object[capacity];elementData[0] = element;rear++;}/*** 獲取循環隊列的大小* @return*/public int length(){if (empty()){return 0;}return rear > front ? rear - front: capacity - (front - rear);}/*** 插入隊列* @param element*/public void add(T element){if (rear == front&& elementData[front] != null){throw new IndexOutOfBoundsException("隊列已滿的異常");}elementData[rear++] = element;// 如果rear已經到頭,那就轉頭rear = rear == capacity ? 0 : rear;}/*** 移出隊列* @return*/@SuppressWarnings("unchecked")public T remove(){if (empty()){throw new IndexOutOfBoundsException("空隊列異常");}// 保留隊列的front端的元素的值T oldValue = (T)elementData[front];// 釋放隊列的front端的元素elementData[front++] = null;// 如果front已經到頭,那就轉頭front = front == capacity ? 0 : front;return oldValue;}/*** 返回隊列頂元素,但不刪除隊列頂元素* @return*/@SuppressWarnings("unchecked")public T element(){if (empty()){throw new IndexOutOfBoundsException("空隊列異常");}return (T)elementData[front];}/*** 判斷循環隊列是否為空隊列* @return*/public boolean empty(){//rear==front且rear處的元素為nullreturn rear == front&& elementData[rear] == null;}/*** 清空循環隊列*/public void clear(){// 將底層數組所有元素賦為nullArrays.fill(elementData , null);front = 0;rear = 0;}/*** 重寫toString方法*/public String toString(){if (empty()){return "[]";}else{// 如果front < rear,有效元素就是front到rear之間的元素if (front < rear){StringBuilder sb = new StringBuilder("[");for (int i = front  ; i < rear ; i++ ){sb.append(elementData[i].toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}// 如果front >= rear,有效元素為front->capacity之間、// 和0->front之間的元素else{StringBuilder sb = new StringBuilder("[");for (int i = front  ; i < capacity ; i++ ){sb.append(elementData[i].toString() + ", ");}for (int i = 0 ; i < rear ; i++){sb.append(elementData[i].toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}}}
}

?

  最后要說的隊列的鏈式存儲,具體的實現方式還是請看代碼吧。

??????

package com.yonyou.test;import java.util.Arrays;/*** 測試類* @author 小浩* @創建日期 2015-3-20*/
public class Test{ public static void main(String[] args) {LinkQueue<String> queue=new LinkQueue<String>();System.out.println("隊列的初始化長度為:"+queue.length());queue.add("Hello");queue.add("World");queue.add("天下太平");System.out.println("當前stack中的元素為:"+queue);queue.remove();System.out.println("當前stack中的元素為:"+queue);System.out.println("當前元素線性表是否為空:"+queue.empty());}}/*** 創建一個鏈式存儲的線性隊列* 注意這個類是線程不安全的,在多線程下不要使用* @author 小浩* @創建日期 2015-3-20* @param <T>*/
//定義一個內部類Node,Node實例代表鏈隊列的節點。
class LinkQueue<T>{private class Node{// 保存節點的數據private T data;// 指向下個節點的引用private Node next;// 無參數的構造器public Node(){}// 初始化全部屬性的構造器public Node(T data ,  Node next){this.data = data;this.next = next;}}// 保存該鏈隊列的頭節點private Node front;// 保存該鏈隊列的尾節點private Node rear;// 保存該鏈隊列中已包含的節點數private int size;/*** 創建空鏈隊列*/public LinkQueue(){// 空鏈隊列,front和rear都是nullfront = null;rear = null;}/*** 以指定數據元素來創建鏈隊列,該鏈隊列只有一個元素* @param element*/public LinkQueue(T element){front = new Node(element , null);// 只有一個節點,front、rear都指向該節點rear = front;size++;}/*** 返回鏈隊列的長度* @return*/public int length(){return size;}/*** 將新元素加入隊列* @param element*/public void add(T element){// 如果該鏈隊列還是空鏈隊列if (front == null){front = new Node(element , null);// 只有一個節點,front、rear都指向該節點rear = front;}else{// 創建新節點Node newNode = new Node(element , null);// 讓尾節點的next指向新增的節點rear.next = newNode;// 以新節點作為新的尾節點rear = newNode;}size++;}/*** 刪除隊列front端的元素* @return*/public T remove(){Node oldFront = front;front = front.next;oldFront.next = null;size--;return oldFront.data;}/***  訪問鏈式隊列中最后一個元素* @return*/public T element(){return rear.data;}/*** 判斷鏈式隊列是否為空隊列* @return*/public boolean empty(){return size == 0;}/*** 清空鏈隊列*/public void clear(){// 將front、rear兩個節點賦為nullfront = null;rear = null;size = 0;}/*** 重寫toString方法*/public String toString(){// 鏈隊列為空鏈隊列時if (empty()){return "[]";}else{StringBuilder sb = new StringBuilder("[");for (Node current = front ; current != null; current = current.next ){sb.append(current.data.toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}}
}

??

?? 這里還是補充一下吧,除了以上介紹的隊列外,我們還可以經用到的一個隊列是雙端隊列。

? ?所謂雙端隊列指的是我們可以在隊列的兩端進行插入和刪除操作。如果我們只允許在隊列的一端進行插入和刪除的操作,那么隊列也就成為

?? 我們之前看到的棧了,是不是很有意思,沒錯就是這樣的。其實棧,隊列其本質都是一種受限制的線性表,只好不過限制的情況不同而已。

?? 還需要說的jdk中Deque接口就是一個雙端隊列的實用接口。它可以理解為Queue和Stack的一個中和體。雖然上面的棧提到了類Stack,

?? 但是現在已經不推薦使用了,一般情況,我們應該使用Deque,因為它的功能更加強大。

?? 在jdk中雙端隊列接口Deque有兩個實現類ArrayDeque(順序存儲的雙端隊列)和LinkedList(鏈式存儲的雙端隊列)

? 是不是發現了LinkedList的功能太強大了。沒錯,它就是這么任性,沒辦法。

? 下面的看一下它的部分源代碼:

?

* @since 1.2* @param <E> the type of elements held in this collection*/public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable

?

  implements List<E>, Deque<E>, Cloneable, java.io.Serializable

???? 看到紅色字體了了吧,剩下你懂的~~

??? 好吧,今天就先到這里吧~~~

?

?

  

?

??????

????

?

???

  

?

??

  

?

???

???

???

???

轉載于:https://www.cnblogs.com/xiohao/p/4354276.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248417.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248417.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248417.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

涼哥核心圈程序員必備十大圖書推薦(一)

寫在前面 涼哥核心圈程序員必備十大圖書推薦&#xff08;一&#xff09;&#xff0c;各位伙伴應該一目了然了哈&#xff0c;沒錯涼哥準備出一系列圖書推薦的文章&#xff0c;其實很多朋友在私下問涼哥除了大學的課程外自己要不要讀一些技術類的書籍呢&#xff0c;答案當時要的…

了解大數據的特點、來源與數據呈現方式

本次作業來源于&#xff1a;https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2639 1.瀏覽2019春節各種大數據分析報告&#xff0c;例如&#xff1a; 這世間&#xff0c;再無第二個國家有能力承載如此龐大的人流量。http://www.sohu.com/a/290025769_313993春節人口遷…

MYSQL中只知表名查詢屬于哪個SCHEMA

只知道表名XXX查該表屬于哪個schema、以及該表有哪些列等信息SELECT * from information_schema.columns WHERE table_name xxx; 只知道列名XXX查哪個schema有該列、以及有列名為XXX的表有哪些等SELECT * from information_schema.columns WHERE column_name XXX;參考鏈接&am…

ACCESS SQL語法參考

ACCESS SQL語法參考 一. 基礎概念 可以使用的數據類型如下&#xff1a; 1. TEXT&#xff1a;文本型&#xff08;指定長度時&#xff09;&#xff0c;備注型&#xff08;不指定長度時&#xff09;&#xff1b; 2. CHAR&#xff0c;NCHAR&#xff0c;VARCHAR&#xff0…

強大而優雅,API 研發管理 EOLINKER 新版正式發布!

EOLINKER 于2019年3月3日正式發布新版本&#xff01;該版本大幅強化各個產品的功能、著重優化了全站的用戶交互體驗&#xff0c;并且EOLINKER AMS 產品正式更名為 EOLINKER API Studio ——API 工作室&#xff0c;旨在為您提供API文檔管理、自動化測試以及開發協作等全方位服務…

關注視聊效果!中星微攝像頭對比測試

不知不覺中&#xff0c;一種小型的數碼產品不聲不響的潛入了大多數網民的家庭——攝像頭&#xff0c;這種令網絡世界變得活潑、生動、直觀的小東西給我們帶來了一陣視頻的風&#xff0c;它的背后隱藏著什么&#xff1f;讓我們揭開背后的秘密&#xff0c;撩起那視頻的面紗。 現今…

MarkDown語法-使用博客園的markDown編輯

一個是一個大標題 兩個是一個小標題 是三級標題 最高階標題加下劃線 高階標題加雙下劃線 是二階標題二階標題區塊引用blockquotes 換行也是沒有關系的啦啦啦啦啦啦啦啦綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠啦啦啦啦啦啦啦啦綠綠了 區塊引用可以嵌套 嵌套 標題區塊引用…

版本控制--搭建 GitLab 服務器

GitLab 簡介 GitLab 是利用 Ruby On Rails 一個開源的版本管理系統&#xff0c;實現一個自托管的 Git 項目倉庫&#xff0c;可通過 Web 界面進行訪問公開的或者私人項目。它擁有與 GitHub 類似的功能&#xff0c;能夠瀏覽源代碼&#xff0c;管理缺陷和注釋。可以管理團隊對倉庫…

MATLAB 與 Excel 接口

MATLAB 與 Excel 接口MATLAB 與 Excel 有兩種接口方式&#xff1a;一種是通過 MATLAB 提供的 Excel 生成器&#xff0c;生成220 MATLAB 實用教程DLL 組件和 VBA 代碼&#xff0c;實現 Excel 對 MATLAB 的調用&#xff1b;另一種是利用 MATLAB 提供的 Excellink 插件&#xff0c…

計算 1+2!+3!+4!+...20!=?

package algs.factorial;import java.math.BigInteger;/*** Author: areful* Date: 2019/3/6* 計算 sum(n!), n1,2, ... 20*/ public class NFactorial {public static void main(String[] args) {System.out.println(calcFactorial0(3));System.out.println(calcFactorial1(3)…

轉大學畢業后拉開差距的原因

原文 有人工作&#xff0c;有人繼續上學&#xff0c;大家千萬不要錯過這篇文章&#xff0c;能看到這篇文章也是一種幸運&#xff0c;真的受益匪淺&#xff0c;對我有很大啟迪&#xff0c;這篇文章將會改變我的一生&#xff0c;真的太好了&#xff0c;希望與有緣人分享&…

用戶態和內核態的理解和區別

1、linux進程有4GB地址空間&#xff0c;如圖所示&#xff1a;3G-4G大部分是共享的&#xff0c;是內核態的地址空間。這里存放整個內核的代碼和所有的內核模塊以及內核所維護的數據。2、特權級的概念&#xff1a;對于任何操作系統來說&#xff0c;創建一個進程是核心功能。創建進…

面經-多益網絡

面試時間&#xff1a;2019.07.22 QQ視頻面試 面試崗位&#xff1a;人工智能及大數據/一面 面試時長&#xff1a;35分鐘 面試內容&#xff1a; 自我介紹項目-視頻召回實際場景題-怎么通過數學公式查找相似的數學公式對加班怎么看對比實習公司的特點主動詢問落地方向面試評價&…

區塊鏈基礎語言(三)——Go語言開發工具

一、在Windows系統安裝Goland 1.1 下載 官網地址&#xff1a;https://www.jetbrains.com/go/download/#sectionwindows 1.2 安裝 a. 雙擊“goland-2018.1.5.exe”&#xff0c;單擊“運行”&#xff0c;如圖1所示&#xff1b; <圖1> b. 如圖2所示&#xff0c;單擊“next”…

最小的K個數

最小的K個數 題目描述 輸入n個整數&#xff0c;找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字&#xff0c;則最小的4個數字是1,2,3,4,。 未完, 待續, 好像設計堆排序 先排序在遍歷, 此處使用插曲排序 class Solution { public:void insertSort(vector<int> &am…

準備重新開始寫了

工作很忙,而且前一段時間項目組由于方向和人員調整一直很動蕩,所以就沒有心情和時間來整理技術.準備重新開張了,好好寫,爭取每個月出一到兩篇說得過去的文章.轉載于:https://www.cnblogs.com/sun/archive/2008/06/12/1218220.html

Georgia and Bob POJ - 1704 階梯Nim

$ \color{#0066ff}{ 題目描述 }$ Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, number the grids from left to right by 1, 2, 3, ..., and place N chessmen on different grids, as shown in the following figure for exampl…

Tomcat總結

Tomcat調優原理&#xff1a; 1、增加最大連接數&#xff08;增大值避免隊列請求過多&#xff0c;導致響應緩慢&#xff09; 2、調整工作模式 Bio(BlockingI/O)&#xff1a;默認工作模式&#xff0c;阻塞式I/O操作&#xff0c;沒有任何優化技術處理&#xff0c;性能比較低。Nio(…

Android中寫文本文件的方法

下面是我在Android開發中&#xff0c;一個寫文本文件的方法&#xff0c;代碼如下&#xff1a; //將字符串寫入到文本文件中 public static void WriteTxtFile(String strcontent,String strFilePath) { //每次寫入時&#xff0c;都換行寫 String strConten…

前端筆記-jquery

jquery簡介 兼容性強,輕量級庫,js的框架,國外的大神寫好我們只要調用就好了,jquery可以把js寫的更加簡單 jquery使用 <script srcjquery-x.x.x.js></script> 引入文件就行了 jquery語法 $(selector).action() jquery選擇器 1.基本選擇器 $("*") $(&quo…