数组:
优点:在内存中时连续的,速度较快,操作简单。
缺点:定义数组时要定义其长度,不是很灵活,过长过短都会造成问题。不方便进行数据的添加、插入和移除
数组在什么时候会用到呢?
1、java ArrayList无法存储基本类型,int,long,如果保存的话,就需要封装为Integer、Long,而自动的拆装箱,也有性能的消耗,所以总结下这点就是说如果要保存基本类型,同时还特别关注性能,就可以使用数组。
2、如果对数据的数量大小已知,操作也非常简单,也不需要ArrayList中的大部分方法,也是可以直接使用数组的。
ArrayList:
优点:大小是动态扩充与收缩的。在声明ArrayList对象时不需要指定它的长度。ArrayList继承了List接口,可以很方便的进行数据的添加、插入和移除.
缺点:当向集合插入不同类型的数据后(ArrayList将数据当作object存储),在进行数据处理时容易出现类型不匹配的错误,使用时需要进行类型转换处理,存在装箱与拆箱操作,造成性能大量损耗的现象。
有三种初始化方式:
1.默认的构造器,将会以默认的大小来初始化内部的数组
2. 用一个Collection对象来构造,并将该集合的元素添加到ArrayList
3. 用指定的大小来初始化内部的数组
默认是一个常量值为EMPTY ARRAY的长度为0的数组,只有在add()的时候,才会扩容到10,如果数组长度不够了,底层自己会根据capacity的1.5倍进行扩容,10->15->22
ArrayList去重:
package com.xiaozhao.juc;
import java.util.ArrayList;
import java.util.HashSet;
public class ListDemo{
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("aaa");
list.add("aaa");
list.add("bbb");
list.add("bbb");
list.add("ccc");
list.add("ccc");
list.add("ccc");
System.out.println(list);
//双重循环去重
System.out.println( removeDuplicate2(list));
}
//1.循环list中所有的元素然后删除
public static ArrayList removeDuplicate1(ArrayList list){
for(int i =0;i<list.size()-1;i++){
for(int j=list.size()-1;j>i;j--){
if(list.get(i).equals(list.get(j)))
list.remove(j);
}
}
return list;
}
//2.利用hashSet剔除重复元素,但是是无序的
public static ArrayList removeDuplicate2(ArrayList list){
HashSet set = new HashSet(list);
//使用LinkedHashSet可以保证输入的顺序
//LinkedHashSet<String> set2 = new LinkedHashSet<String>(list);
list.clear();
list.addAll(set);
return list;
}
//3.利用list的contains方法去重
public static ArrayList removeDuplicate3(ArrayList list){
ArrayList tempList = new ArrayList(list.size());
for(int i=0;i<list.size();i++){
if(!tempList.contains(list.get(i)))
tempList.add(list.get(i));
}
return tempList;
}
}