• Map

  Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的key不容许重复即同一个Map对象的任何两个key通过equals方法比较总是返回false。

  key和value之间存在单向一对一关系,即通过指定的key,总能找到唯一的、确定的value。从Map中取出数据时,只要给出指定的key,就可以取出对应的value。

  如果把Map里的所有key放在一起看,它们就是一个Set集合,实际上Map确实包含一个keySet()方法,用于返回Map所有key组成的Set集合。如下:

  1. public class Test {
  2. public static void main(String[] args){
  3. Map<String, String> mapVal = new HashMap<String, String>();
  4. mapVal.put("spring", "春");
  5. mapVal.put("summer", "夏");
  6. mapVal.put("autumn", "秋");
  7. mapVal.put("winter", "冬");
  8. //获取mapVal集合的所有key值
  9. Set<String> set = mapVal.keySet();
  10. Iterator<String> it = set.iterator();
  11. while(it.hasNext()){
  12. String season = it.next();
  13. System.out.println(season);
  14. }
  15. }
  16. }

  不仅如此,Map里key集合和Set集合里元素的存储形式也很像,Map子类和Set子类在名字上也惊人的相似:如Set接口下有HashSet、LinkedHashSet、SortedSet(接口)、TreeSet、EnumSet等实现类和子接口,而Map接口下则有HashMap、LinkedHashMap、SortedMap(接口)、TreeMap、EnumMap等实现类和子接口。正如它们名字所暗示的,Map的这些实现类和子接口中key集存储形式和对应Set集合中元素的存储形式完全相同。

  如果把Map所有value放在一起看,它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找,只是map中的索引不再使用整数值,而是以另一个对象做为索引。如果需要从List集合中取元素,需要提供该元素的数字索引;如果需要从Map中取出元素,需要提供该元素的key索引。因此,Map有时也被称为字典,或关联数组。Map接口中定义了如下常用方法:

  1. void clear();  //删除该Map对象中所有key-value对。
  2. boolean containsKey(Object key);        //查询Map中是否包含指定key,如果包含则返回true。
  3. boolean containsValue(Object value);   //查询Map中是否包含一个或多个value,如果包含则返回true。
  4. Set entrySet();        //返回Map中所包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象。
  5. Object get(Object key);        //返回指定key所对应的value,如果此Map不包含该key,则返回null。
  6. boolean isEmpty();            //查询该Map集合是否为空(即不包含任何key-value对),如果为空则返回true。
  7. Set keySet();      //返回该Map中所有key所组成的Set集合。
  8. Object put(Object key, Object value);       //添加一个key-value对,如果当前Map中已有一个与key相等的key-value对,则新的key-value对会覆盖原来的key-value对。
  9. void putAll(Map m);        //将指定Map中的key-value对复制到本Map中。
  10. Object remove(Object key);        //删除指定key所对应的key-value对,返回被删除key所关联的value,如果key不存在,返回nul
  11. int size();            //返回该Map里的key-value对的个数。
  12. Collection values();     //返回该Map里所有value组成的Collection。

  Map中包含一个内部类:Entry。该类封装了一个key-value对,Entry包含三个方法:

  1. Object  getKey();  //返回该Entry里包含的key值。
  2. Object  getValue();   //返回该Entry里包含的value值。
  3. Object  setValue(V value);  //设置该Entry里包含的value值,并返回新设置的value值。

 我们可以把Map理解成一个特殊的Set,只是该Set里包含的集合元素是Entry对象,而不是普通对象。

如下为Entry示例:

  1. public class Test {
  2. public static void main(String[] args){
  3. Map<String, String> mapVal = new HashMap<String, String>();
  4. mapVal.put("spring", "春");
  5. mapVal.put("summer", "夏");
  6. mapVal.put("autumn", "秋");
  7. mapVal.put("winter", "冬");
  8. Set<Entry<String, String>> entrySet = mapVal.entrySet();
  9. Iterator<Entry<String, String>> iterator = entrySet.iterator();
  10. while(iterator.hasNext()){
  11. Entry<String, String> next = iterator.next();
  12. String key = next.getKey();
  13. String value = next.getValue();
  14. System.out.println("key:"+ key +"-------value:" + value);
  15. }
  16. }
  17. }
  • HashMap和Hashtable实现类

  HashMap和Hashtable都是Map接口的典型实现类,他们之间的关系完全类似于ArrayList和Vector的关系:Hashtable是一个古老的Map实现类,它从JDK1.0起就已经出现了,当它出现时,Java没有提供Map接口,所以它包含了两个繁琐的方法:elements()(类似于Map接口定义的values()方法)和keys(类似于Map接口定义的keySet()方法),现在很少使用这两个方法。

  HashMap和Hashtable的两点典型区别:

  Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable性能要高一点;但如果有多条线程访问同一个Map对象时,使用Hashtable实现类会更好。

  Hashtable不容许使用null作为key和value,如果试图把null放进Hashtable中,将会引发NullPointerException异常;但HashMap可以使用null做为key和value。

  注意:与Vector类似,尽量少用Hashtable实现类,即使需要创建线程安全的Map实现类,也可以通过Collections工具类把HashMap变成线程安全的,无须使用Hashtable实现类。

  为了成功地在HashMap、Hashtable中存储、获取对象,用作key的对象必须实现hashCode方法和equals方法。

  与HashSet不能保证元素的顺序一样,HashMap和Hashtable也不能保证key-value对的顺序。类似于HashSet的是,HashMap、Hashtable判断两个key相等的标准也是:两个key通过equals方法比较返回true,两个key的hashCode值也相等。

  除此之外,HashMap、Hashtable中还包含一个containsValue方法用于判断是否包含指定的value,那么HashMap、Hashtable如何判断两个value相等呢?HashMap、Hashtable判断两个value相等的标准更简单:只要两个对象通过equals比较返回true即可

  • LinkedHashMap类  

  HashMap有一个子类:LinkedHashMap;LinkedHashMap也使用双向链表来维护key-value对的次序,该链表定义了迭代顺序,该迭代顺序与key-value对的插入顺序保持一致。LinkedHashMap可以避免需要对HashMap、Hashtable里的key-value对进行排序(只要插入key-value对时保持顺序即可)。同时又避免使用TreeMap所增加的成本。

  LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能,但在迭代访问Map里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。

  1. public class Test {
  2. public static void main(String[] args){
  3. LinkedHashMap<String, String> mapVal = new LinkedHashMap<String, String>();
  4. mapVal.put("spring", "春");
  5. mapVal.put("summer", "夏");
  6. mapVal.put("autumn", "秋");
  7. mapVal.put("winter", "冬");
  8. System.out.println(mapVal);
  9. for(String str : mapVal.keySet()){
  10. System.out.println("key:" + str);
  11. System.out.println("value:" + mapVal.get(str));
  12. }
  13. }
  14. }
  • Properties类

  Properties类是Hashtable类的子类,正如它的名字所暗示的,该文件在处理属性文件。Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入属性文件,也可以把属性文件中的属性名=属性值加载到Map对象中。由于属性文件里的属性名、属性值只能是字符串类型,所以Properties里的key、value都是字符串类型,该类提供了如下三个方法来修改Properties里的key、value值。

  1. String  getProperty(String key);   //获取properties中指定属性名对应的属性值,类似于Map的get(Object key)方法。
  2. String  getProperty(String key, String defaultValue);    //该方法与前一个方法基本相似,该方法多个功能,如果Properties中不存在指定key时,该方法返回默认值。
  3. Object setProperty(String  key, String value);    //设置属性值,类似Hashtable的put方法。
  4. void load(InputStream inStream);      //从属性文件(以输出流表示)中加载属性名=属性值,把加载到的属性名=属性值对追加到Properties里(由于Properties是Hashtable的之类,它不保证key-value对之间的次序)。
  5. void store(OutputStream out, String comments);    //将Properties中的key-value对写入指定属性文件(以输出流表示),comments是要写的注解。

  如下代码所示:

  1. public class Test {
  2. public static void main(String[] args){
  3. Properties readProperties = new Properties(); //用来写的Properties对象
  4. readProperties.setProperty("username", "zhangsan");
  5. readProperties.setProperty("password", "123456");
  6. Properties writeProperties = new Properties(); //用来读的Properties对象
  7. FileInputStream fileInputStream = null;
  8. FileOutputStream fileOutputStream = null;
  9. try {
  10. //1.1通过类装载器获取要存储的路径
  11. String path = Test.class.getResource("/").getPath();
  12. path = path + "config.properties";
  13. System.out.println(path);
  14. fileOutputStream = new FileOutputStream(new File(path));
  15. //1.2将配置文件信息写到硬盘上
  16. readProperties.store(fileOutputStream, "This is config with database!");
  17.  
  18. //2.1读取硬盘上的配置文件
  19. fileInputStream = new FileInputStream(new File(path));
  20. writeProperties.load(fileInputStream);
  21. String username = writeProperties.getProperty("username");
  22. String username2 = writeProperties.getProperty("username2" , "没有找到username2的key");
  23. //打印结果"sername:zhangsan"
  24. System.out.println("username:" + username);
  25. //打印结果"username2:没有找到username2的key"
  26. System.out.println("username2:" + username2);
  27. } catch (FileNotFoundException e) {
  28. e.printStackTrace();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }finally{
  32. if(fileOutputStream != null){
  33. try {
  34. fileOutputStream.close();
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }
  40.  
  41. }
  42. }
  • SortedMap接口和TreeMap实现类

  正如Set接口派生出了SortedSet子接口,SortedSet接口有一个TreeSet实现类,Map接口也派生了一个SortedMap子接口,SortedMap也有一个TreeMap实现类。

  与TreeSet类似的是,TreeMap也是基于红黑树对TreeMap中所有key进行排序,从而保证TreeMap中所有key-value对处于有序状态。TreeMap也有两种排序方式:

    自然排序:TreeMap的所有key必须实现那Comparable接口,而且所有key应该是同一个类的对象,否则将会抛出ClassCaseException。

    定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中所有key进行排序。采用定制排序时不要求Map的key实现Comparable接口。

  *可以参考TreeSet的代码演示。

修饰符和类型 方法和描述
Map.Entry<K,V> ceilingEntry(K key)

返回大于或等于给定键相关联的与最小键 - 值映射,或者null如果不存在这样的键。
K ceilingKey(K key)

返回大于或等于给定键的最小键,或者null如果不存在这样的键。
void clear()

从此映射中删除所有映射。
Object clone()

返回此TreeMap实例的浅表副本。
Comparator<? super K> comparator()

返回用于对此映射中的键进行排序的比较器,或者 null此映射使用其键的自然排序
boolean containsKey(Object key)

true如果此映射包含指定键的映射,则返回。
boolean containsValue(Object value)

返回true如果此映射将一个或多个键映射到指定值。
NavigableSet<K> descendingKeySet()

返回NavigableSet此映射中包含的键的逆序视图。
NavigableMap<K,V> descendingMap()

返回此映射中包含的映射的逆序视图。
Set<Map.Entry<K,V>> entrySet()

返回Set此映射中包含的映射的视图。
Map.Entry<K,V> firstEntry()

返回与此地图中最小键相关的键值映射,或者null地图为空。
K firstKey()

返回此地图中当前第一个(最低)的键。
Map.Entry<K,V> floorEntry(K key)

返回与最大键小于或等于给定键相关联的键 - 值映射,如果不存在这样的键,则返回null。
K floorKey(K key)

返回小于或等于给定键的最大键,如果不存在这样的键返回null。
void forEach(BiConsumer<? super K,? super V> action)

对此映射中的每个条目执行给定操作,直到处理完所有条目或操作抛出异常为止。
V get(Object key)

返回指定键映射到的值,或者null此映射不包含键的映射。
SortedMap<K,V> headMap(K toKey)

返回此映射的关键字严格小于的部分的视图toKey
NavigableMap<K,V> headMap(K toKey, boolean inclusive)

返回此映射关键字小于(或等于,如果inclusive为真)的部分的视图toKey
Map.Entry<K,V> higherEntry(K key)

返回与最小键相关的键 - 值映射严格大于给定键,或者null如果不存在这样的键。
K higherKey(K key)

返回严格大于给定键的最小键,或者 null如果不存在这样的键。
Set<K> keySet()

返回Set此映射中包含的键的视图。
Map.Entry<K,V> lastEntry()

返回与此地图中最大键关联的键值映射,或者null映射为空。
K lastKey()

返回此地图中当前最后一个(最高)的键。
Map.Entry<K,V> lowerEntry(K key)

返回与最大键相关的键 - 值映射严格小于给定键,或者null如果没有这样的键。
K lowerKey(K key)

返回最大的密钥严格小于给定的密钥,或者 null如果没有这样的密钥。
NavigableSet<K> navigableKeySet()

返回NavigableSet此映射中包含的键的视图。
Map.Entry<K,V> pollFirstEntry()

移除并返回与此地图中的最小键相关联的键值映射,或者null地图为空。
Map.Entry<K,V> pollLastEntry()

移除并返回与此地图中最大键关联的键值映射,或者null地图为空。
V put(K key, V value)

将指定的值与此映射中指定的键关联。
void putAll(Map<? extends K,? extends V> map)

将指定地图中的所有映射复制到此地图。
V remove(Object key)

如果存在,则从此TreeMap中移除此键的映射。
V replace(K key, V value)

仅当指定键的条目映射到某个值时才替换该条目。
boolean replace(K key, V oldValue, V newValue)

仅当当前映射到指定值时才替换指定键的条目。
void replaceAll(BiFunction<? super K,? super V,? extends V> function)

用对该条目调用给定函数的结果替换每个条目的值,直到处理完所有条目或者该函数抛出异常。
int size()

返回此映射中键值映射的数量。
NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)

返回此键映射范围从0 fromKey到的部分视图 toKey
SortedMap<K,V> subMap(K fromKey, K toKey)

返回此映射部分的视图,其键范围从 fromKey(包含)到toKey独占。
SortedMap<K,V> tailMap(K fromKey)

返回此映射的键大于或等于的部分的视图fromKey
NavigableMap<K,V> tailMap(K fromKey, boolean inclusive)

返回此映射关键字大于(或等于,如果inclusive为真)的部分的视图fromKey
Collection<V> values()

返回Collection此映射中包含的值的视图。
  • WeakHashMap实现类

  WeakHashMap与HashMap的用法基本相似。但与HashMap的区别在于,HashMap的key保留对象的强引用,这意味着只要该HashMap对象不被销毁,该HashMap对象所有key所引用的对象不会被垃圾回收,HashMap也不会自动删除这些key所对应的key-value对象;WeakHashMap的key只保留对实际对象的弱引用,这意味着当垃圾回收了该key所对应的实际对象后,WeakHashMap会自动删除该key对应的key-value对。

  1. public class Test {
  2. public static void main(String[] args){
  3. WeakHashMap<String, String> map = new WeakHashMap<String, String>();
  4. //将WeakHashMap中添加三个key-value对,
  5. //三个key都是匿名字符串对象(没有其他引用)
  6. map.put(new String("语文"), new String("优"));
  7. map.put(new String("数学"), new String("良"));
  8. map.put(new String("英语"), new String("中"));
  9. //将WeakHashMap中添加一个key-value对,
  10. //该key是一个系统缓存的字符串对象。
  11. map.put("java", new String("不及格"));
  12. //输出map对象,将看到4个key-value对{java=不及格, 数学=良, 英语=中, 语文=优}
  13. System.out.println(map);
  14. //通知系统立即进行垃圾回收
  15. System.gc();
  16. System.runFinalization();
  17. //通常情况下,将只看到一个key-value对{java=不及格}
  18. System.out.println(map);
  19. }
  20. }

  从上面运行结果可以看出,当系统进行垃圾回收时,删除了WeakHashMap对象的前三个key-value对。这是因为添加前三个key-value对时,这三个key都是匿名字符串对象,只有WeakHashMap保留了对它们的弱引用。WeakHashMap对象中的第四组key-value对的key是一个字符串的直接量,系统会缓冲这个字符串直接量(即系统保留了对该字符串对象的强引用),所以垃圾回收时不会回收它。

  • IdentityHashMap实现类

  IdentityHashMap实现类的实现机制与HashMap基本相似,但它在处理两个key相等时,比较独特:在IdentityHashMap中,当且仅当两个key严格相等时(key1 = key2)时,IdentityHashMap才认为两个key相等,对于普通HashMap而言,只要key1和key2通过equals比较返回true,且它们的hashCode值相等即可。

  IdentityHashMap提供了与HashMap基本相似的方法,也允许使用null做为key和value。与HashMap类似的是,IdentityHashMap不保证任何key-value对之间的顺序,更不能保证它们的顺序随时间的推移保持不变。

  1. public class Test {
  2. public static void main(String[] args){
  3. IdentityHashMap<String, String> map = new IdentityHashMap<String, String>();
  4. //下面两行代码会向map中添加两条key-value对
  5. map.put(new String("语文"), "99");
  6. map.put(new String("语文"), "100");
  7. //下面两行代码会向map中添加一条key-value对
  8. map.put("java", "89");
  9. map.put("java", "69");
  10. //打印结果为{java=69, 语文=100, 语文=99}
  11. System.out.println(map);
  12. }
  13. }
  • EnumMap实现类

  EnumMap是一个与枚举类一起使用的Map实现,EnumMap中所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显示或隐式指定它对应的枚举类。

  EnumMap不允许使用null作为key值,但容许使用null值做为value。如果试图使用null做为key将抛出NullPointerException异常。如果仅仅只是查询是否包含值为null的key,或者仅仅只是使用删除值为null的key,都不会抛出异常。

  1. enum Season{
  2. SPRING,SUMMER,AUTUMN,WINTER
  3. }
  4. public class Test {
  5. public static void main(String[] args){
  6. EnumMap<Season, String> map = new EnumMap<Season, String>(Season.class);
  7. //打印结果为{}
  8. System.out.println(map);
  9. map.put(Season.SPRING, "春");
  10. map.put(Season.SUMMER, "夏");
  11. map.put(Season.AUTUMN, "秋");
  12. map.put(Season.WINTER, "冬");
  13. //打印结果为{SPRING=春, SUMMER=夏, AUTUMN=秋, WINTER=冬}
  14. System.out.println(map);
  15. }
  16. }

  上面程序中创建了一个EnumMap对象,创建该EnumMap对象时指定它的key只能是Season枚举类的枚举值。如果向该EnumMap中添加四个key-value对后,这四个key-value对将会以Season枚举值的自然顺序排序。


  对于Map的常用实现类而言,HashMap和Hashtable的效率大致相同,因为它们的实现机制几乎完全一样,但HashMap通常比Hashtable要快一点,因为Hashtable额外实现同步操作。

  TreeMap通常比HashMap、Hashtable要慢(尤其在插入、删除key-value对的时候更慢),因为TreeMap需要额外的红黑树操作来维护key之间的次序。但使用TreeMap有一个好处:TreeMap中的key-value对总是处于有序状态,无须专门进行排序操作。

Java集合框架(五)—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap的更多相关文章

  1. Java集合框架之map

    Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...

  2. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

  3. Java基础系列 - JAVA集合ArrayList,Vector,HashMap,HashTable等使用

    package com.test4; import java.util.*; /** * JAVA集合ArrayList,Vector,HashMap,HashTable等使用 */ public c ...

  4. 【JAVA集合框架之Map】

    一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

  5. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  6. java集合框架collection(5)HashMap和TreeMap

    上图转载自:http://www.cnblogs.com/vamei/archive/2013/04/15/3000913.html 一.区别和联系 1.迭代器 迭代器是一种设计模式,它是一个对象,它 ...

  7. [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.

    注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...

  8. java集合框架07——Map架构与源代码分析

    前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...

  9. java集合框架collection(4)HashMap和Hashtable的区别

    HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别.主要的区别有:线程安全性,同步(synchronizatio ...

  10. Java 集合框架之 Map

    Hashtable Hashtable 的实例有两个参数影响其性能:初始容量 和加载因子.容量 是哈希表中桶 的数量,初始容量就是哈希表创建时的容量.注意,哈希表的状态为 open:在发生“哈希冲突” ...

随机推荐

  1. Linux实践篇--linux软件的安装,更新与卸载

    本文出处:http://www.cnblogs.com/lhj588/archive/2012/07/17/2595328.html,感谢作者分享. Linux常见的安装为tar,zip,gz,rpm ...

  2. 重拾Python(2):如何安装第三方库(Windows)

    使用python进行数据分析或者数据处理时,往往需要使用一些库,而使用库之前必须安装它.Anaconda内置了很多常用的第三方库,可以满足绝大部分需求,比如numpy.pandas.matplotli ...

  3. ng机器学习视频笔记(二) ——梯度下降算法解释以及求解θ

    ng机器学习视频笔记(二) --梯度下降算法解释以及求解θ (转载请附上本文链接--linhxx)   一.解释梯度算法 梯度算法公式以及简化的代价函数图,如上图所示. 1)偏导数 由上图可知,在a点 ...

  4. 并发思考-actor和thread那个好点?

    实验课题:测试actor和thread那个好? 实验方法:利用数据库连接池创建连接,交由线程去工作,在回收,看看程序运行状况. 实验步骤: 1.创建数据连接工具类: import java.sql.{ ...

  5. 理解js中的作用域,作用域链以及闭包

    作用域变量作用域的类型:全局变量和局部变量全局作用域对于最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的 <script> var outerVar = " ...

  6. 跨域资源共享 CORS 详解(转)

    add by zhj: 公司在一个web产品上,做前后端分离,前后端提供独立的服务,使用不同的域名,通过http进行交互,在 前端,会涉及到跨域访问的问题,前端使用了CORS,后端同时需要做相应修改, ...

  7. [DeeplearningAI笔记]改善深层神经网络_深度学习的实用层面1.9_归一化normalization

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.9 归一化Normaliation 训练神经网络,其中一个加速训练的方法就是归一化输入(normalize inputs). 假设我们有一个 ...

  8. 基于SpringMVC+Mybatis搭建简单的前后台交互系统

    前面博文有一篇 名为基于tomcat+springMVC搭建基本的前后台交互系统(http://www.cnblogs.com/hunterCecil/p/6924935.html),例文中使用了Io ...

  9. 04_VMware虚拟机网络配置

    占位占位占位占位占位占位占位占位

  10. 使用jquery中height()方法获取各种高度

    $(window).height(); //浏览器当前窗口可视区域高度 $(document).height(); //浏览器当前窗口文档的高度 $(document.body).height();/ ...