学习一下集合框架的常用方法吧
增加
add有两种用法
第一种是直接add对象,把对象加在最后面
heros.add(new Hero("hero " + i));
第二种是在指定位置加对象
heros.add(3, specialHero);
自己练习,犯了错误。
代码如下
public class TestCollection {
public static void main(String[] args) {
ArrayList h=new ArrayList();
h.add(2,"huhu");
System.out.println(h);
}
}
分析一下,第一次不指定位置插入的话,对应的下标是0,长度为1,然后第二次指定位置插入,如果写的是1的话,不会报错,会正常插入,但是是2就报错了。而且也没有动态扩容,,我个人觉得是因为不连续,然后ArrayList不支持,就报错了。
学习正确的代码。
准备好一个已经存放好5个对象的数组,然后在指定位置插入对象
public class TestCollection1 {
public static void main(String[] args) {
//创建集合
ArrayList h=new ArrayList();
//创建好连续的区域,先放5个对象进去
for (int i = 0; i <5 ; i++) {
h.add(new Hero("hero"+i));
}
System.out.println(h);
System.out.println("插入后的数组");
//在指定位置插入对象
h.add(3,"bbb");
System.out.println(h);
}
}
我如果从下标6插入就会报越界错误
public class TestCollection1 {
public static void main(String[] args) {
//创建集合
ArrayList h=new ArrayList();
//创建好连续的区域,先放5个对象进去
for (int i = 0; i <5 ; i++) {
h.add(new Hero("hero"+i));
}
System.out.println(h);
System.out.println("插入后的数组");
//在指定位置插入对象
h.add(6,"bbb");
System.out.println(h);
}
}
注:按第一种插入方法,只要插入的那一个和前一个下标是连续的,就一直能插入,否则会报越界错误。
按第二种插入方法,得先准备好一个已经存放对象的数组,然后再写,你要从哪插入。
判断是否存在
通过方法contains 判断一个对象是否在容器中
判断标准: 是否是同一个对象,而不是name是否相同
public class TestCollection1 {
public static void main(String[] args) {
//创建集合
ArrayList h=new ArrayList();
//创建好连续的区域,先放5个对象进去
for (int i = 0; i <5 ; i++) {
h.add(new Hero("hero"+i));
}
System.out.println(h);
System.out.println("插入后的数组");
//在指定位置插入对象
h.add(3,"bbb");
System.out.println(h);
// 判断一个对象是否在容器中
// 判断标准: 是否是同一个对象,而不是name是否相同
System.out.println(h.contains(new Hero("hero0")));
System.out.println(h.contains(new Hero("Hero6")));
}
}
如果使用contains判断
h.contains(new Hero(“hero0”))
注意:new的话就是一个新的对象的产生,而不是说名字相同了,就是同一个对象了·。
如果这样写
h.contains(“hero0”)
public class TestCollection1 {
public static void main(String[] args) {
//创建集合
ArrayList h=new ArrayList();
//创建好连续的区域,先放5个对象进去
for (int i = 0; i <5 ; i++) {
h.add(new Hero("hero"+i));
}
Hero h1=new Hero("haha");
h.add(h1);
System.out.println(h);
System.out.println("插入后的数组");
//在指定位置插入对象
h.add(3,"bbb");
h.add(5,"aaa");
System.out.println(h);
// 判断一个对象是否在容器中
// 判断标准: 是否是同一个对象,而不是name是否相同
System.out.println(h);
System.out.println(h.contains("haha"));
System.out.println(h.contains(new Hero("hero0")));
System.out.println(h.contains("bbb"));
System.out.println(h.contains("aaa"));
}
}
通过该段代码,发现只要new的话,再用contains判断,发现都是false。
看了半天,结果发现自己啊啊啊啊,好蠢。
public class TestCollection1 {
public static void main(String[] args) {
//创建集合
ArrayList h=new ArrayList();
//创建好连续的区域,先放5个对象进去
for (int i = 0; i <5 ; i++) {
h.add(new Hero("hero"+i));
}
Hero h1=new Hero("ccc");
h.add(h1);
System.out.println(h);
System.out.println("插入后的数组");
//在指定位置插入对象
h.add(3,"bbb");
h.add(5,"aaa");
h.add(6,"her07");
System.out.println(h);
// 判断一个对象是否在容器中
// 判断标准: 是否是同一个对象,而不是name是否相同
System.out.println(h.contains(h1));//true
System.out.println(h.contains(new Hero("hero0")));//false
System.out.println(h.contains("bbb"));//true
System.out.println(h.contains("aaa"));//true
System.out.println(h.contains("her07"));//true
}
}
// 判断一个对象是否在容器中
判断标准: 是否是同一个对象,而不是name是否相同
这句话真的是太重要了,我一直拿的是name和h比较,怪不得一直false。
获取指定位置的对象
indexOf用于判断一个对象在ArrayList中所处的位置
与contains一样,判断标准是对象是否相同,而非对象的name值是否相等
public class TestCollection1 {
public static void main(String[] args) {
//创建集合
ArrayList h=new ArrayList();
//创建好连续的区域,先放5个对象进去
for (int i = 0; i <5 ; i++) {
h.add(new Hero("hero"+i));
}
Hero h1=new Hero("ccc");
h.add(h1);
System.out.println(h);
//在指定位置插入对象
h.add(3,"bbb");
System.out.println("插入后的数组");
System.out.println(h);
// contains判断一个对象是否在容器中
// 判断标准: 是否是同一个对象,而不是name是否相同
System.out.println(h.contains(h1));//true
System.out.println(h.contains(new Hero("hero0")));//false
//indexOf用于判断一个对象在ArrayList中所处的位置
//与contains一样,判断标准是对象是否相同,而非对象的name值是否相等
System.out.println(h.indexOf(h1));
}
}
切记一定要是通过那个实例,而不是name,切记切记,我已经错两次了。
删除用于把对象从ArrayList中删除
remove可以根据下标删除ArrayList的元素
heros.remove(2);
也可以根据对象删除
heros.remove(specialHero);
public class TestCollection1 {
public static void main(String[] args) {
//创建集合
ArrayList h=new ArrayList();
//创建好连续的区域,先放5个对象进去
for (int i = 0; i <5 ; i++) {
h.add(new Hero("hero"+i));
}
Hero h1=new Hero("ccc");
h.add(h1);
System.out.println(h);
//在指定位置插入对象
h.add(3,"bbb");
System.out.println("插入后的数组");
System.out.println(h);
// contains判断一个对象是否在容器中
// 判断标准: 是否是同一个对象,而不是name是否相同
System.out.println(h.contains(h1));//true
System.out.println(h.contains(new Hero("hero0")));//false
//indexOf用于判断一个对象在ArrayList中所处的位置
//与contains一样,判断标准是对象是否相同,而非对象的name值是否相等
System.out.println(h.indexOf(h1));
//删除
h.remove(0);
h.remove(h1);
System.out.println("删除后的数组");
System.out.println(h);
}
}
替换
set用于替换指定位置的元素
//替换set
System.out.println("把下标是2的元素替换成 lala");
h.set(2,new Hero("lala"));
System.out.println("替换后的数组为:");
System.out.println(h);
//替换set
System.out.println("把下标是2的元素替换成 lala");
h.set(2,("jjj"));
System.out.println("替换后的数组为:");
System.out.println(h);
尝试了一下,不new也能够成功替换。
获取大小
size 用于获取ArrayList的大小
直接数组.size()就可以了。
转换为数组
toArray可以把一个ArrayList对象转换为数组。
需要注意的是,如果要转换为一个Hero数组,那么需要传递一个Hero数组类型的对象给toArray(),这样toArray方法才知道,你希望转换为哪种类型的数组,否则只能转换为Object数组
public class TestCollection2 {
public static void main(String[] args) {
ArrayList h=new ArrayList();
for (int i = 0; i <5 ; i++) {
h.add(new Hero("hero"+i));
}
Hero h1=new Hero("dada");
h.add(h1);
System.out.println("转换钱的数组");
System.out.println(h);
System.out.println("转换后的新数组为");
//因为想要转换为一个对象数组,因此需要新建一个对象数组
//对象数组格式Hero hero[]=new Hero[]{};
//此处需要进行类型转换
Hero heroes[] = (Hero[]) h.toArray(new Hero[]{});
System.out.println(heroes);
}
}
注意建对象数组的格式。
addAll 把另一个容器所有对象都加进来
public class TestCollection3 {
public static void main(String[] args) {
//新建一个数组1
ArrayList h1=new ArrayList();
for (int i = 0; i <5 ; i++) {
h1.add(new Hero("hero"+i));
}
System.out.println("第一个数组为:"+h1);
//再新建第二个数组
ArrayList h2=new ArrayList();
h2.add("ll");
h2.add("aa");
h2.add("dd");
h1.addAll(h2);
System.out.println("第二个数组为:"+h2);
System.out.println("此时第一个数组为:"+h1);
}
}
注意addAll时,往那个数组里添加元素,注意位置,别写反了。
清空数组clear
h1.clear();
System.out.println("清空后的数组"+h1);
如果就是要判断集合里是否存在一个 name等于 "hero 1"的对象,应该怎么做?
光想到了contains,然后就没有思路了,有点悲伤。。。。。。
开始学习别人的代码。
public class Demo01 {
///如果就是要判断集合里是否存在一个 name等于 "hero 1"的对象.
//判断一个ArrayList()中的对象是否有名字是“hero 1”的。
//思路:创建ArrayList对象heros.
// Hero h = heros.get(i);
public static void main(String[] args) {
ArrayList h=new ArrayList();
for (int i = 0; i < 5; i++) {
h.add(new Hero("hero" +i));
}
System.out.println("原数组为:"+h);
String name="hero1";
for (int i = 0; i < h.size(); i++) {
//获取集合中元素的值
Hero h1= (Hero) h.get(i);
if(name.equals(h1.name)){
System.out.println("找到了"+name);
break;
}
}
}
}
字符串内容的比较,equals
1.首先定义一个字符串,赋给他你想要找的那个具体的值
2.然后进行对该数组遍历,然后新建一个对象数组,
Hero h1= (Hero) h.get(i);//获取原来的集合数组中的元素。
然后再通过一个if判断,就可以了。
做一个一样的MyStringBuffer练习,但是不使用字符数组,而是使用ArrayList来实现
没有思路,不能光借鉴别人的,给自己留点时间思考。