文章目录
- ArrayList 介绍
- ArrayList 使用
- 举例:ArrayList 方法使用练习
- 举例:兴趣选择
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;
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));
}
}
}
运行结果: