為什么子孫后代會討厭使用java.util.Stack

在我用無意義的重言式殺死你之前,這是要點

  1. 如果您的應用程序接近實時,或者將代碼發送到Mars,則需要保留Java中默認的Stack實現。 根據LinkedList編寫您自己的版本。
  2. 同樣,如果您的應用程序是關鍵任務,并且希望堆棧由并發線程處理,則使用ConcurrentLinkedDeque或基于LinkedList編寫自己的Stack -只需確保添加和刪除操作是線程安全的即可。 這樣做時,請考慮并發鎖 。
  3. 您只需要原始電源,并且在push過程中不會被偶爾的打擾所困擾,并且您的Stack不會被并發線程操縱,然后使用ArrayDeque或繼續基于ArrayList編寫自己的Stack。
  4. 如果是多線程的,則根據ArrayQueue和util.concurrent鎖編寫自己的Stack
  5. 如果您拒絕閱讀Java Stack API和Java Deque API,而您只是個瘋子,那么請使用默認實現。 而且,我保證,當機器人占領世界時,不會顯示憐憫之心。

注意:事實是,除非出于某種原因,您想要將實現類命名為' Stack ',否則您可以自由地將所有Deque實現直接用作Stack。

既然已經對默認實現拋出了足夠多的麻煩,請注意幾分鐘,讓我快速總結一下。

我們知道Java Collection API中的Stack是從Vector內部擴展的, Vector在內部使用數組。 換句話說,Java將基于數組的實現用于其Stack

因此,讓我們看看為什么在兩個最受歡迎的Stack實現之間-數組和鏈表,Java選擇了數組。

有些答案很明顯,有些則沒有:

公平競爭

粗略地看一下數組和鏈表的addremove方法(它們是Stackpushpop方法的Struts),可以在整個板上進行恒定時間的檢索。

增長問題

數組是固定大小的,并且僅通過將數組復制到更大的數組即??可實現數組的增長 ,這并不是什么新聞。 在我們默認使用Vector實現Stack的情況下,增量容量僅為兩倍。

這只是意味著,如果我們要向堆棧中添加80個元素,則內部數組將被復制4次–分別為10、20、40和80。因此,也就是說,當我們添加第80個元素時,push操作實際上需要O(N )時間,因為在這種情況下,我們的N為80,所以使用該殘酷的深層副本將使您的程序至少稍稍停頓一下–您可以節省其他寶貴時間的寶貴小循環。

遺憾的是,與Vectors不同,您將無法指定java.util.Stack的初始大小或增量因子,因為沒有重載的構造函數。

另一方面,盡管增長經常會ArrayQueue ,但ArrayQueues的初始容量有一個甜美的重載構造函數,如果您對堆棧的大小有一個大概的了解,這將派上用場。 此外,默認初始容量是16用于ArrayQueue用于作為對10 Vector

時間和地點,我的朋友。 時間和地點

為了與數組公平,存儲在基于數組的堆棧中的對象只是對堆中實際對象(對于對象而言)或實際值(對于基元而言)的引用。

另一方面,在LinkedList的情況下,存儲項目的頂部上方有一個Node包裝器。 平均而言,每個存儲的對象(包括Node對象的內部類,鏈接到下一個Node以及對項本身的引用)將在堆中花費約40字節的額外空間。

那么,ArrayQueue或LinkedList嗎?

數組在大多數情況下都是首選的,因為它們具有占用順序存儲器的獨特優勢,并且它們提供了更快的訪問速度,而到達實際對象只是指針運算。 但是,對閾值項目(觸發調整大小的項目)的pushpop操作需要O(n)時間。 但是,平均而言,它需要花費固定時間(如果需要,可以攤銷固定時間)。

另一方面,使用LinkedList ,由于要花費更多的時間來構造新節點并指向新節點,所以add操作比數組要慢。 不用說,新節點消耗的堆空間不是實際對象消耗的空間。 但是,由于沒有大小調整(或需要順序存儲),并且總是引用第一個元素,因此最壞的情況是保證了恒定的時間。

現在,當您重新訪問本博客的第一部分時,請隨意說該死,默認實現!!!

相關鏈接 :

  • http://onjava.com/pub/a/onjava/2001/10/23/optimization.html
  • http://www.javaworld.com/javatips/jw-javatip130.html?page=1
  • http://docs.oracle.com/javase/7/docs/api/java/util/RandomAccess.html
  • http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Vector.java


參考資料: 為什么我們的JCG合作伙伴 Arun Manivannan會使用Rerun.me博客中的后代 人 討厭使用java.util.Stack 。

翻譯自: https://www.javacodegeeks.com/2012/11/why-future-generations-will-hate-you-for-using-java-util-stack.html

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

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

相關文章

play 連接mysql_Play framework 2.x 連接mysql | 學步園

筆者所使用的系統為64位 windows7。本文假設java1.5版本以上環境已經搭好,play 框架已經下載至本地。首先我們創建一個項目。命令行進入play的目錄命令:play new demo再次輸入項目名字輸入2 選擇java項目創建完成界面OK,一個play框架下的java…

rpm -e --nodeps_微課 | rpm的思維導圖

前導課程:微課 | rpm的查詢、升級與卸載命令本次微課將演示使用xmind繪制rpm思維導圖的過程,包括視頻文字,大約需要你10分鐘。另外,文末還有一則IT冷笑話,學習之余、會心一笑:)這個思維導圖將包含以下內容:…

CentOS7搭建lamp環境

Mysql安裝 CentOS 7 版本將MySQL數據庫軟件從默認的程序列表中移除,用mariadb代替了。MariaDB數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,采用GPL授權許可。開發這個分支的原因之一是:甲骨文公司收購了MySQL后&#x…

border-sizing屬性詳解和應用

box-sizing用于更改用于計算元素寬度和高度的默認的 CSS 盒子模型。它有content-box、border-box和inherit三種取值。inherit指的是從父元素繼承box-sizing表現形式,不再冗贅。1. 屬性講解 content-box 默認值,也是css2.1中的盒子模型。在計算 width和…

Couchbase:使用Twitter和Java創建大型數據集

在播放/演示Couchbase或任何其他NoSQL引擎時,創建大型數據集的一種簡單方法是將Twitter feed注入到數據庫中。 對于這個小應用程序,我正在使用: Couchbase Server 2.0服務器 Couchbase Java SDK (將由Maven安裝) T…

查找標題已知的窗口句柄,遍歷窗口控件句柄

有了回調函數的概念及上面的例子,我們可以繼續了。其實想要找到一個標題已知的窗口句柄,用一個API函數就可以了:FindWindow. 其函數原形是: function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall; lpClassName:窗口類名.如果只知道標題,可以為空.窗口類名可以…

西門子scl語言編程手冊_西門子SCL編程PEEK指令講解

單詞“peek”在英語中表示“偷看,瞥一眼”,在計算機編程中表示“讀取數據”。在西門子SCL編程中,PEEK指令可以用來讀取輸入緩存區(I)、輸出緩存區(Q)、位存儲區(M)及數據塊(DB)中的數據,常用作間接尋址。今天這篇文章,…

HTML第一章:初始HTML

設置ws字體大小&#xff1a;左上角file-->Settings--->在搜索框中輸入font網頁的第一行一定是<!DOCTYPE html>&#xff1a;網頁聲明&#xff0c;代表這個頁面是h5頁面html標簽中的leng"en"&#xff1a;意思是網頁中會用到英文 <meta>&#xff1a;…

Guava的Collections2:過濾和轉換Java集合

Groovy的便利之一是能夠通過Groovy的閉包支持輕松地對集合執行過濾和轉換操作。 Guava將對集合的過濾和轉換引入標準Java&#xff0c;這是本文的主題。 Guava的Collections2類具有兩個公共方法&#xff0c;這兩個方法都是靜態的。 方法filter&#xff08;Collection&#xff0…

釘釘機器人怎么設置自動回復_項目部署成功后觸發釘釘機器人發送消息提醒——入門配置...

釘釘建好一個群打開群設置, 找到群機器人添加一個你想要的機器人可以使用自定義自定義機器人可以自定義頭像,名字,生成一個webhook(https post的請求地址)到這里, 釘釘機器人設置好了,接下來我們對照文檔進行配置https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq/XAzBI -…

mysql加鎖語法_MySql 加鎖問題

1、設置非自動提交 set autocommit0; 這時候 for update才會起作用2、一般用法 set autocommit0; for update(加鎖) ; commit/rollback; set autocommit1;首先看一下&#xff0c;set autocommit0 后&#xff0c;執行哪些語句會自動加鎖&#xff0c;加的是什么鎖&#xff1f…

td過長,將固定寬度table撐開

解決辦法&#xff1a; 在table上加上樣式: table{table-layout:fixed;word-break:break-all} table-layout:fixed tablle的列寬由表格寬度和列寬設定。 word-break:break-all 允許在單詞內換行。 正常情況下&#xff1a; table表格中td過長&#xff1a; 加上樣式之后&#…

Spring Boot 之注解@Component @ConfigurationProperties(prefix = sms)

從spring-boot開始&#xff0c;已經支持yml文件形式的配置&#xff0c;ConfigurationProperties的大致作用就是通過它可以把properties或者yml配置直接轉成對象 例如&#xff1a; 配置文件: sms.urlXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX sms.appkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXX …

Java臨時緩存API –測試早期草案評審RI

它被稱為“ 永無止境的故事 ”。 JSR在11年半前開始運作&#xff0c;并于2001年3月6日通過了JSR 評審投票 。 如果您想知道要獲得成千上萬個低JSR編號需要什么&#xff0c;那就是秘密。 與邁克爾恩德&#xff08;Michael Ende&#xff09;的德國幻想小說不同&#xff0c;這不是…

Android幾秒后自動關閉dialog

代碼改變世界 Android幾秒后自動關閉dialog AlertDialog.Builder builder new AlertDialog.Builder(v.getContext());builder.setTitle("發送成功&#xff01;");builder.setMessage("2秒后自動關閉&#xff01;");builder.setCancelable(true);final Ale…

如何獲取注解中的值_如何在運行時利用注解信息

注解&#xff08; annontation &#xff09;是 Java 1.5 之后引入的一個為程序添加元數據的功能。注解本身并不是魔法&#xff0c;只是在代碼里添加了描述代碼自身的信息&#xff0c;至于如何理解和使用這些信息&#xff0c;則需要專門的解析代碼來負責。本文首先介紹注解的基本…

mysql5.7運行按鈕_MySQL 5.7.* 啟動問題

mysql-5.7.10-winx64啟動 mysqld.exe&#xff0c;報錯&#xff1a;mysqld: Could not create or access the registry key needed for the MySQL applicationto log to the Windows EventLog. Run the application with sufficientprivileges once to create the key, add the …

控制元素的div屬性

1、需求分析 改變元素的寬、高、顏色、顯示、重置等屬性。 2、技術分析 基礎的css、html、js 3、詳細分析 如圖&#xff0c;單擊按鈕&#xff0c;改變元素屬性: 3.1 HTML部分 根據視圖不難發現&#xff0c;內容分兩大不分:按鈕欄和效果圖&#xff0c;所以設置兩個div。 <…

使用JMeter和Yourkit進行REST / HTTP服務的性能分析

我的上一篇文章描述了如何使用JMeter完成異步REST / HTTP服務的壓力測試或負載測試。 但是&#xff0c;運行這樣的測試通常表明被測系統不能很好地應對不斷增加的負載。 現在的問題是如何找到瓶頸&#xff1f; 深入研究代碼以檢測可疑部分可能是另一種選擇。 但是考慮到潛在的…

EasyUI 加載時需要顯示和隱藏 panel(面板)內容破版問題

1.當頁面加載的完成時,如果面板中的內容是未加載的如果把他的狀態從隱藏變為顯示會導致破版,頁面信息顯示不全 2.這時需要刷新面板$(#id).panel(open).panel(refresh); 3.它就會重新加載轉載于:https://www.cnblogs.com/eagle-xie/p/6892706.html