JAVA集合之 ArrayList

170 阅读2分钟

这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战

文章目录

ArrayList 介绍

ArrayList 内部使用数组存放数据,相当于 动态数组。提供了相关的添加、删除、修改、遍历等功能。

存放数据时
1、在内部数组存空位置存放数据
2、放满后,创建一个原来1.5倍的新数组,原来的值复制下来,再往里存放数据

以上这两个过程中,1 的效率高,2 的效率低。

删除或添加数据时
1、如果从中间删除一个数据,后面的数据需要向前移动,效率不高。
2、头部加一个数据,后面的数据需要向后移动,而且可能数组放满,会创建新数组,效率不高。

访问数据时
ArrayList 类实现了 List 接口,由 ArrayList 类实现的 List 集合采用数组结构保存对象。数组结构的优点是便于对集合进行快速的随机访问,如果经常需要根据索引位置访问集合中的对象,使用由 ArrayList 类实现的List集合的效率较好。

ArrayList VS LinkedList
1、如果应用程序对数据有较多的随机访问,ArrayList 对象要优于 LinkedList 对象;
2、如果应用程序有更多的插入或者删除操作,较少的随机访问,LinkedList 对象要优于ArrayList对象;
3、不过ArrayList的插入,删除操作也不一定比 LinkedList 慢,如果在 List 靠近末尾的地方插入,那么 ArrayList 只需要移动较少的数据,而 LinkedList 则需要一直查找到列表尾部,反而耗费较多时间,这时 ArrayList 就比 LinkedList 要快。

ArrayList 使用

创建对象

方法一:不初始化容量

ArrayList arr1 = new ArrayList();

内部数组初始容量10,如果加满了10个,内部数组会创建1个1.5倍更长的数组

方法二:初始化容量

ArrayList arr2 = new ArrayList(100);

可以预先估计初始用量,内部数组初始用量100。减少内部数组创建次数,效率会提高。

需要注意的是 arr.size() = 0 是指加入的数据的数量,不是数组容量。

方法
与 LinkedList 相同,但没有两端操作数据的方法。【LinkedList 传送门

举例:ArrayList 方法使用练习

public static void main(String[] args) throws ParseException {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(111);
        list.add(222);
        list.add(444);
        System.out.println(list.size());//3
        System.out.println(list);//[111, 222, 444]
        list.add(2, 333);
        System.out.println(list);//[111, 222, 333, 444]
        System.out.println(list.get(0));//111
        System.out.println(list.get(list.size() - 1));//444
        System.out.println(list.contains(111));//true
        System.out.println(list.set(0, 555));
        System.out.println(list);//[555, 222, 333, 444]
        System.out.println(list.remove(2));//333
        System.out.println(list);//[555, 222, 444]
        //如果写list.remove(555)程序会认为移除下标为555的值
        //因为本栗子中使用的是Integer对象,所以对555封装成Integer对象
        //这样才会认为移除的是一个数据,而不是下标值
        System.out.println(list.remove(Integer.valueOf(555)));//true
        System.out.println(list);//[222, 444]

        //下标遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        //输出
        //222
        //444

        //迭代器遍历
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        //输出
        //222
        //444
    }

举例:兴趣选择

效果图
这里写图片描述

xml

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stretchColumns="0,1,2">

    <TableRow>

        <CheckBox
            android:onClick="doClick"
            android:text="足球" />

        <CheckBox
            android:onClick="doClick"
            android:text="篮球" />

        <CheckBox
            android:onClick="doClick"
            android:text="气球" />
    </TableRow>

    <TableRow>

        <CheckBox
            android:onClick="doClick"
            android:text="流行乐" />

        <CheckBox
            android:onClick="doClick"
            android:text="古典乐" />

        <CheckBox
            android:onClick="doClick"
            android:text="小月月" />
    </TableRow>

    <TableRow>

        <CheckBox
            android:onClick="doClick"
            android:text="京剧" />

        <CheckBox
            android:onClick="doClick"
            android:text="戏剧" />

        <CheckBox
            android:onClick="doClick"
            android:text="杯具" />
    </TableRow>

    <TableRow>

        <CheckBox
            android:onClick="doClick"
            android:text="抽烟" />

        <CheckBox
            android:onClick="doClick"
            android:text="喝酒" />

        <CheckBox
            android:onClick="doClick"
            android:text="烫头" />
    </TableRow>

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#222222"
        android:textSize="18sp"
        android:gravity="center"/>
</TableLayout>

java

public class MainActivity extends AppCompatActivity {

    ArrayList<String> list = new ArrayList<>();
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);

    }

    public void doClick(View view) {
        CheckBox checkBox = (CheckBox) view;
        String s = checkBox.getText().toString();
        if (checkBox.isChecked()) {
            list.add(s);
        } else {
            list.remove(s);
        }

        textView.setText("");

        for (int i = 0; i < list.size(); i++) {
            if (i != 0) {
                textView.append(",");
            }
            textView.append(list.get(i));
        }
    }
}

运行结果:
在这里插入图片描述