解決這個(gè)問題通常有兩種方法(個(gè)人認(rèn)為)
成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司一直秉承“誠(chéng)信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶多一個(gè)朋友!專注中小微企業(yè)官網(wǎng)定制,網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作,塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應(yīng)。
一:使用synchronized關(guān)鍵字,這個(gè)大家應(yīng)該都很熟悉了,不解釋了;
二:使用Collections.synchronizedList();使用方法如下:
假如你創(chuàng)建的代碼如下:ListMapString,Object data=new ArrayListMapString,Object();
那么為了解決這個(gè)線程安全問題你可以這么使用Collections.synchronizedList(),如:
ListMapString,Object data=Collections.synchronizedList(new ArrayListMapString,Object());
其他的都沒變,使用的方法也幾乎與ArrayList一樣,大家可以參考下api文檔;
額外說(shuō)下 ArrayList與LinkedList;這兩個(gè)都是接口List下的一個(gè)實(shí)現(xiàn),用法都一樣,但用的場(chǎng)所的有點(diǎn)不同,ArrayList適合于進(jìn)行大量的隨機(jī)訪問的情況下使用,LinkedList適合在表中進(jìn)行插入、刪除時(shí)使用,二者都是非線程安全,解決方法同上(為了避免線程安全,以上采取的方法,特別是第二種,其實(shí)是非常損耗性能的)。
import java.util.Iterator;
public class MyArrayList {
Object[] arr;
int size=0;
public MyArrayList(){
this(10);
}
public MyArrayList(int R){
arr=new Object[R];
}
public int size() {
return size;
}
public void add(Object obj){
if(arr.length=size+1){
arr[size]=obj;
size++;
}else{
int i=arr.length*3/2+1;
Object[] a2=new Object[i];
System.arraycopy(arr,0,a2,0, size);
a2[size]=obj;
size++;
arr=a2;
}
// if(arr.lengthsize+1){
// Object[] a=new Object[size*3/2+1];
// System.arraycopy(arr, 0, a, 0, size);
// arr=a;
// }
// arr[size]=obj;
// size++;
//}
}
public Object get(int i){
if(i0||i=size){
throw new ArrayIndexOutOfBoundsException(i);
}else{
return arr[i];
}
}
public Object set(int i,Object obj){
if(i0||i=size){
throw new ArrayIndexOutOfBoundsException(i);
}else{
size++;
Object o=arr[i];
for(int j=size-1;ji;j--){
arr[j]=arr[j-1];
}
arr[i]=obj;
return o;
}
}
public Object remove(int i){
if(i0||i=size){
throw new ArrayIndexOutOfBoundsException(i);
}else{
Object o=arr[i];
for(int j=i;jsize-1;j++){
arr[j]=arr[j+1];
}
size--;
// System.arraycopy(arr, i+1, arr, i,size-(i+1));
// arr[--size]=null;
return o;
}
}
public Iterator iterator(){
return new MyIterator();//創(chuàng)建迭代器并以父接口類型返回
}
private class MyIterator implements Iterator{//在內(nèi)部類中可以不
int index=0;
public boolean hasNext(){
return indexsize;
}
public Object next(){
return arr[index++];
}
public void remove(){
MyArrayList.this.remove(index);//內(nèi)部類調(diào)用外部類的方法
}
}
}
//注釋為可替換代碼
在JAVA中,想要把一個(gè)list中的內(nèi)容添加至另一個(gè)list中,有兩種方法:
采用循環(huán)的方法。通過(guò)循環(huán)第一個(gè)ArrayList,然后通過(guò)每循環(huán)一次的方式,將值賦值給另一個(gè)ArrayList。具體代碼實(shí)現(xiàn)如下:
2.采用ArrayList自帶的addAll()方法。addAll()方法是通過(guò)傳入整一個(gè)List,將此List中的所有元素加入到新的List中,也就是當(dāng)前List會(huì)增加的元素個(gè)數(shù)等于傳入的List的大小。該方法較為簡(jiǎn)單,具體代碼實(shí)現(xiàn)如下:
拓展資料:
1.List.add() 和 List.addAll() 的區(qū)別:
(1)List.add() 方法,也是往List 中增加list,但是,它增加的是一個(gè)List?實(shí)例。如果,往容器中增加的那個(gè)List 實(shí)例從數(shù)據(jù)庫(kù)中查到的結(jié)果有5條,不過(guò),如果使用了List.add(list1);程序只會(huì)輸出一條記錄。原因就是上面說(shuō)的。List.add()?加List 實(shí)例,它會(huì)把這個(gè)看一個(gè)實(shí)例,而不是把那個(gè)看成一個(gè)容器。
(2) 例如:List.add(list1),List.add(list2);List.add(list3),??這時(shí),List.size 它的大小是3。
(3)List.add()?的含義就是:你往這個(gè)List 中添加對(duì)象,它就把自己當(dāng)初一個(gè)對(duì)象,你往這個(gè)List中添加容器,它就把自己當(dāng)成一個(gè)容器。
(4)List.addAll()方法,就是規(guī)定了,自己的這個(gè)List 就是容器,往里面增加的List 實(shí)例,增加到里面后,都會(huì)被看成對(duì)象。
(5) 這時(shí):List.add(list1),List.add(list2);List.add(list3),??這時(shí),List.size 它的大小就是所有l(wèi)ist 實(shí)例化后的總數(shù)和總的記錄數(shù)。
2.集合是Java API所提供的一系列類,可以用于動(dòng)態(tài)存放多個(gè)對(duì)象。集合與數(shù)組的不同在于,集合是大小可變的序列,而且元素類型可以不受限定,只要是引用類型。集合中不能放基本數(shù)據(jù)類型,但可以放基本數(shù)據(jù)類型的包裝類。 集合類全部支持泛型,是一種數(shù)據(jù)安全的用法。java列表是集合的一種,并且列表中的元素是有序的,且允許重復(fù)。java列表又稱為java list。
參考資料:Java List_百度百科
package list;
import java.util.ArrayList;
//這是關(guān)于List用法,代表性的有LinkedList,ArrayList,Vector用法類似
public class ArrayListTest {
/**
* @param args
*/
public static void main(String[] args) {
ArrayListString list = new ArrayListString();
//添加
list.add("三國(guó)演義");
list.add("西游記");
list.add("水滸傳");
list.add("紅樓夢(mèng)");
//修改
list.set(0, "三國(guó)志");
//查詢某個(gè)元素是否存在
boolean flag = list.contains("西游記");
System.out.println(flag);
//刪除
list.remove(2);//list.remove("水滸傳");
//遍歷
int size = list.size();
for ( int i=0; isize; i++)
{
String str =(String)list.get(i);//得到某個(gè)位置的元素
System.out.println(str);
}
}
}
////////////////////////下面是排序的
package list;
import java.util.ArrayList;
import java.util.Collections;
//這是關(guān)于List用法,代表性的有LinkedList,ArrayList,Vector用法類似
//排序
//Collections可以排序,還可以得到最大,最小數(shù)值,還可以將集合反轉(zhuǎn)
public class SortListTest {
/**
* @param args
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) {
ArrayList list = new ArrayList();
//添加
list.add(45);
list.add(67);
list.add(87);
list.add(23);
list.add(67);
Collections.sort(list);//升序
//Collections.sort(list,Collections.reverseOrder());//降序
//遍歷
int size = list.size();
for ( int i=0; isize; i++ )
{
Integer str =(Integer)list.get(i);//得到某個(gè)位置的元素
System.out.println(str);
}
}
}