我将在这篇文章中较为详细地介绍集合类list(列表)和map(映射)的常见用法和和易错点,仅仅介绍我们平常用到的,适合java初学者参考学习,这都是我学习和开发过程中所积累的,望对你们有些帮助,本人才疏学浅,可能有些地方描述不是太严谨,敬请原谅。
我们过去通常把一些类型相同的一组数据放入数组中,但是,数组有一个重大缺点,那就是使用数组前必须指定数组的长度。我们在开发过程中往往不知道一组数据的到底有多长,并且希望动态的添加或删除这组数据来满足我们的业务需求,数组肯定是不满足的,这就要用到我们的集合类了。
list也称列表,是最常用的集合类,List是ArrayList的父类,功能用法大致相同
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”插入指定位置,并将后面的项向后移。
看下面的代码
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的方式修改字符串或类中的内容。
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长度减一,后面的项向前移一位
统计各种人的个数,并按次序输出
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
方法摘要:
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相同时,后面的项会把前面覆盖
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
//map容量大时推荐使用
for (Map.Entry entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
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,只要掌握以上常见用法,理解其中原理,我想大多数问题都能得到解决,不用一次性把所有的类和方法都记住,这也不太显示,也不需要,用到的时候再查也不迟。