JAVA常用集合类——list(列表)和map(映射)

JAVA常用集合类——list(列表)和map(映射)

我将在这篇文章中较为详细地介绍集合类list(列表)和map(映射)的常见用法和和易错点,仅仅介绍我们平常用到的,适合java初学者参考学习,这都是我学习和开发过程中所积累的,望对你们有些帮助,本人才疏学浅,可能有些地方描述不是太严谨,敬请原谅。

为什么要用集合类?

我们过去通常把一些类型相同的一组数据放入数组中,但是,数组有一个重大缺点,那就是使用数组前必须指定数组的长度。我们在开发过程中往往不知道一组数据的到底有多长,并且希望动态的添加或删除这组数据来满足我们的业务需求,数组肯定是不满足的,这就要用到我们的集合类了。

List/ArrayList

list也称列表,是最常用的集合类,List是ArrayList的父类,功能用法大致相同

1、list的add用法

(1)、方法摘要

void add(String item) 向滚动列表的末尾添加指定的项。
void add(String item, int index) 向滚动列表中索引指示的位置添加指定的项。

public class Test {
    public static void main(String[] args) {
        ArrayList list=new ArrayList();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        list.add(1, "mm");
        for(int i=0;i/*
输出结果为:
0aa
1mm
2bb
3cc
4dd
*/

这里需要注意list.add(1, “mm”);它并不是把“bb”所在的项给替换掉,而是将“mm”插入指定位置,并将后面的项向后移。

(2)、修改list中类的内容

看下面的代码

package javaTest;
import java.util.ArrayList;
class Person{
    private int age;
    private String name;
    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public class TestClass {
  public static void main(String[] args) {
        Person p1=new Person(17,"张三");
        Person p2=new Person(18,"李四");
        Person p3=new Person(19,"王五");
        ArrayList list=new ArrayList();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        for(int i=0;i//将李四的age改为25
            if("李四".equals(p.getName()))
            p.setAge(25);// p=new Person(25,"李四");
        }
        for(int i=0;i" "+p.getAge());
        }
}
}
/*
 输出结果为:
张三 17
李四 25
王五 19
 * 
 * */

如果将p.setAge(25)替换为p=new Person(25,”李四”),list中内容没有改变,我思考了好久,想不通,望广大网友解答。如果将上面的类换成字符串也是无法修改的,不过可以采用先remove,再add的方式修改字符串或类中的内容。

2、list的remove用法

(1)方法摘要

void remove(int position) 从此滚动列表中移除指定位置处的项。
void remove(String item) 从列表中移除项的第一次出现。
仔细看下面两端代码,比较输出结果

//代码段1
package javaTest;
import java.util.ArrayList;
public class TestList {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
          ArrayList list=new ArrayList();
          list.add("aa");
          list.add("bb");
          list.add("cc");
          list.add("dd");
          for(int i=0;i"start:"+i+s);
              if(i==0){
                  list.remove(i);
              }
             System.out.println("end:"+i+s);
          }
    }
}
/*
输出结果为:
start:0aa
end:0aa
start:1cc
end:1cc
start:2dd
end:2dd
*/
//代码段2
package javaTest;
import java.util.ArrayList;
public class TestList1 {
    public static void main(String[] args) {
        ArrayList list=new ArrayList();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        for(int i=0;i"start:"+i+list.get(i));
            if(i==0){
                list.remove(i);  
            }
            System.out.println("end:"+i+list.get(i));
        }
    }
}
  /*
   输出结果为:
    start:0aa
    end:0bb
    start:1cc
    end:1cc
    start:2dd
    end:2dd
    */

为什么会出现这种结果呢?这两段代码看似一样,实则暗藏玄机。导致产生两个不同结果的原因就是list.remove(i),和数组不同,List执行remove后会将后面的项向前移一位,长度减一。数组则不然,数组将其中某一项置空后,长度不变,置空的那一项仍然存在。所以上面list中remove之前第一项的值是aa,remove之后第一项的值是bb。我们可以参考remove的源码,以更好的理解其原理:

public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

我们可以清楚的看到list长度减一,后面的项向前移一位

(2)、关于list的一个小算法

统计各种人的个数,并按次序输出

import java.util.ArrayList;
class Person{
    private String pType;
    private int count;
    public String getpType() {
        return pType;
    }
    public void setpType(String pType) {
        this.pType = pType;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public Person(String pType) {
        this.pType = pType;
    }
}
public class TestPerson {
public static void main(String[] args) {
    Person p1=new Person("黄种人");
    Person p2=new Person("白种人");
    Person p3=new Person("白种人");
    Person p4=new Person("白种人");
    Person p5=new Person("黄种人");
    Person p6=new Person("黑种人");
    ArrayList clist=new ArrayList();
    ArrayList list=new ArrayList();
    clist.add(p1);
    clist.add(p2);
    clist.add(p3);
    clist.add(p4);
    clist.add(p5);
    clist.add(p6);
    for(int i=0;i//得到人种
        //统计各种人的数目
        int count=0;
        for(int j=0;jif(pType.equals(clist.get(j).getpType())){
                count++;
            }       
        }
        t.setCount(count);
        list.add(t);
    }
    //删除重复的人种
    for(int i=0;ifor(int j=i+1;jif(list.get(i).getpType().equals(list.get(j).getpType())){
                list.remove(j);
                j--;
            }
        }
    }
    for(int i=0;i"人种:"+list.get(i).getpType()+"    人数:"+list.get(i).getCount());
    }
}
    /*
    输出结果为:
    人种:黄种人    人数:2
    人种:白种人    人数:3
    人种:黑种人    人数:1
    */
}

map/HashMap

map也就是我们所说的键值对,也称映射,HashMap的接口为Map

1、map的put、get、remove用法

方法摘要:
Object put(Object name, Object value) 在此Map中将指定的值关联到指定的属性名称(键)
Object get(Object name) 返回指定的属性名称的值,如果未找到属性名称,则返回 null。
Object remove(Object name) 从此 Map 中移除具有指定名称(键)的属性。

public class TestMap {
public static void main(String[] args) {
    Map map=new HashMap();
    map.put("11", "aa");
    map.put("11", "aa");
    map.put("22", "bb");
    map.put("22", "bb");
    System.out.println("长度:"+map.size());
    System.out.println("11对应的值为:"+map.get("11"));
    System.out.println(map);
    map.remove("11");
    System.out.println(map);
}
}
/*
长度:2
11对应的值为:aa
{22=bb, 11=aa}
{22=bb}
*/

注意,当map的key相同时,后面的项会把前面覆盖

2、map的几种遍历方法

(1)、利用map.keySet遍历

for (String key : map.keySet()) {
            System.out.println("key= "+ key + " and value= " + map.get(key));
        }

(2)、利用map.entrySet遍历

//map容量大时推荐使用
for (Map.Entry entry : map.entrySet()) {
            System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
        }

(3)、利用迭代器遍历

for (Iterator i = map.keySet().iterator(); i.hasNext(); ) {
            String key = i.next();
            System.out.println("key= " + key + " and value= " + map.get(key));
            }

结语:javaWeb的后端开发绝大多数需要用到List和Map,只要掌握以上常见用法,理解其中原理,我想大多数问题都能得到解决,不用一次性把所有的类和方法都记住,这也不太显示,也不需要,用到的时候再查也不迟。

你可能感兴趣的:(集合类)