- N +

java數(shù)組擴容 數(shù)組的擴容有幾種方式

C++如何實現(xiàn)數(shù)組添加元素

C++可以通過以下步驟來實現(xiàn)數(shù)組添加元素:1.先聲明一個新數(shù)組,長度比原數(shù)組增加1。2.將原數(shù)組中的元素復制到新數(shù)組中。3.將要添加的元素放在新數(shù)組的最后一個位置。4.釋放原數(shù)組占用的內存,將新數(shù)組的地址賦給原數(shù)組變量名。因為C++中的數(shù)組是靜態(tài)的,聲明后長度不可變。如果需要添加元素,就需要重新聲明一個新數(shù)組并將原數(shù)組中的元素復制過去,再添加新元素。這樣做的缺點是,如果數(shù)組比較大,復制和釋放內存的時間成本就會很高。因此,在實際應用中,可以考慮使用動態(tài)數(shù)組vector來替代靜態(tài)數(shù)組。vector可以動態(tài)增長,添加元素也非常方便。

redis hash擴容原理

Redis一共支持5種數(shù)據(jù)結構,hash是其中的一種,在hash擴容的時候采用的是漸進式rehash的方式。

rehash原理

字典中包含一個數(shù)據(jù)結構dictht的ht數(shù)組,一般情況下字典只是用ht[0]用來存儲數(shù)據(jù),ht[1]在rehash時使用。

隨著操作的不斷執(zhí)行,哈希表中的元素會逐漸增加或者減少,為了讓哈希表的負載因子維持在一個合理的范圍內,程序需要對哈希表的大小進行相應的擴容和收縮。步驟如下:

為ht[1]哈希表分配空間。如果是擴容操作,ht[1]的大小為第一個大于等于ht[0].used*2的2的n次方冪,如果是收縮操作,ht[1]的大小為第一個大于等于ht[0].used的2的n次方冪

將保存在ht[0]中的所有鍵值對rehash到ht[1]:rehash指的是重新計算鍵的哈希值和索引值,然后將鍵值對放到ht[1]對應位置上

當ht[0]包含的所有鍵值對都遷移到ht[1]之后,釋放ht[0],將ht[1]設置為ht[0],并在ht[1]新創(chuàng)建一個空白哈希表,為下一次rehash做準備

arraylist指定初始容量還會擴容嗎

ArrayList是經(jīng)常會被用到的,一般情況下,使用的時候會像這樣進行聲明:

ListarrayList=newArrayList();

如果像上面這樣使用默認的構造方法,初始容量被設置為10。當ArrayList中的元素超過10個以后,會重新分配內存空間,使數(shù)組的大小增長到16。

可以通過調試看到動態(tài)增長的數(shù)量變化:10->16->25->38->58->88->…

比如:

ListarrayList=newArrayList(4);

將ArrayList的默認容量設置為4。當ArrayList中的元素超過4個以后,會重新分配內存空間,使數(shù)組的大小增長到7。

可以通過調試看到動態(tài)增長的數(shù)量變化:4->7->11->17->26->…

那么容量變化的規(guī)則是什么呢?請看下面的公式:

((舊容量*3)/2)+1

一旦容量發(fā)生變化,就要帶來額外的內存開銷,和時間上的開銷。

所以,在已經(jīng)知道容量大小的情況下,推薦使用下面方式進行聲明:

ListarrayList=newArrayList(CAPACITY_SIZE);

list擴容怎么實現(xiàn)

ArrayList就是動態(tài)數(shù)組,用MSDN中的說法,就是Array的復雜版本,它提供了如下一些好處:動態(tài)的增加和減少元素實現(xiàn)了ICollection和IList接口靈活的設置數(shù)組的大小2、如何使用ArrayList最簡單的例子:ArrayListList=newArrayList();

Java ArrayList是基于數(shù)組實現(xiàn)的嗎有些數(shù)組可以存放基本類型,為什么List不可以

ArrayList相關的知識點也是java面試中最頻繁出現(xiàn)的點,下面從源碼的角度來分析下Arraylist!

1,ArrayList中的屬性:ArrayList中的屬性主要定義了一個對象數(shù)組(Object[]),大小(size),初始容量(DEFAULT_CAPACITY=10)等等,從屬性中就可以知道ArrayList的底層就是一個數(shù)組,使用泛型E來存放構造器中傳入的對象類型,當然ArrayList存放的并不是對象本身,而是對象的引用,所以ArrayList不能存放八個基本類型的數(shù)據(jù);

2,ArrayList的主要方法:從下面截圖可以看出,ArrayList中的主要方法就是元素的add(增),remove(刪),set(改),get(查),而由這四大類方法自然衍生了獲取大小,擴容,清空,包含等方法!

下面就主要方法進行分析:

1,add方法(add(i),addAll()等類似):

①,先判斷加入元素后的數(shù)組大小,如果是小于初始容量則返回初始容量,否則返回+1后的容量值;②,容量加1,同時跟未加入元素時的數(shù)組length比較,如果大于length,則使用grow方法進行擴容;

③,intnewCapacity=oldCapacity+(oldCapacity>>1);>>右移符號,相當于除二,即新容量為老容量的(1+0.5=1.5)倍,再進行判斷是否新容量已經(jīng)超限(Integer.MAX_VALUE-8),如果超限,則置為最大容量,否則使用Arrays.copyOf復制得到新數(shù)組;

2,remove方法(remove其他方法類似):

①,先判斷是否下標越界,越界拋出異常,否則繼續(xù)

②,獲取到相應下標的元素;

③,將下標后面的元素使用System.arraycopy往前移動一位;④,將遺留出的最后一位置為null,讓GC進行回收,并返回②中獲得的值;

3,get,set方法:比較簡單,就是使用指定下標進行數(shù)據(jù)替換或者獲取;

記錄幾個ArrayList中碰到的坑:

1,線程不安全:所有的數(shù)據(jù)存取都是線程不安全的,所以多線程環(huán)境要么使用Vector,要么使用CopyOnWriteArrayList;

2,Arraylist是實現(xiàn)了序列化接口的,但使用subList方法返回的是SubList對象,這個對象并沒有序列化,在網(wǎng)絡傳輸中會報錯的;

3,使用remove方法遇到的坑,因為remove方法重載了兩個,remove(inti)和remove(Objecto),如果是傳入Integer類型的參數(shù),默認調用第二個,則刪除元素失敗,案例如下:

可以說ArrayList是JAVA開發(fā)過程中最常使用的數(shù)據(jù)結構,底層實現(xiàn)也不難,但是如果不了解的話,面試容易被問倒,更多的JAVA技術會一直持續(xù)分享的,敬請關注。。。謝謝!

Java程序員跳槽如何快速全面復習面試題

建議自己整理答案,這樣有印象,也能節(jié)省時間。

2021年很多公司都在問黑紅樹,數(shù)據(jù)結構與算法一定要看哦~

Java基礎?向對象和?向過程的區(qū)別Java語?有哪些特點?關于JVMJDK和JRE最詳細通俗的解答OracleJDK和OpenJDK的對?Java和C++的區(qū)別?什么是Java程序的主類應?程序和?程序的主類有何不同?Java應?程序與?程序之間有哪些差別?字符型常量和字符串常量的區(qū)別?構造器Constructor是否可被override?重載和重寫的區(qū)別Java?向對象編程三?特性:封裝繼承多態(tài)StringStringBuffer和StringBuilder的區(qū)別是什么?String為什么是不可變的??動裝箱與拆箱在?個靜態(tài)?法內調??個?靜態(tài)成員為什么是?法的?在Java中定義?個不做事且沒有參數(shù)的構造?法的作?importjava和javax有什么區(qū)別?接?和抽象類的區(qū)別是什么?成員變量與局部變量的區(qū)別有哪些?創(chuàng)建?個對象?什么運算符?對象實體與對象引?有何不同?什么是?法的返回值?返回值在類的?法?的作?是什么??個類的構造?法的作?是什么?若?個類沒有聲明構造?法,該程序能正確執(zhí)?嗎?為什么?構造?法有哪些特性?靜態(tài)?法和實例?法有何不同對象的相等與指向他們的引?相等,兩者有什么不同?在調??類構造?法之前會先調??類沒有參數(shù)的構造?法,其?的是?==與equals(重要)hashCode與equals(重要)為什么Java中只有值傳遞?簡述線程、程序、進程的基本概念。以及他們之間關系是什么?線程有哪些基本狀態(tài)?關于fifinal關鍵字的?些總結Java中的異常處理Java序列化中如果有些字段不想進?序列化,怎么辦?獲取?鍵盤輸?常?的兩種?法Java中IO流常?關鍵字總結:static,fifinal,this,super深拷?vs淺拷?Java集合說說List,Set,Map三者的區(qū)別?Arraylist與LinkedList區(qū)別?ArrayList與Vector區(qū)別呢?為什么要?Arraylist取代Vector呢?說?說ArrayList的擴容機制吧2.2.5HashMap和Hashtable的區(qū)別HashMap和HashSet區(qū)別HashSet如何檢查重復HashMap的底層實現(xiàn)HashMap的?度為什么是2的冪次?HashMap多線程操作導致死循環(huán)問題ConcurrentHashMap和Hashtable的區(qū)別ConcurrentHashMap線程安全的具體實現(xiàn)?式/底層具體實現(xiàn)comparable和Comparator的區(qū)別集合框架底層數(shù)據(jù)結構總結如何選?集合?多線程什么是線程和進程?請簡要描述線程與進程的關系,區(qū)別及優(yōu)缺點?說說并發(fā)與并?的區(qū)別?為什么要使?多線程呢?使?多線程可能帶來什么問題?說說線程的?命周期和狀態(tài)?什么是上下?切換?什么是線程死鎖?如何避免死鎖?說說sleep()?法和wait()?法區(qū)別和共同點?為什么我們調?start()?法時會執(zhí)?run()?法,為什么我們不能直接調?run()?法?說?說??對于synchronized關鍵字的了解說說??是怎么使?synchronized關鍵字,在項?中?到了嗎synchronized關鍵字最主要的三種使??式講?下synchronized關鍵字的底層原理說說JDK1.6之后的synchronized關鍵字底層做了哪些優(yōu)化,可以詳細介紹?下這些優(yōu)化嗎談談synchronized和ReentrantLock的區(qū)別講?下Java內存模型說說synchronized關鍵字和volatile關鍵字的區(qū)別ThreadLocal原理及ThreadLocal內存泄露問題實現(xiàn)Runnable接?和Callable接?的區(qū)別執(zhí)?execute()?法和submit()?法的區(qū)別是什么呢?線程池原理分析能不能給我簡單介紹?下AtomicInteger類的原理AQS原理分析JVM介紹下Java內存區(qū)域(運?時數(shù)據(jù)區(qū))說?下Java對象的創(chuàng)建過程對象的訪問定位有哪兩種?式?說?下堆內存中對象的分配的基本策略MinorGc和FullGC有什么不同呢?如何判斷對象是否死亡?(兩種?法)簡單的介紹?下強引?,軟引?,弱引?,虛引?如何判斷?個常量是廢棄常量?如何判斷?個類是??的類?垃圾收集有哪些算法,各?的特點?HotSpot為什么要分為新?代和?年代?常見的垃圾回收器有哪些?類加載過程網(wǎng)絡OSI與TCP/IP各層的結構與功能,都有哪些協(xié)議?TCP三次握?和四次揮?(?試常客)TCP,UDP協(xié)議的區(qū)別TCP協(xié)議如何保證可靠傳輸ARQ協(xié)議滑動窗?和流量控制擁塞控制在瀏覽器中輸?url地址ijk顯示主?的過程(?試常客)狀態(tài)碼各種協(xié)議與HTTP協(xié)議之間的關系HTTP?連接,短連接HTTP是不保存狀態(tài)的協(xié)議,如何保存?戶狀態(tài)?Cookie的作?是什么?和Session有什么區(qū)別?HTTP1.0和HTTP1.1的主要區(qū)別是什么?URI和URL的區(qū)別是什么?HTTP和HTTPS的區(qū)別?數(shù)據(jù)結構Java集合框架中的隊列QueueHashSet和TreeSet底層數(shù)據(jù)結構List的常?實現(xiàn)類ArrayList和LinkedList源碼學習Map?叉樹完全?叉樹滿?叉樹堆?叉查找樹(BST)平衡?叉樹(Self-balancingbinarysearchtree)紅?樹B-,B+,B*樹LSM樹算法?道常?的字符串算法題總結最?公共前綴回?串兩數(shù)相加翻轉鏈表鏈表中倒數(shù)第k個節(jié)點刪除鏈表的倒數(shù)第N個節(jié)點合并兩個排序的鏈表劍指offer部分編程題跳臺階問題變態(tài)跳臺階問題?維數(shù)組查找替換空格題?描述:數(shù)值的整數(shù)次?調整數(shù)組順序使奇數(shù)位于偶數(shù)前?鏈表中倒數(shù)第k個節(jié)點反轉鏈表合并兩個排序的鏈表?兩個棧實現(xiàn)隊列棧的壓?,彈出序列數(shù)據(jù)庫MySQL存儲引擎字符集及校對規(guī)則索引查詢緩存的使?什么是事務?事物的四?特性(ACID)并發(fā)事務帶來哪些問題?事務隔離級別有哪些?MySQL的默認隔離級別是?鎖機制與InnoDB鎖算法?表優(yōu)化解釋?下什么是池化設計思想。什么是數(shù)據(jù)庫連接池?為什么需要數(shù)據(jù)庫連接池?分庫分表之后,id主鍵如何處理??條SQL語句在MySQL中如何執(zhí)?的MySQL?性能優(yōu)化規(guī)范建議?條SQL語句執(zhí)?得很慢的原因有哪些?Redis為什么要?redis/為什么要?緩存為什么要?redis?不?map/guava做緩存?redis的線程模型redis和memcached的區(qū)別redis常?數(shù)據(jù)結構以及使?場景分析redis設置過期時間redis內存淘汰機制(MySQL?有2000w數(shù)據(jù),Redis中只存20w的數(shù)據(jù),如何保證Redis中的數(shù)據(jù)都是熱點數(shù)據(jù)?)redis持久化機制(怎么保證redis掛掉之后再重啟數(shù)據(jù)可以進?恢復)redis事務緩存雪崩和緩存穿透問題解決?案如何解決Redis的并發(fā)競爭Key問題如何保證緩存與數(shù)據(jù)庫雙寫時的數(shù)據(jù)?致性?Spring什么是Spring框架?列舉?些重要的Spring模塊?@RestControllervs@Controller講一下SpringIoC和AOPSpring中的bean的作?域有哪些?Spring中的單例bean的線程安全問題了解嗎?@Component和@Bean的區(qū)別是什么?將?個類聲明為Spring的bean的注解有哪些?Spring中的bean?命周期?SpringMVC?作原理了解嗎?Spring框架中?到了哪些設計模式?Spring事務中的隔離級別有哪?種?Spring事務中哪?種事務傳播?為?@Transactional(rollbackFor=Exception.class)注解了解嗎?如何使?JPA在數(shù)據(jù)庫中?持久化?個字段?MyBatis#{}和${}的區(qū)別是什么?Xml映射?件中,除了常?的select|insert|updae|delete標簽之外,還有哪些標簽?最佳實踐中,通常?個Xml映射?件,都會寫?個Dao接?與之對應,請問,這個Dao接?的?作原理是什么?Dao接??的?法,參數(shù)不同時,?法能重載嗎?Mybatis是如何進?分?的?分?插件的原理是什么?簡述Mybatis的插件運?原理,以及如何編寫?個插件。Mybatis執(zhí)?批量插?,能返回數(shù)據(jù)庫主鍵列表嗎?Mybatis動態(tài)sql是做什么的?都有哪些動態(tài)sql?能簡述?下動態(tài)sql的執(zhí)?原理不?Mybatis是如何將sql執(zhí)?結果封裝為?標對象并返回的?都有哪些映射形式?Mybatis能執(zhí)??對?、?對多的關聯(lián)查詢嗎?都有哪些實現(xiàn)?式,以及它們之間的區(qū)別。Mybatis是否?持延遲加載?如果?持,它的實現(xiàn)原理是什么?Mybatis的Xml映射?件中,不同的Xml映射?件,id是否可以重復?Mybatis中如何執(zhí)?批處理?Mybatis都有哪些Executor執(zhí)?器?它們之間的區(qū)別是什么?Mybatis中如何指定使?哪?種Executor執(zhí)?器?Mybatis是否可以映射Enum枚舉類?Mybatis映射?件中,如果A標簽通過include引?了B標簽的內容,請問,B標簽能否定義在A標簽的后?,還是說必須定義在A標簽的前??簡述Mybatis的Xml映射?件和Mybatis內部數(shù)據(jù)結構之間的映射關系?為什么說Mybatis是半?動ORM映射?具?它與全?動的區(qū)別在哪??KafkaKafka是什么?主要應?場景有哪些?和其他消息隊列相?,Kafka的優(yōu)勢在哪??隊列模型了解嗎?Kafka的消息模型知道嗎?什么是Producer、Consumer、Broker、Topic、Partition?Kafka的多副本機制了解嗎?帶來了什么好處?Zookeeper在Kafka中的作?知道嗎?Kafka如何保證消息的消費順序?Kafka如何保證消息不丟失Kafka如何保證消息不重復消費NettyNetty是什么?為什么要?Netty?Netty應?場景了解么?Netty核?組件有哪些?分別有什么作??EventloopGroup了解么?和EventLoop啥關系?Bootstrap和ServerBootstrap了解么?NioEventLoopGroup默認的構造函數(shù)會起多少線程?Netty線程模型了解么?Netty服務端和客戶端的啟動過程了解么?什么是TCP粘包/拆包?有什么解決辦法呢?Netty?連接、?跳機制了解么?Netty的零拷?了解么?

尚硅谷Java大廠面試題第3季,跳槽必刷題目+必掃技術盲點(周陽主講)_嗶哩嗶哩_bilibili

https://www.bilibili.com/video/BV1Hy4y1B78T?

尚硅谷Java大廠面試題第2季,面試必刷,跳槽大廠神器_嗶哩嗶哩_bilibili

https://www.bilibili.com/video/BV18b411M7xz?

尚硅谷經(jīng)典Java面試題第一季(java面試精講)_嗶哩嗶哩_bilibili

https://www.bilibili.com/video/BV1Eb411P7bP?

強烈推薦一個網(wǎng)站:

Java面試題-幫助你通過Java面試(zwmst.com)

https://zwmst.com/

返回列表
上一篇:
下一篇: