在回顾js数据结构,写《再谈js对象数据结构底层实现原理-object array map set》系列的时候,在来整理下java的数据结构。
java把内存分两种:一种是栈内存,另一种是堆内存
基本类型都有对应的包装类:如int对应Integer类,double对应Double类等,基本类型的定义都是直接在栈中,如果用包装类来创建对象,就和普通对象一样了。例如:int i=0;i直接存储在栈中。Integer i(i此时是对象)= new Integer(5);这样,i对象数据存储在堆中,i的引用存储在栈中,通过栈中的引用来操作对象。大量使用字符串处理,避免使用String,应大量使用StringBuffer,因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象
当定义一个数组,int x[];或int[] x;时,在栈内存中创建一个数组引用,通过该引用(即数组名)来引用数组。x=new int3;将在堆内存中分配3个保存 int型数据的空间,堆内存的首地址放到栈内存中,每个数组元素被初始化为0。
用static的修饰的变量和方法,实际上是指定了这些变量和方法在内存中的”固定位置”-static storage,可以理解为所有实例对象共有的内存空间。static变量有点类似于C中的全局变量的概念;静态表示的是内存的共享,就是它的每一个实例都指向同一个内存地址。把static拿来,就是告诉JVM它是静态的,它的引用(含间接引用)都是指向同一个位置,在那个地方,你把它改了,它就不会变成原样,你把它清理了,它就不会回来了。
那静态变量与方法是在什么时候初始化的呢?对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。
尽量少用静态变量,因为静态变量是全局的,GC不会回收的。
若程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。
java集合是什么?
Java集合类存放于 java.util 包中,是一个用来存放对象的容器。
史上最全Java集合关系图 ?,java集合关系UML类图vsdx原图。
Collection
? ? |-----List 有序,可重复(存储顺序和取出顺序一致)
? ? |--|----LinkedList?底层使用双向链表实现,查询慢,增删快。效率高
? ? |--|----ArrayList 底层使用数组实现,查询快,增删慢。效率高。
? ? |? |? ? ? ? 每次容量不足时,自增长度的一半,如下源码可知
? ? |? |? ? ? ? ? int newCapacity = oldCapacity + (oldCapacity >> 1);
? ? |--|----Vector 底层使用数组实现,线程安全,查询快,增删慢。效率低。
? ? |? |? ? ? ? 每次容量不足时,默认自增长度的一倍(如果不指定增量的话),如下源码可知
? ? |? |? ? ? ? ? int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
? ? |? |? ? ? ? ? ? ? ? ? ? ? ? ? ? capacityIncrement : oldCapacity);
? ? |-----Set 元素唯一(最多包含一个 null 元素),只能通过游标来取值,线程不安全
? ? ? ? ? ?HashSet比TreeSet高效(尤其是查询、添加),LinkedHashSet比hash插入、删除慢,但是遍历快。
? ? |--|--HashSet 底层是由HashMap实现的,线程非安全,通过对象的hashCode方法与equals方法来保证插入元素的唯一性,无序(存储顺序和取出顺序不一致)?
? ? |--|--|--LinkedHashSet 底层数据结构由哈希表和链表组成。哈希表保证元素的唯一性,链表保证元素有序。(存储和取出是一致)
? ? |--|--TreeSet 基于 TreeMap 的 NavigableSet 实现。非同步,排序,元素唯一。?保持有序的set使用(使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序(红黑数维护次序)
Map 是键值对集合,key 不允许重复,value 可以
? ? |-----HashMap?基于链表和红黑树:hashMap用hash表实现的Map,就是利用对象的hashcode(hashcode()是Object的方法)进行快速散列查找。Null可以做主键,但只能有一个
? ? |-----TreeMap 基于红黑树
? ? |-----LinkedHashMap?HashMap+LinkedList
? ? |-----HashTable?线程安全,不允许有null值的存在
只有Vector,HashTable是线程安全的
ArrayList,LinkedList,HashSet,TreeSet,HashMap,TreeMap都不是线程安全的。
如果没有必要,推荐代码只同List,Map接口打交道.
HashMap的输出顺序是随机的,TreeMap中的条目是按键值的升序排列的,LinkedHashMap是按元素最后一次被访问的时间从早到晚排序的
简明图
Collection||Set泛型接口方法摘要
boolean?add(E?e)
????确保此?collection?包含指定的元素(可选操作)。
boolean?addAll(Collection?c)
????将指定?collection?中的所有元素都添加到此?collection?中(可选操作)。
void?clear()
????移除此?collection?中的所有元素(可选操作)。
boolean?contains(Object?o)
????如果此?collection?包含指定的元素,则返回?true。
boolean?containsAll(Collection?c)
????如果此?collection?包含指定?collection?中的所有元素,则返回?true。
boolean?equals(Object?o)
????比较此?collection?与指定对象是否相等。
int?hashCode()
????返回此?collection?的哈希码值。
boolean?isEmpty()
????如果此?collection?不包含元素,则返回?true。
Iterator?iterator()
????返回在此?collection?的元素上进行迭代的迭代器。
boolean?remove(Object?o)
????从此?collection?中移除指定元素的单个实例,如果存在的话(可选操作)。?
boolean?removeAll(Collection?c)
????移除此?collection?中那些也包含在指定?collection?中的所有元素(可选操作)。
boolean?retainAll(Collection?c)
????仅保留此?collection?中那些也包含在指定?collection?的元素(可选操作)。
int?size()
????返回此?collection?中的元素数。
Object[]?toArray()
????返回包含此?collection?中所有元素的数组。?T[]
????toArray(T[]?a)
特有方法(相对于Collection—继承自Collection)
void?add(int?index,?E?element)
????在列表的指定位置插入指定元素(可选操作)。
boolean?addAll(int?index,?Collection?c)
????将指定?collection?中的所有元素都插入到列表中的指定位置(可选操作)。
int?indexOf(Object?o)
????返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回?-1。
int?lastIndexOf(Object?o)
????返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回?-1。
ListIterator?listIterator()
????返回此列表元素的列表迭代器(按适当顺序)。
ListIterator?listIterator(int?index)
????返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
E?get(int?index)
????返回列表中指定位置的元素。
E?remove(int?index)
????移除列表中指定位置的元素(可选操作)。
E?set(int?index,?E?element)
????用指定元素替换列表中指定位置的元素(可选操作)。
List?subList(int?fromIndex,?int?toIndex)
????返回列表中指定的?fromIndex(包括?)和?toIndex(不包括)之间的部分视图。
原文链接:/developer/article/1176768 排版效果可能更好,本文若有不妥之处,请留言告知,拜谢!
参考文章:
java 集合详解 https://www.cnblogs.com/ysocean/p/6555373.html
java集合详解与基本使用方法 https://blog.csdn.net/qq_34232889/article/details/79997471
图解Java常用数据结构 https://www.jianshu.com/p/fb4fb24ecc8f
java中的集合和数组 https://www.cnblogs.com/summers/p/4094260.html
集合的线程安全性 https://www.cnblogs.com/wuchaodzxx/p/6007970.html
Set与线程安全 https://blog.csdn.net/l153097889/article/details/77891250
java常用数据结构及特点 https://blog.csdn.net/hujiangtaochn/article/details/84136432
Java集合框架之图解 https://www.cnblogs.com/SamSarah/p/4893217.html
java.util包中集合详解 https://www.jianshu.com/p/4bb01e139cda
使Cache命中率最高的替换算法是什么?替换最近最少使用的块算法
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。