黑马程序员_java_集合_Map_Collections_Arrays_TreeMap
2014-04-13 16:48
561 查看
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
一、Map
1、Map :该集合存储键值对。一对一对往里存,而且要保证键的唯一性。 和set很像。其实set底层就是使用了Map集合
|--Hashtable:底层是哈希表数据结构。不可以存入null键和null值。该集合是线程同步的。jdk1.0发布。效率低。
|--HashMap:底层是哈希表数据结构。可以存入null键和null值。该集合是线程不同步的。jdk1.2发布。效率高
|--TreeMap:底层是二叉树结构,线程不同步。可以用于给map集合中的键进行排序
2、Map的基本使用代码
3。Map集合中两种取出元素的方式
Map集合的两种取出方式:
1,keySet,将map中所有的键存入到Set集合,因为set具备迭代器。
所有的迭代方式取出素偶的键,在根据get方法,获取每一个键对应的值。
在通过Set集合的迭代器取出Set集合中的键。
通过map的get(取得键值的变量)方法获取键对应的值。
第二种取出元素的方法
2.Set<Map.Entry<k,v>> endtryset; 将Map集合中的影射关系。存入到了set集合中。
而这个关系的数据类型就是Map.Entry
取出原理:就是取出map集合中的映射关系取出。这个关系就是Map.Entry; 关系对象Map.Entry获取到后,就可以通过Map.Entry
中的getKey和getValue方法获取关系中的键和值。
3.Map.Entry其实Entry也是一个接口。它是Map接口中的一个内部接口
二、TreeMap的一个小应用与习题示例
/*
练习:
“sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。
希望打印结果:a(1)c(2).....
通过结果发现,每一个字母都有对应的次数。
说明字母和次数之间都有映射关系。
注意了,当发现有映射关系时,可以选择Map集合。
因为Map集合中存放就是映射关系。
什么时候使用Map集合呢?
当数据之间存在映射关系时,就要先想Map集合。
思路:
1、将字符串转换成字符数组,因为要对每一个字母进行操作。
2、定义一个Map集合,因为打印结果的字母有顺序,所以使用TreeMap集合。
3、遍历字符数组。
将每一个字母作为键去查Map集合。
如果返回null,将该字母和1存入到Map集合中。
如果返回不是null,说明该字母在Map集合中已经存在并有对应次数。
那么就获取该粗疏并进行自增。然后将该字母和自增后的次数存入到Map集合中,覆盖调用原理键所对应的值。
4、将Map集合中的数据变成指定的字符串形式返回。
*/
三、Collections工具类
1、Collections工具类的应用一
/*
Collections的几个基本应用
Collections.sort(); //对集合进行排序
Collections.brinarySearch() //对集合中的数据进行查找
Collections.max() //查找集合中的最大值
*/
2、Collections工具类的应用二
四、集合和数组
五、高级for循环
/*
高级for循环。
格式
for(数据类型 变量名 : 被遍历的集合(Collection)或者数组{}
对集合进行遍历。
只能获取集合元素。但是不能对集合进行操作。
迭代器除了遍历。还可以进行remove在集合中的操作。
如果是用ListIteartor,还可以在遍历过程中看集合进行增删改查的动作。
传统for和高级for有什么区别?
高级for循环有一个局限性,必须要有要被遍历的目标
*/
六、可变参数
/*
JDK1.5版本出现的新特性。
方法的可变参数。
在使用时注意:可变参数一定要定义在参数列表最后面。
可变参数:
其实就是参数数组的一种简写形式。
不用每一次都手动的建立数组对象。
只要将要操作的元素作为参数传递即可。
隐式将这些参数封装成了数组。
*/
七、静态导入
静态导入。
当类名重名时,需要指定具体的包名。
如:
packa/Demo.class
packb/Demo.class
import packa.*;
import packb.*;
如果遇到这种情况不标明类所属的包是无法准确找到类的。也就是会报错。
当方法名重名时,指定所属的对象或者类。
如:
import static java.util.Arrays.*; //导入所有类中的静态方法
//这里必须加上类名。因为本类中本身就已经继承了Object。而Object类中就有toString()方法
//如果不标明toString属于哪个类。就会报错
System.out.println(Arrays.ToString());
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>
一、Map
1、Map :该集合存储键值对。一对一对往里存,而且要保证键的唯一性。 和set很像。其实set底层就是使用了Map集合
|--Hashtable:底层是哈希表数据结构。不可以存入null键和null值。该集合是线程同步的。jdk1.0发布。效率低。
|--HashMap:底层是哈希表数据结构。可以存入null键和null值。该集合是线程不同步的。jdk1.2发布。效率高
|--TreeMap:底层是二叉树结构,线程不同步。可以用于给map集合中的键进行排序
2、Map的基本使用代码
import java.util.Map; import java.util.HashMap; class MapDemo { public static void main(String[] args) { //创建一个容器 Map<String, String> map = new HashMap<String, String>(); //添加元素 map.put("01", "zhangsan"); map.put("02", "zhangsi"); map.put("03", "zhangwu"); //判断元素是否存在 System.out.println("containsKey:" + map.containsKey("02")); //删除一个元素 System.out.println("remove:" + map.remove("02")); //获取一个元素 System.out.println("get:" + map.get("03")); //获取全部元素 System.out.println("value:" + map.values()); } }
3。Map集合中两种取出元素的方式
Map集合的两种取出方式:
1,keySet,将map中所有的键存入到Set集合,因为set具备迭代器。
所有的迭代方式取出素偶的键,在根据get方法,获取每一个键对应的值。
在通过Set集合的迭代器取出Set集合中的键。
通过map的get(取得键值的变量)方法获取键对应的值。
第二种取出元素的方法
2.Set<Map.Entry<k,v>> endtryset; 将Map集合中的影射关系。存入到了set集合中。
而这个关系的数据类型就是Map.Entry
取出原理:就是取出map集合中的映射关系取出。这个关系就是Map.Entry; 关系对象Map.Entry获取到后,就可以通过Map.Entry
中的getKey和getValue方法获取关系中的键和值。
3.Map.Entry其实Entry也是一个接口。它是Map接口中的一个内部接口
import java.util.Set; import java.util.Map; import java.util.HashMap; import java.util.Iterator; class MapKeySet { public static void main(String[] args) { //quChu_1(); quChu_2(); } //集合的第一种取出元素方法 public static void quChu_1() { //定义一个Map集合的容器 Map<String, String> map = new HashMap<String, String>(); map.put("01", "zhangsan"); map.put("02", "zhangsi"); //添加元素 map.put("03", "zhangwu"); Set<String> keyset = map.keySet(); //调用keySet方法。返回一个Set类型的集合 Iterator<String> it = keyset.iterator(); //创建一个迭代器 for( ; it.hasNext(); ) //判断。只要有数据就一直运行 { String s = it.next(); //把取出的键值赋值给变量s; String s1 = map.get(s); //用键值通过get方法获取键值对应的名称 System.out.println(s + " " + s1); } } //取出元素的第二种方式 public static void quChu_2() { //定义一个Map集合的容器 Map<String, String> map = new HashMap<String, String>(); map.put("01", "zhangsan"); map.put("02", "zhangsi"); //添加元素 map.put("03", "zhangwu"); Set<Map.Entry<String, String>> entryset = map.entrySet(); //调用entrySet方法返回一个Map.Entry的映射关系 Iterator<Map.Entry<String, String>> it = entryset.iterator(); //获取迭代器 for( ; it.hasNext(); ) //判断集合中是否有元素 { Map.Entry<String, String> ms = it.next(); //把关系对象赋值给Map.Entry集合的对象 String s1 = ms.getKey(); //获取键值 String s2 = ms.getValue(); //获取与键值对应的值 System.out.println(s1 + " " + s2); } } }
二、TreeMap的一个小应用与习题示例
/*
练习:
“sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。
希望打印结果: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.TreeMap; import java.util.Set; import java.util.Iterator; import java.util.Map; class MapTest3 { public static void main(String[] args) { String s = "s+fg_zx_cv*asdfxcvdf"; System.out.println(charString(s)); } //定义一个可以查询字符串出现次数的函数 public static String charString(String str) { char[] chs = str.toCharArray(); //将字符串转换成字符数组 //创建集合 TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>(); for(int i = 0; i < chs.length; i++) { Integer value = tm.get(chs[i]); //假如不是字母就退出本次循环 if(!(chs[i] >= 'a' && chs[i] <= 'z' || chs[i] >= 'A' && chs[i] <= 'Z')) continue; if(value == null) { tm.put(chs[i], 1); //如果集合中没有该元素。就把该元素和1放进集合中。 } else { value = value + 1; //假如不为空,就让变量自增 tm.put(chs[i], value); //然后把键和自增后的变量存入集合中。 } } //建立一个容器 StringBuffer sb = new StringBuffer(); Set<Map.Entry<Character, Integer>> entry = tm.entrySet(); //把元素存入到Set集合中 Iterator<Map.Entry<Character, Integer>> it = entry.iterator(); //建立迭代器 for( ; it.hasNext(); ) //遍历元素 { Map.Entry<Character, Integer> mec = it.next(); //把元素添加进Map.Entry中 Character c = mec.getKey(); //将键存入变量c中 Integer in = mec.getValue(); //将值存入变量in中 sb.append(c + "(" + in + ")"); //将键和值存入容器中。 } return sb.toString(); } }
三、Collections工具类
1、Collections工具类的应用一
/*
Collections的几个基本应用
Collections.sort(); //对集合进行排序
Collections.brinarySearch() //对集合中的数据进行查找
Collections.max() //查找集合中的最大值
*/
import java.util.Collections; import java.util.List; import java.util.ArrayList; import java.util.Iterator; import java.util.Comparator; class CollectionsDemo { public static void main(String[] args) { listSort(); } public static void listSort() { List<String> al = new ArrayList<String>(); //创建一个集合 al.add("abcd"); al.add("a"); //添加元素 al.add("abc"); al.add("efang"); al.add("ge"); Iterator<String> it = al.iterator(); //定义一个迭代器 String max = Collections.max(al, new Comp()); System.out.println("max = " + max); for( ; it.hasNext(); ) //判断是否有元素 { Collections.sort(al, new Comp()); //调用工具类中的sort方法。并把一个比较器但成实参传递给sort方法 System.out.println(it.next()); } //查找某个元素所在的具体位置 //int index = Collections.binarySearch(al, "a", new Comp()); //System.out.println(index); //调用自定义查找方法 int index1 = binarySearchDemo(al, "ge", new Comp()); System.out.println(index1); } public static int binarySearchDemo(List<String> ls, String key, Comparator<String> comp) //传入容器和具体要查的元素和比较器 { int max, min, mid; //定义三个变量分别代表最大、最小、中间 max = ls.size() - 1; //计算最后一个角标的位置 min = 0; //确定最小角标的位置 while(max >= min) { mid = (max + min) >> 1; //计算中间角标的位置。 >>1 相当于/(除)2; String str = ls.get(mid); //获取中间角标位置上的元素 int num = comp.compare(str, key); //判断输入的元素和中间角标位置的数是否相同 if(num > 0) //假如num大于0,说明str大于key的值 max = mid - 1; else if(num < 0) //假如num小于0,说明str小于key的值 min = mid + 1; else //反之就说明元素找到了 return mid; } return -min-1; //如果没有就返回要插入的位置减一 } } //新建一个比较器,实现Comparator接口。重写compare方法 class Comp implements Comparator<String> { public int compare(String s1, String s2) { if(s1.length() > s2.length()) return 1; if(s1.length() < s2.length()) return -1; return s1.compareTo(s2); } }
2、Collections工具类的应用二
/* Collections.fill(List<? super T> list, T obj); //把集合中的所有元素全部替换成某个元素 Collections.replaceAll(List<T> list, T oldVal, T newVal); //把集合中某个旧的元素替换成新的元素。 Collections.reverse(List<?> list); //将集合元素反转 */ import java.util.Collections; import java.util.ArrayList; class CollectionsDemo1 { public static void main(String[] args) { lian(); } public static void lian() { ArrayList<String> al = new ArrayList<String>(); al.add("adaf"); al.add("aaa"); al.add("bad"); al.add("bacsxd"); al.add("adr"); p("原来元素:" + al); //Collections.fill(al, "pp");//把集合中的所有元素全部替换成某个元素 //p("替换后元素:" + al); //Collections.replaceAll(al, "aaa", "zhangdongdong"); //把集合中某个旧的元素替换成新的元素。 //p("替换后元素:" + al); Collections.reverse(al); //将集合元素反转 p("反转后的元素:" + al); } public static void p(Object obj) { System.out.println(obj); } } 3、Collections工具类的应用三 /* Collections.reverseOrder(); 返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序。 */ import java.util.TreeSet; import java.util.Iterator; import java.util.Collections; import java.util.Comparator; class CollectionsDemo3 { public static void main(String[] args) { ni(); } //写一个程序逆转的例子 public static void ni() { //把CompCom的对象当成实参传递给Collections.reverseOrder()方法。 TreeSet<String> al = new TreeSet<String>(Collections.reverseOrder(new CompCon())); al.add("adaf"); //添加元素 al.add("adadf"); al.add("adzvafd"); al.add("favdsf"); al.add("favfssdd"); Iterator<String> it = al.iterator(); //定义迭代器 for( ; it.hasNext(); ) //遍历函数 { String s = it.next(); //把元素赋值给变量s System.out.println(s); } } }
四、集合和数组
import java.util.Arrays; import java.util.List; import java.util.ArrayList; import java.util.Collection; class ArraysDemo { public static void main(String[] args) { //array(); arrayList(); } Arrays.asList(类型)把数组变成集合 把数组变成List集合有什么好处? 可以使用集合的思想和方法类操作数组中的元素。 注意: 将数组变成集合,不可以使用集合的增删方法。 因为数组的长度是固定的。 如果你增删,那么会发生UnsuppertedOperationException 如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接变成集合中的元素。 如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。 public static void array() { int[] i = {1, 3, 5}; List<int[]> li = Arrays.asList(i); System.out.println(li); //打印结果为[[I@bdb503] 。因为是整数数组。所以把数组当成元素存入到集合中了 Integer[] in = {1, 3, 5}; List<Integer> lin = Arrays.asList(in); System.out.println(lin); //打印结果为 {1, 3, 5};因为Integer是基本数据类。所以它定义的数组中的元素都是对象。所以集合可以存入数据。因 为集合中的数据都是对象 String[] s = {"abd", "dbc", "ade"}; List<String> ls = Arrays.asList(s); System.out.println(ls); //打印结果为[abd, dbc, ade] 原因和Integer类一样。 } /* 集合变数组。 Collection接口中的toArray方法。 1.指定类型的数组到底要定义多长呢? 当指定类型数组长度小于了集合的seze,那么该方法内部会创建一个新的数组,长队为集合的size 当指定类型的数组长度大于了集合的size,就不会新创建数组,二十使用传递类进来的数组。 2,为什么要将集合变成数组? 为了限定对元素的操作。不需要对集合进行增删了。 */ public static void arrayList() { //定义集合 ArrayList<String> al = new ArrayList<String>(); al.add("adfd"); al.add("adf"); //添加元素 al.add("df"); String[] str = al.toArray(new String[al.size()]); //使用toArray()方法把集合变成数组 System.out.println(Arrays.toString(str)); //打印数组中的字符串形式 } }
五、高级for循环
/*
高级for循环。
格式
for(数据类型 变量名 : 被遍历的集合(Collection)或者数组{}
对集合进行遍历。
只能获取集合元素。但是不能对集合进行操作。
迭代器除了遍历。还可以进行remove在集合中的操作。
如果是用ListIteartor,还可以在遍历过程中看集合进行增删改查的动作。
传统for和高级for有什么区别?
高级for循环有一个局限性,必须要有要被遍历的目标
*/
import java.util.HashMap; import java.util.Map; class ForEach { public static void main(String[] args) { eachFor(); } //写一个增强for循环的函数 public static void eachFor() { //建一个HashMap集合 HashMap<Integer, String> hm = new HashMap<Integer, String>(); hm.put(1, "aaa"); hm.put(2, "bbb"); hm.put(3, "ccc"); for(Map.Entry<Integer, String> me : hm.entrySet()) { System.out.println(me.getKey() + " " + me.getValue()); } } }
六、可变参数
/*
JDK1.5版本出现的新特性。
方法的可变参数。
在使用时注意:可变参数一定要定义在参数列表最后面。
可变参数:
其实就是参数数组的一种简写形式。
不用每一次都手动的建立数组对象。
只要将要操作的元素作为参数传递即可。
隐式将这些参数封装成了数组。
*/
class KeBianCan { public static void main(String[] args) { int[] arr = {1, 4, 6, 7, 3}; show(arr); } //定义一个可变参数的示例 public static void show(int... in) //其实int... in可以理解成int[] in.因为这个参数对数组的封装是隐式的。也是数组参数的简写模式 { for(int i = 0; i < in.length; i++) { System.out.println(in[i]); } } }
七、静态导入
静态导入。
当类名重名时,需要指定具体的包名。
如:
packa/Demo.class
packb/Demo.class
import packa.*;
import packb.*;
如果遇到这种情况不标明类所属的包是无法准确找到类的。也就是会报错。
当方法名重名时,指定所属的对象或者类。
如:
import static java.util.Arrays.*; //导入所有类中的静态方法
//这里必须加上类名。因为本类中本身就已经继承了Object。而Object类中就有toString()方法
//如果不标明toString属于哪个类。就会报错
System.out.println(Arrays.ToString());
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>
相关文章推荐