JAVAlist,javalist轉數組

本文目錄一覽:

Java的List如何實現線程安全?

Java的List如何實現線程安全?

Collections.synchronizedList(names);效率最高,線程安全

Java的List是我們平時很常用的集合,線程安全對於高並發的場景也十分的重要,那麼List如何才能實現線程安全呢 ?

加鎖

首先大家會想到用Vector,這裡我們就不討論了,首先討論的是加鎖,例如下面的代碼

public class Synchronized{

private ListString  names = new LinkedList();

public synchronized void addName(String name ){

names.add(“abc”);

}

public String getName(Integer index){

Lock lock =new ReentrantLock();

lock.lock();

try {

return names.get(index);

}catch (Exception e){

e.printStackTrace();

}

finally {

lock.unlock();

}

return null;

}

}

synchronized一加,或者使用lock 可以實現線程安全,但是這樣的List要是很多個,代碼量會大大增加。

java自帶類

在java中我找到自帶有兩種方法

CopyOnWriteArrayList

CopyOnWrite 寫入時複製,它使一個List同步的替代品,通常情況下提供了更好的並發性,並且避免了再迭代時候對容器的加鎖和複製。通常更適合用於迭代,在多插入的情況下由於多次的複製性能會一定的下降。

下面是add方法的源代碼

 public boolean add(E e) {

final ReentrantLock lock = this.lock; // 加鎖 只允許獲得鎖的線程訪問

lock.lock();

try {

Object[] elements = getArray();

int len = elements.length;

// 創建個長度加1的數組並複製過去

Object[] newElements = Arrays.copyOf(elements, len + 1);

newElements[len] = e; // 賦值

setArray(newElements); // 設置內部的數組

return true;

} finally {

lock.unlock();

}

}

Collections.synchronizedList

Collections中有許多這個系列的方法例如

主要是利用了裝飾者模式對傳入的集合進行調用 Collotions中有內部類SynchronizedList

static class SynchronizedListE

extends SynchronizedCollectionE

implements ListE {

private static final long serialVersionUID = -7754090372962971524L;

final ListE list;

SynchronizedList(ListE list) {

super(list);

this.list = list;

}

public E get(int index) {

synchronized (mutex) {return list.get(index);}

}

public E set(int index, E element) {

synchronized (mutex) {return list.set(index, element);}

}

public void add(int index, E element) {

synchronized (mutex) {list.add(index, element);}

}

public E remove(int index) {

synchronized (mutex) {return list.remove(index);}

}

static class SynchronizedCollectionE implements CollectionE, Serializable {

private static final long serialVersionUID = 3053995032091335093L;

final CollectionE c;  // Backing Collection

final Object mutex;     // Object on which to synchronize

這裡上面的mutex就是鎖的對象 在構建時候可以指定鎖的對象 主要使用synchronize關鍵字實現線程安全

 /**

* @serial include

*/

static class SynchronizedListE

extends SynchronizedCollectionE

implements ListE {

private static final long serialVersionUID = -7754090372962971524L;

final ListE list;

SynchronizedList(ListE list) {

super(list);

this.list = list;

}

SynchronizedList(ListE list, Object mutex) {

super(list, mutex);

this.list = list;

}

這裡只是列舉SynchronizedList ,其他類類似,可以看下源碼了解下。

測試

public class Main {

public static void main(String[] args) {

ListString names = new LinkedList();

names.add(“sub”);

names.add(“jobs”);

// 同步方法1 內部使用lock

long a = System.currentTimeMillis();

ListString strings = new CopyOnWriteArrayList(names);

for (int i = 0; i 100000; i++) {

strings.add(“param1”);

}

long b = System.currentTimeMillis();

// 同步方法2 裝飾器模式使用 synchronized

ListString synchronizedList = Collections.synchronizedList(names);

for (int i = 0; i 100000; i++) {

synchronizedList.add(“param2”);

}

long c = System.currentTimeMillis();

System.out.println(“CopyOnWriteArrayList time == “+(b-a));

System.out.println(“Collections.synchronizedList time == “+(c-b));

}

}

兩者內部使用的方法都不一樣,CopyOnWriteArrayList內部是使用lock進行加鎖解鎖完成單線程訪問,synchronizedList使用的是synchronize

進行了100000次添加後時間對比如下:

可以看出來還是使用了synchronize的集合工具類在添加方面更加快一些,其他方法這裡篇幅關係就不測試了,大家有興趣去試一下。

java中list後面加是什麼意思?

這是泛型,保證List傳入類型跟ArrayList傳入類型一致;例如:ListString list = new ArrayListInteger();

以上代碼List指定類型是String,而真正傳入的Integer這樣編譯是不會通過的。

如果List指定了泛型,那麼編譯就會檢測,如果不定義泛型,編譯通過,運行不合理值會報錯。

泛型(Generic type 或者generics)是對Java語言的類型系統的一種擴展,以支持創建可以按類型進行參數化的類。可以把類型參數看作是使用參數化類型時指定的類型的一個佔位符,就像方法的形式參數是運行時傳遞的值的佔位符一樣。

用法:

實際上有兩種List:一種是基本的ArrayList,其優點在於隨機訪問元素,另一種是更強大的LinkedList,它並不是為快速隨機訪問設計的,而是具有一套更通用的方法。次序是List最重要的特點:它保證維護元素特定的順序。

List為Collection添加了許多方法,使得能夠向List中間插入與移除元素(這隻推薦LinkedList使用)。一個List可以生成ListIterator,使用它可以從兩個方向遍歷List,也可以從List中間插入和移除元素。

以上內容參考:百度百科-java列表

java list集合什麼意思

1、集合可以有list,vector等,其實map也是一個集合

2、這些集合有啥用呢,就好比你有一堆數據要存:

[name=’張三’

,

age=20,

address=’北京’]

[name=’李四’

,

age=15,

address=’湖南’]

[name=’王五’

,

age=18,

address=’甘肅’]等等,

這樣一條一條的數據你就能夠用集合來保存起來,放到一條集合中去

3、例如用list來保存,保存形式就如下:

list

=

{[name=’張三’

,

age=20,

address=’北京’],

[name=’李四’

,

age=15,

address=’湖南’]

[name=’王五’

,

age=18,

address=’甘肅’]};

這樣的形式了,然後取值的時候你就可以根據list.get(i)來分別取值了。

4、如果要取到每一條裏面的屬性,那麼可以配合map或者存儲的是實體類對象,來分別取值就對了,非常的簡單且實用

原創文章,作者:WPBBM,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/331967.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WPBBM的頭像WPBBM
上一篇 2025-01-20 14:11
下一篇 2025-01-20 14:11

相關推薦

  • MySQL字符串轉數組詳解

    一、MySQL字符串轉數組是什麼? MySQL字符串轉數組是把字符串類型的數據轉換為數組類型的數據。 在MySQL中,字符串類型的數據是非常常見的,但是有時需要將這些字符串類型的數…

    編程 2025-04-23
  • 前端字符串轉數組詳解

    一、常用的字符串轉數組方法 1、使用split方法將字符串按照指定分隔符轉為數組 let str = “今天,天氣,真好”; let arr = str.split(“,”); /…

    編程 2025-04-22
  • Vue對象轉數組:一個實用的JS技巧

    Vue是目前最受歡迎的JavaScript框架之一,它被廣泛應用於單頁面應用程序開發、數據綁定、組件化開發等場景。在Vue的開發中,我們經常需要將其數據對象轉換為數組,以便更方便地…

    編程 2025-04-22
  • ES6對象轉數組指南

    在Javascript編程過程中,經常需要進行數組和對象之間的轉換。ES6以及後續版本提供了許多便捷的方法幫助開發者實現這樣的轉換。本文將圍繞ES6對象轉數組展開講解,介紹常用的方…

    編程 2025-04-13
  • go字符串轉數組詳解

    一、什麼是字符串 字符串是計算機編程中的一種數據類型,它表示一段字符序列,可以包含字母、數字、標點符號以及其他特殊字符。在Go中,字符串類型被定義為一個不可變的序列,即字符串中的每…

    編程 2025-04-13
  • Javalist取差集操作詳解

    在Java編程中,javalist取差集操作是非常常見和實用的一個操作。具體來說,這個操作是指從一個列表中去掉另一個列表中的元素,即找到兩個列表不同的部分。 一、常用的javali…

    編程 2025-02-27
  • JQ字符串轉數組詳解

    一、字符串轉數組 將字符串轉換成數組是開發過程中常用的操作之一。通過Jquery將字符串轉換成數組十分簡單,我們只需要使用原始的JavaScript split()函數,然後使用$…

    編程 2025-02-24
  • Javalist交集詳解

    一、Javalist交集概述 Javalist交集是指兩個或多個集合中共同擁有的元素。在Java中,我們可以使用Collections類的靜態方法intersection來獲取兩個…

    編程 2025-02-11
  • PostgreSQL字符串轉數字詳解

    PostgreSQL是一款功能強大的關係型數據庫,其內置了許多函數用於數據類型轉換。其中常用的就是將字符串類型轉換為數字類型。在這篇文章中,我們將從多個方面詳細介紹如何使用Post…

    編程 2025-02-05
  • 詳解javalist差集

    一、什麼是javalist差集 在Java中,List是非常基礎的數據類型,而javalist差集是List的一種操作。它可以用來比較兩個List中的元素,返回一個只包含第一個Li…

    編程 2025-02-05

發表回復

登錄後才能評論