Collection有两个接口了它List和Set。
List接口中有两个实现类ArrayList和LinkedList
Set中用的并不多,它的一个实现类为HashSet,用散列表实现。
散列查找比顺序查找更加快!
Map接口是一个映射。
Object[] temp = new Object[length];
System.arraycopy(data,0,temp,0,data.length);
data = temp;
上面三句话等于下面一句话。数组扩展的方法。非常重要!
//表示把data数组的length个元素的数组copy到data数组中。
data = Arrays.copyOf(data,length);
多年的疑惑在这里要被解决:
Collection接口里面有一个方法iterator(),这个方法会返回返回在此 collection
的元素上进行迭代的迭代器Iterator<E>,所以凡是实现了Collection接口的所有类
都会有这个方法。并且返回那个迭代器。
超级经典的迭代:
while(ite.hasNext()){//游标最初在第一个元素之前,hasNext()表示有没有下一个,如果有返回true;
String e = (String)ite.next();//执行next()方法会把游标指向一个元素,并且返回下一个元素。
System.out.println(e);
sum++;
}
能够控制游标移动的方法是next(),而hasNext()只是检测有没有下一个,如果有再移动,这就是它们与while或者for
循环的完美配合。
//shuffle这个是打乱的意思,以前的又白写了,哈哈。Collections是工具包中的类。是一个工具类。
Collections.shuffle(cards);
//随机分配给某个人,因为我们知道这是一个周期数列。
players[idx++%players.length].add(card);
取余是一个周期数列,十分重要。例如第二个%后面的数字是7,那么就是1-6的一个周期数列 。
idx++%players.length 十分好的一个周期数列。
面向对象的思维:
就想成一个对象,现实中怎么做,java中也怎么做,一个player里面有什么,java中也有什么。它有什么,就是指自己有
什么样的成员变量,一个对象拥有的东西就是它的成员变量,一个人能够干什么就是它有什么样的方法。
以自然中朴素逻辑去思考。
CountCharDemo.java十分重要。必须要参看代码一下。
public class CountCharDemo {
/**
* @param args
*/
public static void main(String[] args) {
Map<Character,Integer> map = countChar("aabcdeeedaaa");
System.out.println("toString():"+map.toString());
//map的迭代一迭代的也是每一个条目,与迭代二相同,只是一个while,一个for.
for (Map.Entry<Character, Integer> maps : map.entrySet()) {
System.out.println(maps.getKey()+":"+maps.getValue());
}
//map的迭代二
/**
* entrySet()返回条目的集合,一条一条的map映射是一个条目,返回是一个Set类型
* 所以它是不重复无序的。set里面的泛型是Map.Entry.
* 迭代的是每个条目。
*/
Set<Map.Entry<Character,Integer>> set = (Set)map.entrySet();
Iterator iterator = set.iterator();
System.out.println("--------------------------");
System.out.println("|字符|数量|");
while (iterator.hasNext()) {
Map.Entry<Character, Integer> entry = (Map.Entry<Character, Integer>) iterator.next();
System.out.print("| "+entry.getKey()+" | ");
System.out.println(entry.getValue()+" |");
}
//MAP的迭代 三 通过键值进行迭代 ,因为键值本身不重复。再通过值迭代value.
Set<Character> set2 = map.keySet();
Iterator iterator2 = set2.iterator();
while (iterator2.hasNext()) {
char c = (Character)iterator2.next();
int val = map.get(c);
System.out.print("字符:" + c);
System.out.println("数:" + val);
}
}
public static Map<Character, Integer> countChar(String string){
Map<Character,Integer> map = new HashMap<Character, Integer>();
for (int i = 0; i < string.length(); i++) {
//扫描字符串中的每个字符
char c = string.charAt(i);
if(map.containsKey(c)){//检查 c 是否被统计过
//根据键值得到value值。
int val = map.get(c);//取出原先的统计结果并加一,这里有一个自动拆包的过程
val++;
map.put(c, val);//将新结果送回map
}else { //c没有被统计过, 为map增加新纪录:"c:1"
map.put(c, 1);
}
}
return map;
}
}
集合的迭代(遍历)(模仿了数鸡蛋的方式)
1 java 接口 Iterator(迭代器) 描述了逐一遍历的
方法.
2 Iterator 描述了一个顺序结构, 并且有一个游标
概念, 游标默认在第一个元素之前. 调用方法
hasNext() 可以检查游标是否有下一个元素.
使用next() 方法移动游标,并且返回当前游标指向的
元素. 这两个方法经常与while循环组成模式化
结构, 用来遍历集合内容. 是常见的标准结构.
3 凡是对集合的遍历都应采用Iterator接口实现.
编程中十分常见.
4 集合在迭代期间不能调用集合的更新方法 add()
remove set 等
5 如果需要迭代时候删除集合内容, 可以调用迭代器的
删除方法 ite.remove() 删除当前元素.不能直接在用集合删除 。
User u = userMap.get(name);
if(u!=null){
throw new UserExistException("已经注册过了!");
}
//如果上面抛出了异常就不可能执行下面的代码 因为软件已经出错了。
User user=new User();
user.setId(idx++);
user.setEmail(email);
user.setName(name);
user.setPwd(pwd);
userMap.put(name, user);
/**
只需要记住一句话,如果运行到有异常,软件就会停止。抛出异常。
如果我们用try catch把异常给捕获了,然后在catch语句块里面写上相应的东西,
它就不会抛出异常,而是会去执行语句块里面的东西,
例如:jobsys中,在插入数据所时间,如果检测到已经存在这个用户,肯定会抛出异常,
那么如果捕获到这个异常,则会执行catch语句块里面的东西,那么我们把catch语句块里面的
东西写成update不就行了吗?
厉害 吧。
*/