本文目錄一覽:
- 1、java 怎麼創建一個list集合
- 2、java把一個list中的內容添加到另一個list中
- 3、java list集合什麼意思
- 4、java中list後面加是什麼意思?
- 5、java的List操作
- 6、Java的List如何實現線程安全?
java 怎麼創建一個list集合
java創建一個list集合,List是不能直接實例化的,所以要用其他的,如ArrayList。
1、List temp=new ArrayList();
2、temp.add(xxx)。
其他解決方法:
1、ListString list = new ArrayListString();//創建集合對象;
2、list.Add(“1”);//在集合里存入數據。
3、list.Add(“2”);
4、List是一個接口,不能實例化,創建對象時要使用他的實現類ArrayList(其他)。
java把一個list中的內容添加到另一個list中
在JAVA中,想要把一個list中的內容添加至另一個list中,有兩種方法:
採用循環的方法。通過循環第一個ArrayList,然後通過每循環一次的方式,將值賦值給另一個ArrayList。具體代碼實現如下:
2.採用ArrayList自帶的addAll()方法。addAll()方法是通過傳入整一個List,將此List中的所有元素加入到新的List中,也就是當前List會增加的元素個數等於傳入的List的大小。該方法較為簡單,具體代碼實現如下:
拓展資料:
1.List.add() 和 List.addAll() 的區別:
(1)List.add() 方法,也是往List 中增加list,但是,它增加的是一個List 實例。如果,往容器中增加的那個List 實例從數據庫中查到的結果有5條,不過,如果使用了List.add(list1);程序只會輸出一條記錄。原因就是上面說的。List.add() 加List 實例,它會把這個看一個實例,而不是把那個看成一個容器。
(2) 例如:List.add(list1),List.add(list2);List.add(list3), 這時,List.size 它的大小是3。
(3)List.add() 的含義就是:你往這個List 中添加對象,它就把自己當初一個對象,你往這個List中添加容器,它就把自己當成一個容器。
(4)List.addAll()方法,就是規定了,自己的這個List 就是容器,往裏面增加的List 實例,增加到裏面後,都會被看成對象。
(5) 這時:List.add(list1),List.add(list2);List.add(list3), 這時,List.size 它的大小就是所有list 實例化後的總數和總的記錄數。
2.集合是Java API所提供的一系列類,可以用於動態存放多個對象。集合與數組的不同在於,集合是大小可變的序列,而且元素類型可以不受限定,只要是引用類型。集合中不能放基本數據類型,但可以放基本數據類型的包裝類。 集合類全部支持泛型,是一種數據安全的用法。java列表是集合的一種,並且列表中的元素是有序的,且允許重複。java列表又稱為java list。
參考資料:Java List_百度百科
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或者存儲的是實體類對象,來分別取值就對了,非常的簡單且實用
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操作
ListInteger list = new ArrayListInteger();
list.add(“a”);
list.add(“b”);
list.add(“c”);
list.add(“bb);
list.add(“dd”);
list.add(“a”);
MapInteger,Integer map = new HashMapInteger,Integer();
for(Integer i :list){
map.put(i, map.get(i)+1);
}
for (Object o : map.keySet()) {
System.out.println(o + “出現次數:” + map.get(o));
}
參考一下
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的集合工具類在添加方面更加快一些,其他方法這裡篇幅關係就不測試了,大家有興趣去試一下。
原創文章,作者:QJHW,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/149213.html