java基础:13.1 集合框架 - ArrayList
发布日期:2022-04-04 06:36:28
浏览次数:17
分类:博客文章
本文共 4610 字,大约阅读时间需要 15 分钟。
文章目录
1、ArrayList
在 中,初步了解了ArrayList
,知道了ArrayList的特点:
- ArrayList 的大小灵活,所以无须提前给定它的大小。而当创建一个数组时,它的大小必须给定。
- ArrayList 包含许多有用的方法。比如,可以使用contains 方法来测试某个元素是否在列表中。如果使用数组,则需要编写额外代码来实现该方法。
- 元素必须是一种对象,不能是int,double…,可以是Integer.
- ArrayList 可以用来存储多个自定义的对象
{ ... ArrayListcityList = new ArrayList<>(); // <>中的元素必须是一种对象,不能是int,double..,可以是Integer. cityList.add("London"); ... cityList.add("Miami"); System.out.println(cityList.Size() + cityList.contains("Miami") + cityList.remove("Miami"); System.out.println(cityList.toString()); // == System.out.println(cityList);}
2、特点
以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组。
按数组下标访问元素–get(i)/set(i,e) 的性能很高,这是数组的基本优势。直接在数组末尾加入元素–add(e)的性能也高,但如果按下标插入、删除元素–add(i,e), remove(i), remove(e),则要用System.arraycopy()来移动部分受影响的元素,性能就变差了,这是基本劣势。3、和数组的区别
4、常用的方法
toArray
可以把一个ArrayList对象转换为数组。
需要注意的是,如果要转换为一个Hero数组,那么需要传递一个Hero数组类型的对象给toArray(),这样toArray方法才知道,你希望转换为哪种类型的数组,否则只能转换为Object数组。
ArrayList heros = new ArrayList(); // 初始化5个对象 for (int i = 0; i < 5; i++) { heros.add(new Hero("hero " + i)); } Hero specialHero = new Hero("special hero"); heros.add(specialHero); System.out.println(heros); Hero hs[] = (Hero[])heros.toArray(new Hero[]{}); System.out.println("数组:" + hs);
addAll
把另一个容器所有对象都加进来.
5、使用泛型与不使用泛型
学习别人的程序时发现有人是第一种写法,有人是第二种。
对于不使用泛型的容器,可以往里面放英雄,也可以往里面放物品heros.add(new Hero(“盖伦”));heros.add(new Item(“冰杖”)); // 放别的类的对象并不会报错ArrayList heros = new ArrayList();
使用泛型后, heros.add(new Item(“冰杖”));则会系统报错,因此此时只可以放属性是Hero的对象,或者Hero的子类ArrayList<Hero> heros = new ArrayList<>();
如果要求ArrayList只能放两种对象,则可以把这两个对象继承在同一个父类。利用了2中的知识点。
6、遍历
有三种方法。
for
用for循环遍历
iterator
迭代器遍历
for:
用增强型for循环
package collection;import java.util.ArrayList;import java.util.Iterator;public class TestCollection { public static void main(String[] args) { ArrayListheros = new ArrayList<>(); // 初始化5个对象 for (int i = 0; i < 5; i++) { heros.add(new Hero("hero " + i)); } Hero specialHero = new Hero("special hero"); heros.add(specialHero); System.out.println(heros); // 第一种遍历 for循环 System.out.println("--------for 循环-------"); for (int i = 0; i < heros.size(); i++) { Hero h = heros.get(i); System.out.println(h); } //第二种遍历,使用迭代器 System.out.println("--------使用while的iterator-------"); Iterator it= heros.iterator(); //从最开始的位置判断"下一个"位置是否有数据 //如果有就通过next取出来,并且把指针向下移动 //直到"下一个"位置没有数据 while(it.hasNext()){ Hero h = it.next(); System.out.println(h); } //迭代器的for写法 System.out.println("--------使用for的iterator-------"); for (Iterator iterator = heros.iterator(); iterator.hasNext();) { Hero hero = (Hero) iterator.next(); System.out.println(hero); } // 第三种,增强型for循环 System.out.println("--------增强型for循环-------"); for (Hero h : heros) { System.out.println(h); } } }
7、练习
练习1 -判断是否相同
如果就是要判断集合里是否存在一个 name等于 "hero 1"的对象,应该怎么做?疑问 为什么方法1和方法2的答案不一样???package collection;import java.util.ArrayList;public class TestCollection { public static void main(String[] args) { ArrayListheros = new ArrayList<>(); // 初始化5个对象 for (int i = 0; i < 5; i++) { heros.add(new Hero("hero " + i)); } Hero specialHero = new Hero("special hero"); heros.add(specialHero); System.out.println(heros); Hero testhero = new Hero("hero 1"); for(Hero h: heros) { if ( h.getName() == testhero.getName() ) System.out.println("存在"); else System.out.println("不存在"); } System.out.println("方法2"); for(int i=0 ; i
练习2 - 首先初始化一个Hero集合,里面放100个Hero对象,名称分别是从
hero 0hero 1hero 2…hero 99.通过遍历的手段,删除掉名字编号是8的倍数的对象public class TestCollection { public static void main(String[] args) { ArrayListheros = new ArrayList<>(); // 初始化5个对象 for (int i = 0; i < 100; i++) { heros.add(new Hero("hero " + i)); } for(int i=0; i < heros.size();i++) { int n = Integer.parseInt(heros.get(i).getName().substring(5)); if( n%8 ==0 ) heros.remove(i); } for(Hero a:heros) System.out.println(a); } }
转载地址:https://www.cnblogs.com/l20902/p/10610878.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年03月30日 19时54分25秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux下的图形库curses写贪吃蛇,酷
2019-04-27
在asp.net中为Web用户控件添加属性和事件
2019-04-27
datagrid的正反双向排序
2019-04-27
在分页状态下删除纪录的问题
2019-04-27
使用DataGrid动态绑定DropDownList
2019-04-27
DataGrid删除确认及Item颜色交替
2019-04-27
NetBeans配置Xdebug 远程调试PHP
2019-04-27
MediaWiki安装
2019-04-27
Squid安装
2019-04-27
如何查看当前Linux的版本
2019-04-27
Ubuntu安装Nginx
2019-04-27
Ubuntu 下安装thttpd Web服务器
2019-04-27
用thttpd做Web Server
2019-04-27
服务器端开发经验总结 Linux C语言
2019-04-27
将网站程序放在tmpfs下
2019-04-27
使用Nginx的proxy_cache缓存功能取代Squid
2019-04-27
nginx 反向代理,动静态请求分离,proxy_cache缓存及缓存清除
2019-04-27
nginx 的proxy_cache才是王道
2019-04-27
Nginx proxy_cache 使用示例
2019-04-27
Nginx源代码分析 - 日志处理
2019-04-27