黑马程序员-Java语言基础– Map<K,V> 第16-17天

来源:互联网 发布:铁蹄毁灭者 淘宝多少钱 编辑:程序博客网 时间:2024/06/07 09:54

---------------------- android培训java培训、期待与您交流! ----------------------

 

Map集合:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。

      1、添加。

           put(K key, V value)

           putAll(Map<? extendsK,? extends V> m)

 

      2、删除。

           clear()

           remove(Object key)//根据键来删除。键值唯一。将键值删除并返回对应的值。

 

      3、判断。

           containsKey(Object key)

           containsValue(ObjectValue)

           isEmpty()

 

      4、获取。

           get(Object key)

           size()

           values()

 

           entrySet()

           keySet()

 

  Map

      |--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0 效率低。

      |--HashMap:底层是哈希表数据结构。允许使用null键null值。该集合是线程不同步的。将Hashtable替换。jdk1.2 效率高

      |--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。(排序方式与TreeSet相似)

 

Map和Set很像。其实大家,Set底层就是使用了Map集合。

à可通过get方法的返回值是否为null来判断一个键是否存在。

à添加元素时,如果出现相同的键,那么后添加的值会覆盖原有键对应值,并且put方法会返回被覆盖的值(返回原来的值)。

àHashMap只允许一条记录的键为空,但允许许多条记录的值为空。

 

map集合的两种取出方式。[day16-04]

1、Set<k> keySet:将map中所有的键存入到Set集合中。因为Set集合具备迭代器。所以可以通过迭代方式取出所有的键,然后根据get方法,获取每一个键对应的值。

      Map集合的取出原理:将map集合转成set集合,再通过迭代器取出。

2、Set<Map.Entry<k,v>>entryset:将Map集合中的映射关系存入到set集合中,而这个关系的数据类型就是Map.Entry.

      Map.Entry 其实Entry也是一个接口,它是Map中的一个内部接口。

什么时候使用Map集合?

当发现数据之间存在映射关系时,就要先想到Map集合。

 

Map扩展:集合嵌套集合[day16-09]

 

集合框架中的工具类-----------------------------------------------day17

Collections类:

·对List排序:

      public static <T extendsComparable<? super T>> void sort(List<T> list);

      public static <T> voidsort(List<T> list,Comparator<? super T> c);

·获取最值:

      public static <T extendsObject & Comparable<? extends T>> T max(Collection<? extendsT> coll);

      public static <T> Tmax(Collection<? extends T> coll,Comparator<> extends T> comp);

·二分查找:

      public static <T> intbinarySearch(List<? extends Comparable<? super T>> list,T key);

      public static <T> intbinarySearch(List<? extends T> list,T key,Comparator<? super T> c);

如果没有找到返回-1

·替换反转:

      public static <T> voidfill(List<? super T> list,T obj);fill方法可以将List集合中所有元素替换成指定元素。

      public static <T>boolean replaceAll(List<T> list,T oldVal,T newVal);

      public static voidreverse(List<?> list);

      public static <T>Comparator<T> reverseOrder();

      public static <T>Comparator<T> reverseOrder(Comparator<T> cmp);

      public static voidswap(List<?> list,int i,int j);

      public static voidshuffle(List<?> list);

 

Arrays类:操作数组

数组变集合:

    publicstatic <T> List<T> asList(T... a);

    List<String>list = Array.asList(arr);  Arrays中的asList()方法。

返回一个受指定数组支持的固定大小的列表(将数组变成List集合)。

      将数组变成List集合的好处:可以使用集合的思想和方法来操作数组中的元素。

 

注意:将数组变成集合,不可以使用集合的增删方法,因为数组的长度是固定的。[day17-7]

①如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素。

②如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。

 

集合变数组:

      Collection接口中的toArray()方法。

1、指定类型的数组到底要定义多长呢?

      当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size。

      当指定类型的数组长度大于了集合的size,就不会创建新的数组,而是使用传递进来的数组(会有null的值)。所以创建一个刚刚好的数组最优。使用.size()方法即可。

2、为什么要集合变数组?

      为了限定对元素的操作。不需要进行增删了。

 

增强for循环

JDK1.5新特性,只要实现了Iterable接口(此接口只有一个方法:iterator())的对象都可以成为“foreach”语句的目标,即都可以使用增强for循环。

格式:

      for(数据类型 变量名:被遍历的集合(Collection)或者数组)

           {

           }

      局限:只能取出,不能修改。对集合进行遍历,只能获取集合元素,但是不能对集合进行操作。

      而迭代器除了遍历,还可以进行remove集合中元素的动作,如果是用ListIterator,还可以在遍历过程中进行增删改查的动作。

传统for循环与增强for循环有什么区别?

      高级for循环有一个局限性,必须有被遍历的目标。建议在遍历数组的时候,还是使用传统for循环语句。

 

可变参数

publicstatic void show(String str,int… arr)                          [day17-19]

JDK1.5新特性,其实就是上一种数组参数的简写形式,不用每一次都手动建立数组对象,只要将要操作的元素作为参数传递即可,隐式将这些参数封装成了数组。

使用时注意:可变参数一定要定义在参数列表的最后面

 

静态导入(StaticImport)

JDK1.5新特性。

import static java.util.Arrays.*;//导入的是Arrays这个类中的所有静态成员。

import static java.lang.System.*;//导入了System类中所有静态成员。

 

注意:

·当类名重名时,需要指定具体的包名。

·当方法重名时,要指定具体所属的对象或者类。

 

其他对象

System

      System:类中的方法和属性都是静态的。

      out:标准输出,默认是控制台(屏幕)。

      in:标准输入。默认是键盘。

 

描述系统的一些信息。

获取系统属性信息:Properties getProperties()

因为Properties是hashtable的子类,也就是Map集合的一个子类对象。那么可以通过map的方法取出该集合中的元素。

该集合中存储的都是字符串,没有泛型定义。

 

Runtime对象。

      该类中并没有提供构造函数。说明不可以new 对象。那么就会直接想到该类中的方法都是静态的。

      发现该类中还有非静态方法。说明该类肯定会提供方法获取本类对象,而且该方法是静态的,而且返回值是本类类型。该方法是static Runtime  getRuntime();

由这个特点可以看出该类使用了单例设计模式完成。

 

Math

ceil :double d = Math.ceil(12.34);//ceil返回大于指定数据的最小整数。

           sop("d="+d);//d=13.0

floor:double d1 =Math.floor(12.34);//floor返回小于指定数据的最大整数。

           sop("d1="+d1);//d1=12.0

round:long l = Math.round(12.34);//四舍五入

           sop("l="+l);//12

pow:double d2 = Math.pow(2,3);//23

         sop("d2="+d2);//8

 

随机数:publicstatic double random()

double d = Math.random()//[0,1)包括0,不包括1的随机小数。

int d = (int)(Math.random()*10+1);//1到10之间的随机整数。


---------------------- android培训、java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima



原创粉丝点击