---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
Map和Collection一样,是集合的顶层接口,和Collection没有直观上的联系,但是内在其实是有联系的。
public interface Map<K,V>
Map集合:该集合存储键值对,是一对一对往里存,而且要保证键的唯一性。
Collection叫单列集合,Map叫双列集合。
1.添加
V put(K key,V value)
2.删除
void clear()
V remove(Object key)
3.判断
boolean containsKey(Object key)
boolean containsValue(Object Value)
boolean isEmpty()
4.获取
Set<Map.Entry<K,V>> entrySet()
Set<K> keyset()
V get(Object key)
int size()
Collection<V> values()
Map
|---HashMap,底层是哈希表数据结构,可以存入null键null值,不同步,效率高
|---Hashtable,底层是哈希表数据结构,不可以存入null键null值,同步,效率低
|---TreeMap,底层是二叉树数据结构,不同步,可以用于给Map集合中的键排序
和Set很像,其实,Set底层就是使用了Map集合
Map集合的两种取出方式:
1.keySet:将Map中所有的键存入到Set集合,因为Set具备迭代器,所以可以用迭代方式取出所有的键,有了键就可以根据Map的get方法,获取每一个键对应的值,返回Set<K>
2.entrySet:返回Set<Map.Entry<K,V>>,取出的是Map集合中的映射关系,方法返回的是一个Set,Set中元素的类型是Map.Entry<K,V>,MapEntry是一个接口,它有getKey方法和getValue方法,取出方式很方便
Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口
interface Map
{
public static interface Entry
{
public abstract Object getKey();
public abstract Object getValue();
}
}
class HashMap implements Map
{
class Hahs implements Map.Entry
{
public abstract Object getKey(){};
public abstract Object getValue(){};
}
}
Map演示:
import java.util.*;
class MapDemo
{
public static void main (String [] args)
{
Map<String,String> m = new HashMap<String,String>();
System.out.println(m.put("aaa","11"));
System.out.println(m.put("aaa","12"));
m.put("bbb","22");
m.put("ccc","25");
m.put("ddd","22");
m.put("eee","23");
System.out.println(m);
System.out.println(m.remove("ddd"));
System.out.println(m);
System.out.println(m.containsKey("fff"));
System.out.println(m.containsValue("22"));
System.out.println(m.isEmpty());
System.out.println(m);
System.out.println(m.get("bbb"));
System.out.println(m.size());
System.out.println(m.values());
System.out.println(m.keySet());
System.out.println(m.entrySet());
}
}
示例:“dfjoeinvglasdknfljasldho”获对每一个字母在该字符串中出现的次数
希望打印结果:a(1)c(2)……
通过结果发现,每一个字母都有对应的次数,说明字母和次数之间有映射关系
注意了,当发现映射关系时,可以选择Map集合,因为Map集合中存放的就是映射关系
什么时候使用Map集合呢?
当数据之间存在映射关系时,就要先想到Map集合
思路:
1.将字符串转换成字符数组,因为要对每一个字母进行操作
2.定义一个Map集合,因为打印结果的字母有顺序,所以使用TreeMap集合
3.遍历字符数组
将每一个字母作为键去查Map集合,如果返回null,就将该字母和1存入到Map集合中,如果返回的不是null,说明该字母在Map集合中已经存在并有对应的次数,那么就获取该次数并自增,然后将该字母和自增后的次数存入到Map集合中
4.将Map集合中的数据变成指定的字符串形式返回
import java.util.*;
class Demo
{
public static void main (String [] args)
{
String s = "asjhflasdhfha";
System.out.println(s);
func(s);
}
public static void func(String str)
{
char[] chs = str.toCharArray();
TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
int count = 1;
for (int i=0; i<chs.length; i++)
{
if (tm.get(chs[i])==null)
{
tm.put(chs[i],count);
continue;
}
tm.put(chs[i],tm.get(chs[i])+1);
}
Iterator<Character> it = tm.keySet().iterator();
while (it.hasNext())
{
char ch = it.next();
System.out.print(ch+"("+tm.get(ch)+") ");
}
}
}
Collections工具类
sort
max
binarySearch
fill
reverseOrder
SynList
Arrays工具类
数组变集合
把数组变为集合的好处:可以使用集合的思想和方法来操作数组中的元素
注意:将集合变成数组,不可以使用集合的增删方法,因为数组的长度是固定的
集合变数组
1.指定类型的数组要定义多长呢?
当指定的数组长度小于集合的size,那么该方法内部会创建一个新的数组,长度为集合的size,当指定的数组长度大于集合的size,就不会创建新的数组,而是使用传递进来的数组,所以创建一个刚刚好的数组最优。
2.为什么要将集合转化为数组?
为了限定对元素的操作,不要进行增删了
增强for循环,jdk1.5,简化书写
格式
for(数据类型 变量名 : 被遍历的集合Collection或者数组){}
底层原理还是迭代器
局限性:对集合进行遍历,只能取出,不能修改,迭代器除了遍历,还可以进行remove集合中元素的动作,如果是ListIterator,还可以在遍历过程中对集合进行增删改查的动作
传统for循环和高级for循环有什么区别呢?
高级for有一个局限性,必须有被遍历的目标。比如想打印100次”hello Word”
建议在遍历数组的时候,还是使用传统for,因为传统for可以定义角标
可变参数,jdk1.5以后出现的新特性
其实就是数组参数的简写形式,不用每一次手动的建立数组对象,只要将要操作的元素作为参数传递即可,隐式的将这些参数封装成了数组。
在使用可变参数新特性的时候,可变参数一定要定义在参数列表的最后面。
静态导入,jdk1.5之后的新特性
import static java.util.Array.*;//导入的是Arrays中的所有静态成员
当类名重名的时候,需要指定具体的包名,同理,当方法重名时,需要制定具备所属对象的类
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------