java学习--MAP集合类
1.map集合遍历方式 :keyset()方法
得到map集合中所有的键,装到set集合中;然后可通过set集合作遍历。
public class mapdemo {
public static void main(String[] args) {
//1.调用map集合的方法keyset,把所有的键存储到set集合中
//2.遍历set集合,获取出set中所有元素(map中所有的键)
//3.调用map集合方法,由键获取值(map中本身没有迭代器,不能遍历)
//这里返回的keyset其实是hashmap中的一个内部类集合
Map<String,Integer>map = new HashMap<String,Integer>();
map.put("a", 11);
map.put("b", 12);
map.put("c", 13);
map.put("d", 14);
map.put("e", 15);
/*Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while(it.hasNext()) {
String key = it.next();
Integer value = map.get(key);
System.out.println(key+"......"+value);//map必须借用set第三方集合才能用来遍历
}*/
//利用增强for遍历,比用迭代器容易,代码量下降
System.out.println("==================================================");
for(String key : map.keySet()) {//增强for循环,实际上增强for编译完了就是迭代器
Integer value = map.get(key);
System.out.println(key+"="+value);
}
}
}
2.map集合遍历方式:entrySet方法 键值对的映射关系
Entry键值对对象
在map类设计时,提供了一个嵌套接口:entry;Entry将键值对的映射关系(集合中键值的映射关系:结婚证)封装成了对象
Entry是Map接口中提供的一个静态内部嵌套接口
实现步骤:
(1)调用map集合方法entrySet(),将集合中映射关系对象存储到Set集合
Set<Entry <k,v>> 此处为一个泛型的嵌套
(2)迭代Set集合
(3)获取出的Set集合的元素是映射关系对象
(4)通过映射关系对象中的方法getKey,getValue获取键值对
该种方式比keySet方式更简单
增强for循环:Collection接口有个父接口Iterable<>,该接口下的实现类均可用增强for循环,而该接口下没有map,因此不能map不能用增强for循环直接遍历,但是可以通过Set遍历,即增强for间接遍历map
增强for中:左边为键值 右边为map.xxset
3.HashMap集合存储和遍历
public class HashMapDemo1 {
// 使用hashmap集合,存储自定义对象,该对象可以作为键出现也可以作为值出现
// 使用hashmap集合存儲自定義對象person,作为值出现
public static void main(String[] args) {
funtion();
}
private static void funtion() {
// TODO Auto-generated method stub
HashMap<String, Person> map = newHashMap<String, Person>();
map.put("HeiFei", new Person("a", 20));
map.put("B", new Person("b", 30));
// 键的对象是字符串,可以保证唯一性
// 如果自定义对象作为键(此处是值),需要重写hashcode equals才能保证键的唯一性,可直接自动重写
for (String key : map.keySet()) {
Person value = map.get(key);
System.out.println(key + "=" +value);
}
System.out.println("==================");//用Entry方式再遍历一次
for (Map.Entry<String, Person> entry :map.entrySet()) {
String key = entry.getKey();
Person value = entry.getValue();
System.out.println(key + "..." +value);
}
}
}
4.LinkedHashMap
继承自HashMap,保证了迭代的顺序,所遇到的所有集合都是线程不安全的(运行速度快)
5.Hashtable的特点
Map接口的又一个实现类:Hashtable
底层数据结构为哈希表,特点和HashMap是一样的
特点区别:属于线程安全集合,运行速度较慢(故被抛弃),与Vector一样,从jdk1.2开始被更先进的hashmap取代;
而Hashmap属于线程不安全的集合,运行速度快,允许存储null值和键(HashTable不允许存储null )
虽然Hashtable挂了,但是他的孩子子类Properties(可和io流共同配合,实现数据的持久存储,集合本身都是内存里的东西而已)——依然活跃在开发舞台
6.静态导入(jdk 1.5新特性)
作用:简化一些代码,减少开发的代码量,实际用处一般
标准写法:导入包的时候才能使用
7.方法的可变参数VarArgumentsDemo
jdk1.5新特性;
比如说计算整数和,一开始是计算两个整数和,然后要求变成三个。。。。。要求随时会变,方法不可能简单的无限定义下去。
前提:方法的参数数据类型确定,但是参数个数可变
public class VarArgumentsDemo {
public static void main(String[] args) {
//调用一个带有可变参数的方法时,传递参数的个数可任意
int sum =getSum(1,3,6,4,6);
System.out.println(sum);
}
public static int getSum(int...a) {//注意方法中可变参数的写法;数据类型。。。变量名(只有三个点).此处a的本质就是一个数组
System.out.println(Arrays.toString(a));//若运行结果为“[I******”表明该参数为一个数组
int sum = 0;
for(int i : a ) {
sum = sum + i;
}
return sum;
}
}
注意事项:一个方法中可变参数只有一个(不然在函数调用的时候你也不晓得是传给哪个参数)(注意是可变参只有一个不是说参数只能有一个);
可变参数必须写在参数列表的最后一位 : fun(int a,int b,int...c)
若写成fun(Objiect...c)则随便传参数类型
8.Collections集合的工具类--CollectionsDemo1
collection:util包中的根接口
Collections:util包中的类-集合操作的工具类,其功能用来操作collection,由静态方法组成(折半查找,sort,shuffle(随机排列集合元素))
9.集合的嵌套
集合本身就是一个对象,集合存储的也是对象,所以集合里面也可以存集合,即集合的嵌套。