范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Java基础你确定HashMap这么简单?

  Map概述
  Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组用于保存Map里的key,另外一组用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。
  key和value之间存在单向一对一的关系,即通过指定的key,总能找到唯一的、确定的value。从Map中取出数据时,只要给出指定的key,就可以取出对应的value.
  Map的实现类有HashMap、Hashtable、Properties、SortedMap等等。
  HashMapHashMap常用API
  方法
  描述
  put(K key,V value)
  添加键值对
  get(Object key)
  根据键获取值
  keySet()
  获取keySet
  entrySet()
  获取entrySet
  clear()
  清空
  containsKey(Object key)
  判断是否存在key
  remove(Object key)
  根据key删除键值对
  remover(Object key,Object value)
  根据key和value删除键值对
  size()
  获取元素个数
  isEmpty()
  判断map是否为空
  下面,通过示例学习HashMap的方法:package cn.bytecollege;  import java.util.HashMap;  public class HashMapDemo {     public static void main(String[] args){         HashMap map = new HashMap();         //添加键值对         map.put(1,"妲己");         map.put(2,"亚瑟");         map.put(3,"虞姬");         map.put(4,"韩信");         map.put(5,"蔡文姬");         //根据键获取值         System.out.println(map.get(3));         //获取keySet         for (Integer i : map.keySet()){             System.out.println("key: " + i + " value: " + map.get(i));         }         //获取entrySet         System.out.println(map.entrySet());         //获取元素个数         System.out.println(map.size());         //判断是否存在key         System.out.println(map.containsKey(5));         //判断是否存在value         System.out.println(map.containsValue("程咬金"));         //判断map是否为空         System.out.println(map.isEmpty());         //根据key删除键值对         map.remove(2);         //根据key和value删除键值对         map.remove(4,"韩信");         System.out.println(map);         //清空map         map.clear();         System.out.println(map);     } } HashMap存放元素流程
  HashMap元素存放是一个相对是复杂的过程,整个过程涉及到的有哈希表扩容,红黑树和链表的相互转换等过程,在本小节从源码查看整个过程。
  在学习HashMap存放元素之前需要对HashMap中的几个关键成员变量进行了解。//HashMap默认容量16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //HashMap最大容量 static final int MAXIMUM_CAPACITY = 1 << 30; //HashMap负载因子 static final float DEFAULT_LOAD_FACTOR = 0.75f; //链表转换为红黑树的阈值 static final int TREEIFY_THRESHOLD = 8; //红黑树转换为链表的阈值 static final int UNTREEIFY_THRESHOLD = 6; //链表转换为红黑树时Hash表的容量阈值 static final int MIN_TREEIFY_CAPACITY = 64; //保存HashMap的Hash表 transient Node[] table; //HashMap中元素个数 transient int size;
  HashMap添加元素会调用put(K key,V value)方法,从源码可以看出在put()方法内部调用了putVal()方法。public V put(K key, V value) {     //调用putVal方法     return putVal(hash(key), key, value, false, true); }
  继续查看putVal()方法,这个方法即HashMap存放元素的核心流程。final V putVal(int hash, K key, V value, boolean onlyIfAbsent,                    boolean evict) {     Node[] tab; Node p; int n, i;     //判断哈希表是否为空     if ((tab = table) == null || (n = tab.length) == 0)         //扩容         n = (tab = resize()).length;     if ((p = tab[i = (n - 1) & hash]) == null)//判断tab[i]是否有元素         //如果没有元素则直接存放         tab[i] = newNode(hash, key, value, null);     else {          Node e; K k;          //判断和已有节点的key是否相等          if (p.hash == hash &&                  ((k = p.key) == key || (key != null && key.equals(k))))              //如果key相等则替换              e = p;          //如果key不相等,判断哈希表已有的节点是不是红黑树          else if (p instanceof TreeNode)              //如果是红黑树则以树的方式插入元素              e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value);          else {              //如果不是红黑树则说明这里链表,遍历链表              for (int binCount = 0; ; ++binCount) {                  if ((e = p.next) == null) {                      p.next = newNode(hash, key, value, null);                      //如果链表长度大于等于7,则进制红黑树转换相关工作                      if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st                          treeifyBin(tab, hash);                          break;                      }                  	 //如果key相等则在链表中替换                      if (e.hash == hash &&                          ((k = e.key) == key || (key != null && key.equals(k))))                          break;                                       }             }             if (e != null) { // existing mapping for key                 V oldValue = e.value;                 if (!onlyIfAbsent || oldValue == null)                     e.value = value;                 afterNodeAccess(e);                 return oldValue;             }         }         ++modCount;     	//如果元素个数大于临界值则扩容         if (++size > threshold)             resize();         afterNodeInsertion(evict);         return null;     }
  在这个方法内整个过程可以描述如下:判断底层hash表是否为空,如果为空则先扩容如果不为空,根据存放元素的key计算在hash表中的位置判断在计算出位置处是否有元素,如果没有元素则直接放入hash表,并直接跳转到第9步如果计算出位置有元素判断key是否相等,如果相等则直接赋值如果计算出位置有元素并且判断key不相等,判断此处的节点是否是红黑树,如果是红黑树则以树的方式插入如果计算处位置有元素并且判断key不相等,并且此处节点不是红黑树,那么这个节点处的数据结构一定是链表,则遍历链表准备插入。遍历链表如果新增元素和链表中元素key相等则替换,如果新增元素和链表中已有元素key都不相等,则在已有元素末尾链表插入。如果链表长度大于8,判断hash表容量是否大于64,如果大于64则转换成红黑树,并以红黑树的方式插入元素。添加元素后判断元素个数是否大于扩容阈值,如果大于则扩容。
  这9步完整的描述了HashMap添加元素的流程,描述如图:
  HashMap扩容流程
  在上一小节中我们了解了HashMap添加元素的详细流程,在HashMap添加元素的过程中涉及到一个很重要的操作,那就是扩容。因为如果在HashMap内添加元素,当HashMap内部数组无法装载更多元素时,就需要扩大数组长度,以便放入更多元素,由于Java中数组是无法自动扩容的,这就需要创建一个新的数组替代已有的数组,在本小节内将详细了解HashMap的扩容机制。final Node[] resize() {     //获取原有hash表     Node[] oldTab = table;     //获取原容量     int oldCap = (oldTab == null) ? 0 : oldTab.length;     //获取原阈值     int oldThr = threshold;     int newCap, newThr = 0;     //如果原容量大于0     if (oldCap > 0) {         //如果原容量已经大于最大容量则不再扩容         if (oldCap >= MAXIMUM_CAPACITY) {             threshold = Integer.MAX_VALUE;             return oldTab;         }         //如果原容量的2倍小于最大容量,并且原容量小于默认容量10,就将扩容阈值修改为原阈值的2倍         else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&                  oldCap >= DEFAULT_INITIAL_CAPACITY)             newThr = oldThr << 1; // double threshold         }     //如果当前hash表没有数据,则使用初始化的值     else if (oldThr > 0) // initial capacity was placed in threshold         newCap = oldThr;     //如果是第一次添加元素则使用默认容量16,扩容阈值为16*0.75=12     else {               // zero initial threshold signifies using defaults         newCap = DEFAULT_INITIAL_CAPACITY;         newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);     }     if (newThr == 0) {         float ft = (float)newCap * loadFactor;         newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?                   (int)ft : Integer.MAX_VALUE);     }     threshold = newThr;     @SuppressWarnings({"rawtypes","unchecked"})     //创建新的hash表     Node[] newTab = (Node[])new Node[newCap];     table = newTab;     if (oldTab != null) {         //遍历hash表开始扩容         for (int j = 0; j < oldCap; ++j) {             Node e;             //如果原数据不为空,则将原数据复制到新数组             if ((e = oldTab[j]) != null) {                 oldTab[j] = null;                 //如果链表只有一个节点,则直接复制                 if (e.next == null)                     newTab[e.hash & (newCap - 1)] = e;                 //如果元数据是红黑树                 else if (e instanceof TreeNode)                     //进行红黑树相关操作                     ((TreeNode)e).split(this, newTab, j, oldCap);                 else { // preserve order                     //链表复制操作                     Node loHead = null, loTail = null;                     Node hiHead = null, hiTail = null;                     Node next;                     do {                         next = e.next;                         if ((e.hash & oldCap) == 0) {                             if (loTail == null)                                 loHead = e;                             else                                 loTail.next = e;                             loTail = e;                         }                         else {                             if (hiTail == null)                                 hiHead = e;                             else                                 hiTail.next = e;                             hiTail = e;                         }                     } while ((e = next) != null);                     if (loTail != null) {                         loTail.next = null;                         newTab[j] = loHead;                     }                     if (hiTail != null) {                         hiTail.next = null;                         newTab[j + oldCap] = hiHead;                     }                 }             }         }     }     return newTab; }
  纵观整个代码HashMap扩容时会存在以下几种情况:调用无参构造器时,实例化的HashMap底层数组是null,当第一次调用put()方法时进行扩容,初始容量为16。调用有参构造指定了容量和负载因子时,会根据指定的正整数找到不小于指定容量的2的次幂,将这个数赋值给扩容阈值(threshold),当第一次put()方法时,会将阈值赋值给容量,并计算新的阈值=容量x负载因子。如果不是第一次扩容,则容量变为原容量的2倍,阈值也变为原来的2倍。
  Java 7 和Java 8中HashMap的区别
  Java8中对HashMap进行了相关的调整,主要体现在以下几个方面:Java7中HashMap数据结构采用了数组+链表,而Java8中采用了数组+链表+红黑树,当链表长度大于8并且容量大于64时,会将链表转换成红黑树(注意,如果此时如果链表长度已经是8,但是数组长度并没有到64时会先进行扩容)。当红黑树节点个数小于等于6时会退化成链表。Java7中链表使用的是头插法,但是使用头插法在多线程环境下有概率出现环形链表死循环的问题,在Java8中链表采用了尾插法以及使用了红黑树,避免了出现链表死循环的问题。HashMap的遍历方式
  HashMap的遍历在开发中属于必备技能,HashMap的遍历方式有很多种,但是总的来说只有三种:获取keySet()后遍历keySet()获取到key然后通过key获取value获取entrySet()后遍历entrySet(),相比于第一种写法稍显复杂,但是能更好的体现Map中的数据结构使用Lambda表达式遍历,相比前两种是最简洁的方式,但是代码可读性略差在HashMap的遍历中,应该综合考虑性能、效率等因素做出合适的选择。下面通过实例学习HashMap的遍历。package cn.bytecollege  import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set;  /**  * 本例将演示HashMap遍历的方法  * @author MR.W  *  */ public class ForeachHashMap { 	public static void main(String[] args) { 		Map map = new HashMap<>(); 		 		map.put("张三", "计算机科学与技术"); 		map.put("李四", "软件工程"); 		map.put("王五", "网络工程"); 		 		//第一种:获取keySet()并遍历 		Set set = map.keySet(); 		//获取迭代器 		Iterator it = set.iterator(); 		while(it.hasNext()) { 			String key = it.next(); 			String value = map.get(key); 			System.out.println(key+"==================="+value); 		} 		for (; it.hasNext();) { 			String key = it.next(); 			String value = map.get(key); 			System.out.println(key+"==================="+value); 		} 		for (String key : set) { 			String value = map.get(key); 			System.out.println(key+"==================="+value); 		} 		//第二种:获取Entry 		Set> entrySet = map.entrySet(); 		//使用迭代器 		Iterator> entryIt = entrySet.iterator(); 		 		while (entryIt.hasNext()) { 			Map.Entry entry = entryIt.next(); 			String key = entry.getKey(); 			String value = entry.getValue(); 			System.out.println(key+"==================="+value); 		} 		 		for (; entryIt.hasNext();) { 			Map.Entry entry = entryIt.next(); 			String key = entry.getKey(); 			String value = entry.getValue(); 			System.out.println(key+"==================="+value); 		} 		 		for (Entry entry : entrySet) { 			String key = entry.getKey(); 			String value = entry.getValue(); 			System.out.println(key+"==================="+value); 		} 		//第三种:Lambda表达式 		map.forEach((key,value)->System.out.println(key+"==================="+value)); 	} }
  运行结果如下图所示:
  HashMap和Hashtable
  HashMap 和 Hashtable 都是 Map 接口的典型实现类,它们之间的关系完全类似于 ArrayList 和 Vector的关系∶ Hashtable 是一个古老的 Map 实现类,它从 JDK 1.0起就已经出现了,当它出现时,Java还没有提供Map 接口,所以它包含了两个烦琐的方法,即 elements() 类似于 Map接口定义的 values()方法)和 keys() 类似于 Map 接口定义的 keySet()方法。
  除此之外,Hashtable 和 HashMap 存在三点典型区别。Hashtable 是一个线程安全的 Map接口实现,但 HashMap 是线程不安全的实现,所以 HashMap 比Hashtable 的性能高一点;但如果有多个线程访问同一个 Map 对象时,使用 Hashtable 实现类会更好。Hashtable 不允许使用 null 作为 key 和 value,如果试图把 null 值放进 Hashtable 中,将会引发NullPointerException 异常; 但 HashMap 可以使用 null 作为 key 或 value。HashMap数组初始长度为16,扩容后长度是原长度的2倍,Hashtable初始长度为11,扩容后的长度是原长度的2n+1LinkedHashMap
  HashMap也有一个LinkedHashMap子类;LinkedHashMap 也使用双向链表来维护 key-value 对的次序(其实只需要考虑 key 的次序),该链表负责维护 Map 的迭代顺序,迭代顺序与 key-value 对的插入顺序保持一致。
  LinkedHashMap 可以避免对 HashMap、Hashtable 里的 key-value 对进行排序(只要插入 key-value对时保持顺序即可),同时又可避免使用 TreeMap 所增加的成本(TreeMap的内容将会在下一小节学习)。LinkedHashMap 需要维护元素的插入顺序,因此性能略低于 HashMap 的性能;但因为它以链表来维护内部顺序,所以在迭代访问 Map 里的全部元素时将有较好的性能,下面通过示例学习LinkedHashMap。package cn.bytecollege;  import java.util.LinkedHashMap; import java.util.Set; /**  * 本例将演示LinkedHashMap  * @author MR.W  */ public class LinkedHashMapDemo { 	public static void main(String[] args) { 		 		LinkedHashMap map = new LinkedHashMap<>(); 		map.put("语文", 90); 		map.put("数学", 100); 		map.put("英文", 82); 		 		Set set = map.keySet(); 		for (String key : set) { 			System.out.println(key+"================"+map.get(key)); 		} 	} } 使用Properties读写文件
  Properties 类是 Hashtable 类的子类,该对象在处理属性文件时特别方便(Windows 操作平台上的 ini 文件就是一种属性文件)。Properties 类可以把 Map 对象和属性文件关联起来,从而可以把Map 对象中的 key-value 对写入属性文件中,也可以把属性文件中的"属性名=属性值"加载到 Map 对象中。由于属性文件里的属性名、属性值只能是字符串类型,所以 Properties 里的 key、 value 都是字符串类型。该类提供了如下三个方法来修改 Properties 里的 key、value 值。String getProperty(String key)∶获取 Properties 中指定属性名对应的属性值,类似于 Map 的 get(Object key)方法。String getProperty(String key,String defaultValue)∶该方法与前一个方法基本相似。该方法多一个功能,如果 Properties 中不存在指定的 key 时,则该方法指定默认值。Object setProperty(String key, String value)∶设置属性值,类似于Hashtable 的 put() 方法。除此之外,它还提供了两个读写属性文件的方法。void load(InputStream inStream)∶ 从属性文件(以输入流表示)中加载 key-value 对,把加载到的key-value 对追加到 Properties 里(Properties 是 Hashtable 的子类,它不保证 key-value 对之间的次序)。void store(OutputStream out, String comments)∶将 Properties 中的 key-value 对输出到指定的属性文件(以输出流表示)中。上面两个方法中使用了InputStream 类和 OutputStream 类,它们是 Java IO 体系中的两个基类,关于流的内容在后续章节讲解。下面通过示例先演示基本用法。package cn.bytecollege;  import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties;  /**  * 本例将演示Properties类  * @author MR.W  *  */ public class PropertiesDemo { 	public static void main(String[] args) throws FileNotFoundException, IOException { 		//--------------------读取数据--------------------------// 		Properties properties = new Properties(); 		properties.load(new FileInputStream(new File("data.properties"))); 		 		String username = properties.getProperty("username"); 		String password = properties.getProperty("password"); 		 		System.out.println(username); 		System.out.println(password); 		//--------------------写数据--------------------------// 		Properties properties2 = new Properties(); 		properties2.setProperty("token", "123431"); 		properties2.store(new FileOutputStream(new File("data.properties")), "token"); 		 	} }
  上面的示例分别演示了Properties读写配置文件,在JDBC中将会使用配置文件配置数据库连接信息。SortedMap和TreeMap
  Map 接口也派生出一个 SortedMap 子接口,SortedMap 接口也有一个 TreeMap 实现类。TreeMap 就是一个红黑树数据结构,每个 key-value 对即作为红黑树的一个节点。TreeMap 存储 key-value 对(节点)时,需要根据 key 对节点进行排序。TreeMap 可以保证所有的 key-value 对处于有序状态。TreeMap 也有两种排序方式。自然排序∶TreeMap的所有key 必须实现 Comparable 接口,而且所有的 key 应该是同一个类的对象,否则将会抛出 ClassCastException 异常。定制排序∶ 创建 TreeMap 时,传入一个 Comparator 对象,该对象负责对 TreeMap 中的所有key进行排序。采用定制排序时不要求 Map 的 key 实现 Comparable 接口。类似于 TreeSet 中判断两个元素相等的标准,TreeMap 中判断两个 key 相等的标准是∶ 两个 key 通过 compareTo()方法返回 0,TreeMap 即认为这两个 key 是相等的。
  如果使用自定义类作为 TreeMap 的 key,且想让 TreeMap 良好地工作,则重写该类的 equals()方法和 compareTo(方法时应保持一致的返回结果∶ 两个 key 通过 equals()方法比较返回 true 时,它们通过 compareTo()方法比较应该返回 0。如果 equals()方法与 compareTo()方法的返回结果不一致, TreeMap与 Map 接口的规则就会冲突。
  TreeMap 中也提供了一系列根据 key 顺序访问 key-value 对的方法。Map.Entry firstEntry()∶ 返回该 Map 中最小 key 所对应的 key-value 对,如果该Map为空,则返回 null。Object firstKey()∶返回该 Map 中的最小 key值,如果该 Map为空,则返回 null。Map.Entry lastEntry()∶ 返回该 Map 中最大 key 所对应的 key-value 对,如果该 Map为空或不存在这样的 key-value 对,则都返回 null。Object lastKey()∶ 返回该 Map 中的最大 key 值,如果该 Map 为空或不存在这样的 key,则都返回nulI。Map.Entry higherEntry(Object key)∶ 返回该 Map 中位于key 后一位的 key-value 对(即大于指定key 的最小 key 所对应的 key-value 对)。如果该 Map 为空,则返回 null。Object higherKey(Object key)∶返回该 Map 中位于key 后一位的 key 值(即大于指定 key 的最小key 值)。如果该 Map 为空或不存在这样的 key-value 对,则都返回 null。Map.Entry lowerEntry(Object key)∶ 返回该 Map 中位于key 前一位的 key-value 对(即小于指定key 的最大 key 所对应的 key-value 对)。如果该 Map 为空或不存在这样的 key-value 对,则都返回 null。Object lowerKey(Object key)∶返回该Map 中位于key前一位的 key 值(即小于指定 key 的最大key 值)。如果该 Map 为空或不存在这样的 key,则都返回 null。package cn.bytecollege;  import java.util.TreeMap;  public class MapDemo {     public static void main(String[] args) {         TreeMap map = new TreeMap();         map.put(1,"刘能");         map.put(2,"谢广坤");         map.put(3,"赵四");         map.put(4,"王大拿");         map.put(5,"宋晓峰");         //返回该 Map 中最小 key 所对应的 key-value 对,如果该Map为空,则返回 null。         System.out.println(map.firstEntry());         //返回该 Map 中的最小 key值,如果该 Map为空,则返回 null。> Map.Entry lastEntry()∶ 返回该 Map 中最大 key 所对应的 key-value 对,如果该 Map为空或不存在这样的 key-value 对,则都返回 null。         System.out.println(map.firstKey());         //返回该 Map 中的最大 key 值,如果该 Map 为空或不存在这样的 key,则都返回nulI。         System.out.println(map.lastKey());         //返回该 Map 中位于key 后一位的 key 值(即大于指定 key 的最小key 值)。如果该 Map 为空或不存在这样的 key-value 对,则都返回 nul 。         System.out.println(map.higherKey(3));         //返回该 Map 中位于key 后一位的 key-value 对(即大于指定key 的最小 key 所对应的 key-value 对)。如果该 Map 为空,则返回 null。         System.out.println(map.higherEntry(3));         //返回该Map 中位于key前一位的 key 值(即小于指定 key 的最大key 值)。如果该 Map 为空或不存在这样的 key,则都返回 null。         System.out.println(map.lowerKey(2));         //返回该 Map 中位于key 前一位的 key-value 对(即小于指定key 的最大 key 所对应的 key-value 对)。如果该 Map 为空或不存在这样的 key-value 对,则都返回 null。         System.out.println(map.lowerEntry(2));     } }各Map性能分析
  对于 Map 的常用实现类而言,虽然 HashMap 和 Hashtable 的实现机制几乎一样,但由于Hashtable是一个古老的、线程安全的集合,因此 HashMap 通常比 Hashtable 要快。
  TreeMap 通常比 HashMap、Hashtable 要慢(尤其在插入、删除 key-value 对时更慢),因为 TreeMap底层采用红黑树来管理 key-value 对(红黑树的每个节点就是一个 key-value 对)。使用 TreeMap 有一个好处∶ TreeMap 中的 key-value 对总是处于有序状态,无须专门进行排序操作。当 TreeMap 被填充之后,就可以调用 keySet() ,取得由key 组成的 Set,然后使用 toArray()方法生成 key的数组,接下来使用 Arrays 的 binarySearch() 方法在已排序的数组中快速地查询对象。
  对于一般的应用场景,程序应该多考虑使用 HashMap,因为 HashMap 正是为快速查询设计的(HashMap 底层其实也是采用数组来存储 key-value 对)。但如果程序需要一个总是排好序的 Map 时,则可以考虑使用TreeMap。LinkedHashMap 比 HashMap 慢一点,因为它需要维护链表来保持 Map中 key-value 时的添加顺序。

女人真心爱一个人,是藏不住的文墨语清秋有句话说的非常优美我的心,藏不住秘密,更藏不住爱你的喜悦与忧伤。以优美深情的词句,诠释了爱一个人的真心是藏不住的。尤其是女人,当她爱上了一个男人,她全身都会流露出爱的缱绻美女合集。。。。。。悲喜交加弘一法师圆寂之前用颤抖的手写下悲喜交加,这是大师一生的感悟。我等凡夫俗子对此的理解较为肤浅,需在操行上向大师靠拢,花开如莲,心若菩提。今天在老家送别了弟妹,有血有肉的躯体化为一缕青郁达夫青烟文郁达夫寂静的夏夜的空气里闲坐着的我,脑中不知有多少愁思,在这里汹涌。看看这同绿水似的由蓝纱罩里透出来的电灯光,听听窗外从静安寺路上传过来的同倦了似的汽车鸣声,我觉得自家又回到了青梦(爱与哀愁)昨晚做了个极为奇异的梦,梦中的自己还在上小学,敬爱的瑞萍老师在台上讲课,而我则伏在课桌上呼呼大睡。我本来自信满满地认为老师讲的东西自己都已了然于胸,不过到了接下来考试的时候,才发觉好记性不如烂笔头好记性比不上烂笔头这句话从小听到大,学生时代因为学习的需要,是不自觉的在践行。工作以后,能常动笔写点什么记点什么就变得少了,再后来下海自己做生意就更加少了。但事实证明,这句自明朝时弘一法师,你未曾拥有,谈何失去弘一法师,你未曾拥有,谈何失去,本来就是别人的人,只不过是陪你走过一段幸福而难忘的时光罢了,时间到了,也该走了,不要害怕失去,你所失去的本就不属于你,也不要害怕伤害,能伤害你的都是衡水桃城公安12小时速破ampampquot2。25高档白酒被盗案ampampquot!兄弟!我发现一个有高档酒的地方!真的吗?在哪?走!二人趁夜色将数十箱名贵白酒盗走双手抱头!蹲下!短短12小时桃城公安打破了他们的美梦近日,市区两级公安机关紧盯民生案件,协同作战合力中年女人要注意穿裙子记住这3要3不要,更时髦有气质裙子也算是最能展现女性魅力的单品,既能打造出女人味十足的造型,又能根据版型的不同修饰身材,可以说是同时兼具了实用性与时尚感。今天就来为中年女性安利一些穿裙子的小技巧,记住这3要3不迪丽热巴全面复工,穿束腰拍广告真实状态曝光,狗仔再提怀孕流言随着疫情全面放开,娱乐行业迅速复苏,不仅春节档电影赚得盆满钵满,超多电视剧电影也扎堆开机,明星们也变得忙碌了起来。其中因为停工大半年,既不进组,也不参与红毯鲜少公开亮相的迪丽热巴也等你老了,务必远离这3件假时髦真土气的裤子,一秒变大妈俗话都说三分看长相,七分靠打扮,尤其是对于上了年纪的女性来说,在这个年龄阶段,我们没有了年轻时的姣好容颜,就连身材也开始逐渐发福走样,所以就要将重心放在穿着打扮上。一个人的穿搭对于
先睹为快!走进潍坊城区现存最古老的民居群潍坊日报社潍坊融媒讯2月16日,居民们来到松园子街古民居参观。据了解,位于潍城区城关街道潍州社区的松园子街古民居,是城区现存年代最早的古民居群,院落格局完整清晰,建筑保存现状完好,金边暹粒忙接团,西港不需要中国游客?自中国试点恢复赴柬埔寨等20个国家的出境团队旅游和机票酒店业务以来,陆续有从多个城市出发的旅游团奔赴柬埔寨畅游。为了迎接中国游客,柬埔寨政府已陆续出台多条举措。并且柬埔寨政府已批准联合国可持续发展目标示范村项目云南外普拉村开展能力建设活动来源云南日报2023年2月13日,联合国可持续发展目标示范村项目云南外普拉村开展能力建设活动。在能力建设开班仪式上,永仁县外普拉村村委会副主任杨吉强表示,外普拉村将从此次活动得到明二月二!太原南!这里有大型焰火及民俗活动(附入场路线图)抬头览秀二月春,山水晋源启华章。2月16日从晋源区获悉,该区举办的唐风晋韵山水晋源二月二民俗文化系列活动将于2月21日在晋源区政府广场盛大启幕,届时,晋阳湖公园晋阳里太原古县城稻田旅行大片在家拍,很精彩!旅行大片在家拍,很精彩!足不出户的自然摄影旅行摄影师ErinSullivan用食物和家中的其他物品创作系列出色的微型户外摄影在疫情隔离的这些时间里,无所事事,漫长而安静,如何才能保情人节如何一击即孕?4种方法助好孕!情人节是个好日子,在这一天所有的女人都在期待自己老公或男朋友能给自己送什么礼物,而这一天也是同房率最高的一天,但对于那些想要备孕的夫妻来说,想要在这一天一击即孕,下面四种方法一定要提高生育力,这是我听说过最简单的方法!维生素D,我们称它为阳光维生素。对于它很多人都不陌生,但大多数人只知道它在骨骼健康中起着至关重要的作用,却不知道它在生殖领域也有着非常重要的作用。它与男性生殖能力女性生殖健康甚至孕未来7年11个首轮今夏7000万空间,召回一人火箭重新争冠有望!自从哈登出走以来,火箭便进入漫漫重建期,在这两年的时间里,火箭队也累积了杰伦格林史密斯申京小波特伊森小马丁等一众青年才俊,而且火箭队这些年轻球员目前都展现出来了不错的潜力,并且还有数字人民币在河北省全域试点记者日前从人民银行石家庄中心支行获悉,数字人民币在河北省的试点范围已由雄安新区和张家口市扩展为全省全域,河北省成为全国第一批扩大试点范围的省份。记者下载了数字人民币App,通过数字人民币1月份暴增7。38万亿!超发货币拉基建,不如给老百姓发钱人民币创纪录放水!仅仅1月份新增M2余额7。38万亿!!!不明白?想想2008年的8万亿救市,以及之后的一系列变化,你就懂了!1月份广义货币猛增其实政府的出发点是好的。三年疫情加上判了!勾结商人套取2000万贷款炒股这家银行两位高管栽了照理来说,作为银行高层管理人员,手中掌握着信贷投放的大权,本应严格按照章程规定对外发放贷款,控制风险。可谁能想到,辽宁一家地方性银行的两名高管,不但没有恪尽职守,反而监守自盗,利用