简介
如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序。
程序在运行时才知晓需要在何时何处建立多少何种类型的对象,不能用命名的引用来保存每一个对象
使用集合(容器)来保存对象(对象的引用),克服数组的定长问题及特殊方式存储(map)
List列表:有序可重复 常用实现类:ArrayList(采用数组的方式实现,检索的效率高,插入和删除的效率低)
LinkedList(采用双向循环链表的方式实现,插入和删除的效率高)
Set集合:无序不可重复(map的key,故不可重复) 常用实现类: HashSet TreeSet
Map映射:key--value键值对(hash表的方式实现)
具体使用
String的使用与基本数据类似,不宜理解集合的使用,故建立另外得User类来使用集合
程序简单的三个java类如图
user类
public class User {
private String name;
private String password;
private int age;
public User(){
}
public User(String name,String password,int age){
this.name = name;
this.password = password;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
ForArrayList类
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ForArrayList {
public static void main(String[] args) {
List <User> users = new ArrayList<User>();
users.add(new User("ooo","111",20));
users.add(new User("uuu","222",20));
//遍历方法一,for each
for(User u : users){
System.out.println(u);
System.out.println(u.getName()+"的密码是"+u.getPassword());
System.out.println(u.getName()+"的年龄是"+u.getAge());
}
//遍历方法二,数组
/* String[] strArray = new String[users.size()];
users.toArray(strArray);
for(int i=0;i<strArray.length;i++){
System.out.println(strArray[i]);
}
//遍历方法三,迭代器
Iterator <User> ite = users.iterator();
while(ite.hasNext()){
System.out.println(ite.next());
}*/
}
}
User@15db9742
ooo的密码是111
ooo的年龄是20
User@6d06d69c
uuu的密码是222
uuu的年龄是20
ooo的密码是111
ooo的年龄是20
User@6d06d69c
uuu的密码是222
uuu的年龄是20
ForHashMap类
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class ForHashMap {
public static void main(String[] args) {
Map <String,User> map = new HashMap<String,User>();
map.put("001", new User("ooo","111",20));
map.put("002", new User("uuu","222",20));
//遍历方法一,entrySet。推荐EntrySet遍历,特别是数据量大的时候
for(Map.Entry<String,User> entry : map.entrySet()){
System.out.println(entry.getKey()+" "+entry.getValue());
System.out.println(entry.getKey()+"的名字是"+entry.getValue().getName());
}
/* //遍历方法二,keySet
for(String key:map.keySet()){
System.out.println(key+" "+map.get(key));
}
//遍历方法三,迭代器
Iterator <Map.Entry<String,User>> ite = map.entrySet().iterator();
while(ite.hasNext()){
Entry<String, User> entry = ite.next();
System.out.println(entry.getKey()+" "+entry.getValue());
}*/
}
}
ForHashMap类输出
001 User@15db9742
001的名字是ooo
002 User@6d06d69c
002的名字是uuu
001的名字是ooo
002 User@6d06d69c
002的名字是uuu
集合使用的具体方法,集合使用的方法都是类似的,可以分为几个部分
增加:add() addAll()等
删除:remove() removeAll() clear()等
获取:get()
长度:size()
判断:isEmpty() contains() containsAll()等
生成数组:toArray()
。。。。。。。。。
这些具体的使用方法,在项目中能够有机会使用一遍,便能记忆深刻
另外两点:1、泛型的使用保证了集合(容器)的类型安全
2、使用迭代器遍历,迭代器的使用的一大优点是不用关心容器的类型
源码
源码分析能更加理解集合,理解它的数据存储方式(特点)和具体方法的实现
源码分析这位前辈的剖析非常好了,它的连接:http://blog.youkuaiyun.com/column/details/collection.html?page=1