【高心星出品】
容器類
線性容器類
線性容器實現能按順序訪問的資料結構,其底層主要透過陣列實現,包括ArrayList、Vector(已廢棄)、List、LinkedList、Deque、Queue、Stack七種。
ArrayList
一種陣列物件,最簡單的容器型別。
// arraylist元素
export function arraylist() {
let al = new ArrayList()
// 末尾新增元素
al.add('str')
al.add(10)
// 某個位置插入元素
al.insert(true, 1)
// 迴圈遍歷元素 for-of結構
for (const element of al) {
console.info(element+' gxxt')
}
// foreach結構
al.forEach((value, index) => {
console.info(`${index}--${value} gxxt`)
}, value => JSON.stringify(value))
// 更新某個元素的值
al[0] = 'str1'
// 查詢是否有某個元素
let hasstr1 = al.has('str1')
console.info(hasstr1+' gxxt')
// 移除元素
al.removeByIndex(0)
// 移除某個範圍內的元素
al.removeByRange(0, 2)
}
List
List可用來構造一個單向連結串列物件,即只能透過頭節點開始訪問到尾節點。List依據泛型定義,在記憶體中的儲存位置可以是不連續的。
相對於ArrayList,List的插入刪除效率要更優秀。
// list 單連結串列
export function list() {
let list = new List()
list.add('str')
list.add(1)
list.insert('ok', 1)
// 根據下標取出元素
let a = list.get(1)
// 取出頭元素
let first = list.getFirst()
// 取出尾元素
let last = list.getLast()
// 更新某個下標對應的元素
list.set(1, 'gaga')
console.info(`gxxt ${a}, ${first}, ${last}`)
}
list容器通用arraylist容器,並有自己的方法。
LinkedList
使用方式和List是一樣的,只不過LinkedList是雙向連結串列,LinkedList和List相比,LinkedList是雙向連結串列,可以快速地在頭尾進行增刪,而List是單向連結串列,無法雙向操作。
Queue
Queue可用來構造佇列物件,儲存元素遵循先進先出的規則。
export function queue()
{
let que=new Queue()
// 隊尾加入元素
que.add('str')
que.add(1)
que.add(true)
// 獲取隊首元素
let first=que.getFirst()
// 出隊元素便返回
let ff=que.pop()
let ff1=que.pop()
console.info(`gxxt ${first}, ${ff}, ${ff1}`)
}
Stack
Stack可用來構造棧物件,儲存元素遵循先進後出的規則。
// stack 棧物件
export function stack()
{
let stack=new Stack()
// 壓入棧
stack.push('str')
stack.push(1)
stack.push(true)
// 獲取棧頂元素
let first=stack.peek()
// 出棧
let ff=stack.pop()
console.log('gxxt '+first+' '+ff)
// 遍歷stack
stack.forEach((item,index)=>{
console.log(item+'')
})
}
非線性容器
HashMap
HashMap可用來儲存具有關聯關係的key-value鍵值對集合,儲存元素中key是唯一的,每個key會對應一個value值。
// hashmap
export function hashmap()
{
let hm=new HashMap()
// 增加元素 無序
hm.set('one','item1')
hm.set(2,'item2')
hm.set(3,'item3')
// 取出元素
if (hm.hasKey(2)) {
let value = hm.get(2)
}
// 取出所有的鍵
let keys=hm.keys()
for (const element of keys) {
console.info('gxxt '+element)
}
// 遍歷所有的key和value
hm.forEach((key,value)=>{
console.info('gxxt '+key+'=='+value)
},key=>JSON.stringify(key))
// 替換元素
hm.replace(1,'item11')
// 刪除元素
hm.remove('one')
}
TreeMap
TreeMap可用來儲存具有關聯關係的key-value鍵值對集合,儲存元素中key是唯一的,每個key會對應一個value值。
TreeMap和HashMap相比,HashMap依據鍵的hashCode存取資料,訪問速度較快。而TreeMap是有序存取,效率較低。
// treemap
export function treemap() {
let tm = new TreeMap()
tm.set('one', 'item1')
tm.set(2, 'item2')
tm.set(3, 'item3')
// treemap是有序的 所以可以
let fk = tm.getFirstKey()
let lk = tm.getLastKey()
console.info('gxxt ' + fk + ' ' + lk)
}
HashSet
HashSet可用來儲存一系列值的集合,儲存元素中value是唯一的。
export function hashset()
{
let hs=new HashSet()
// 增加元素
hs.add('item1')
hs.add('item2')
hs.add('item3')
// 獲取集合中元素
let vs=hs.values()
for (const element of vs) {
console.info('gxxt '+element)
}
hs.forEach((value)=>{
console.info('gxxt '+value)
},value=>JSON.stringify(value))
// 刪除元素
hs.remove('item2')
}
TreeSet
TreeSet可用來儲存一系列值的集合,儲存元素中value是唯一的。
TreeSet和HashSet相比,HashSet中的資料無序存放,而TreeSet是有序存放。它們集合中的元素都不允許重複,但HashSet允許放入null值,TreeSet不建議插入空值,可能會影響排序結果。
// treeset
export function treeset()
{
let ts=new TreeSet()
ts.add('item1')
ts.add('item2')
ts.add('item3')
// 獲取第一個元素
let fv=ts.getFirstValue()
// 獲取最後一個元素
let lv=ts.getLastValue()
console.info('gxxt '+fv+'=='+lv)
}