如何做网站豆瓣,河南百度建个网站,佛山微网站推广,中国移动官方官网快速失败#xff08;fail-fast#xff09;
设计的目的是为了避免在遍历时对集合进行并发修改#xff0c;从而引发潜在的不可预料的错误。
通过迭代器遍历集合时修改集合#xff1a; 如果你使用Iterator遍历集合#xff0c;然后直接使用集合的修改方法#xff08;如add(…快速失败fail-fast
设计的目的是为了避免在遍历时对集合进行并发修改从而引发潜在的不可预料的错误。
通过迭代器遍历集合时修改集合 如果你使用Iterator遍历集合然后直接使用集合的修改方法如add()或remove()集合的结构会发生变化而迭代器并没有同步感知到这些变化就会抛出ConcurrentModificationException。 ListString list new ArrayList();
list.add(A);
list.add(B);
list.add(C);IteratorString iterator list.iterator();
while (iterator.hasNext()) {String element iterator.next();if (element.equals(B)) {list.remove(element); // 修改了集合结构抛出 ConcurrentModificationException}
}通过增强型 for 循环遍历集合时修改集合 增强型 for 循环实际上是基于迭代器的语法糖因此在遍历过程中如果修改了集合同样会抛出 ConcurrentModificationException。 ListString list new ArrayList();
list.add(A);
list.add(B);
list.add(C);for (String element : list) {if (element.equals(B)) {list.remove(element); // 抛出 ConcurrentModificationException}
}如何避免异常
使用迭代器的remove()方法 如果需要在迭代过程中删除元素可以使用迭代器自带的remove()方法它会安全地修改集合并更新迭代器的状态不会抛出异常。 ListString list new ArrayList();
list.add(A);
list.add(B);
list.add(C);IteratorString iterator list.iterator();
while (iterator.hasNext()) {String element iterator.next();if (element.equals(B)) {iterator.remove(); // 使用迭代器的 remove() 方法安全移除元素}
}避免在遍历时修改集合 如果你必须在遍历时修改集合可以考虑先将要删除的元素收集到一个临时列表中遍历完成后再删除它们。 ListString list new ArrayList();
list.add(A);
list.add(B);
list.add(C);ListString toRemove new ArrayList();
for (String element : list) {if (element.equals(B)) {toRemove.add(element); // 将要删除的元素暂存}
}
list.removeAll(toRemove); // 之后统一删除使用并发集合类 在多线程环境中如果多个线程同时对集合进行操作推荐使用并发集合类如CopyOnWriteArrayList或ConcurrentHashMap它们支持线程安全的修改。 ListString list new CopyOnWriteArrayList();
list.add(A);
list.add(B);
list.add(C);for (String element : list) {if (element.equals(B)) {list.remove(element); // 不会抛出异常因为 CopyOnWriteArrayList 是线程安全的}
}HashMap 和 Hashtable 的区别
HashMap非线程安全允许null键和null值效率较高。Hashtable线程安全不允许null键和null值效率相对较低。 StringBuilder和StringBuffer的区别 synchronized关键字的用法和实现原理 用法synchronized可以用于方法或代码块确保在多线程环境下某些代码块在同一时间只有一个线程可以执行。 synchronized (this) {// 线程安全的代码
}实现原理synchronized会通过获取对象的监视器锁Monitor Lock来实现同步锁住代码块或方法保证临界区内的线程安全。
什么是volatile关键字它有什么作用
volatile关键字是Java中的一个修饰符用于保证多线程环境下共享变量的可见性。当一个变量被声明为volatile时它告诉Java编译器和运行时环境任何对该变量的读写操作都要直接从主内存中进行而不是从线程的本地缓存中读取。
写入如果不使用volatile关键字线程会将修改的值保存到缓存中如果使用了volatile关键字线程会将修改的值刷新到主内存中。保证多线程环境下共享变量的可见性。
读取如果不使用volatile关键字线程会从缓存中读取该变量因为一般线程会将修改的值保存到缓存中。如果使用了volatile关键字线程就会从主内存中读取修改后的变量值。
volatile 保证了变量的可见性即一个线程对该变量的修改能立即被其他线程看到。volatile 防止了指令重排序确保变量的读写顺序在并发环境中是安全的。但volatile 不保证操作的原子性对于涉及多个步骤的操作仍然可能需要同步或者使用更高级的并发工具类。
JVM的内存模型是怎样的堆内存和栈内存的区别
JVM内存模型包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。堆内存用于存储所有的对象堆是线程共享的。栈内存用于存储局部变量、方法调用等栈是线程私有的。
JVM中的垃圾回收机制是怎样的
JVM的垃圾回收器采用“分代收集算法”主要分为年轻代Eden区、S0/S1区和老年代。垃圾回收算法主要包括 标记-清除算法标记活跃对象清除未标记对象。标记-整理算法对老年代使用整理内存空间。复制算法对年轻代使用将存活对象复制到另一区域。
反射
反射Reflection是Java语言中的一种机制允许程序在运行时动态地检查和操作类、接口、方法、属性等信息。通过反射程序可以在运行时获取类的结构信息并能够动态地创建对象、调用方法、访问字段等。反射通常用于框架、库开发和动态代理等场景。
反射的作用
动态获取类的信息可以在运行时获取类的全限定名、构造方法、字段、方法等信息。动态调用方法在运行时通过反射调用对象的方法而不需要在编译时确定具体调用的内容。动态访问字段可以访问对象的私有、受保护或公有字段并且可以对其进行读取或修改。动态创建对象不需要提前知道类的名称可以在运行时根据名称动态地创建类的实例。
反射的使用
Java中的反射机制主要通过java.lang.reflect包来实现。以下是几个常用的反射类和方法
Class?表示一个类的类对象可以通过它获取类的元数据。Field表示类中的字段成员变量。Method表示类中的方法。Constructor?表示类的构造函数。
反射的具体例子
1. 获取类的Class对象
可以通过三种方式获取某个类的Class对象
通过类的类名Class.forName(类的全限定名)通过对象对象.getClass()通过类名.class类名.class // 通过类名获取
Class? clazz1 Class.forName(com.example.MyClass);// 通过对象获取
MyClass obj new MyClass();
Class? clazz2 obj.getClass();// 通过类名.class获取
Class? clazz3 MyClass.class;反射的缺点
性能开销大反射涉及到大量的动态类型检查和方法调用性能相对于直接调用稍差。安全性问题反射允许访问私有字段和方法可能会破坏封装性。编译时检查失效使用反射时很多错误会推迟到运行时才会暴露。
常见的设计模式有哪些 设计模式是为了解决软件开发中常见问题而总结出的可重用解决方案主要分为创建型模式、结构型模式和行为型模式三类。
http请求put post区别 POST用于向服务器发送数据用于创建资源或者向已存在的资源发送数据。POST 请求通常会导致服务器状态的变化或触发某些动作。 语义上是“添加”append数据到资源上。常用于提交表单数据、上传文件、处理非幂等操作即操作可能有不同的结果每次执行结果不同。 PUT用于在服务器上创建或替换资源。PUT 请求是幂等的也就是说重复的 PUT 请求应产生相同的结果。 语义上是“更新”或者“替换”资源。如果资源不存在则创建资源。常用于更新某个已知的资源例如通过 PUT /users/123 更新 ID 为 123 的用户信息。
开启线程的方法 线程的状态
一、开启线程的方法
1. 继承 Thread 类
通过继承 Thread 类并重写其中的 run() 方法来定义线程。
步骤
创建一个继承自 Thread 类的类。重写 run() 方法将线程执行的代码放入其中。创建线程对象并调用 start() 方法启动线程。 class MyThread extends Thread {Overridepublic void run() {// 线程执行的任务System.out.println(Thread is running...);}
}public class TestThread {public static void main(String[] args) {MyThread t1 new MyThread(); // 创建线程对象t1.start(); // 启动线程}
}2. 实现 Runnable 接口
通过实现 Runnable 接口并将其传递给 Thread 类的构造函数。
步骤
创建一个实现了 Runnable 接口的类。实现 run() 方法将线程执行的代码放入其中。将该 Runnable 对象传递给 Thread 构造器并调用 start() 启动线程。 class MyRunnable implements Runnable {Overridepublic void run() {// 线程执行的任务System.out.println(Runnable is running...);}
}public class TestRunnable {public static void main(String[] args) {MyRunnable myRunnable new MyRunnable();Thread thread new Thread(myRunnable); // 创建线程对象thread.start(); // 启动线程}
}3. 使用匿名内部类
你可以通过匿名内部类的方式直接创建线程。 public class TestThread {public static void main(String[] args) {Thread thread new Thread(new Runnable() {Overridepublic void run() {System.out.println(Anonymous Runnable is running...);}});thread.start(); // 启动线程}
}4. 使用 Lambda 表达式
在 Java 8 及以上版本中使用 Lambda 表达式简化 Runnable 接口的实现。 public class TestThread {public static void main(String[] args) {Thread thread new Thread(() - {System.out.println(Lambda Runnable is running...);});thread.start(); // 启动线程}
}二、查看线程的状态
Java 提供了一些方法和枚举来检查线程的状态。可以通过调用 Thread 类的方法来获取线程的当前状态。
1. 线程状态枚举Thread.State
Thread.State 是枚举类型它定义了线程的六种状态
NEW线程对象已经创建但尚未调用 start() 方法。RUNNABLE线程正在 Java 虚拟机中运行。BLOCKED线程被阻塞正在等待监视器锁同步锁。WAITING线程无限期等待另一个线程执行特定操作。TIMED_WAITING线程在等待超时后会被唤醒。TERMINATED线程已完成执行。
2. 获取线程状态的方法
使用 Thread 类中的 getState() 方法来查看线程的状态。
Runnable和Callable的区别 1. Runnable 详细说明
Runnable 接口定义了一个 run() 方法用于封装并发任务。它不返回任何结果也不会抛出任何受检异常。 public class MyRunnable implements Runnable {Overridepublic void run() {System.out.println(Runnable is running);}
}public class Main {public static void main(String[] args) {Thread thread new Thread(new MyRunnable());thread.start(); // 启动线程执行run()方法}
}2. Callable 详细说明
Callable 接口定义了一个 call() 方法可以返回任务的执行结果并且可以抛出异常。通常与 ExecutorService 结合使用。返回的结果可以通过 Future 对象来获取。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class MyCallable implements CallableString {Overridepublic String call() throws Exception {return Callable result;}
}public class Main {public static void main(String[] args) throws InterruptedException, ExecutionException {ExecutorService executor Executors.newSingleThreadExecutor();FutureString future executor.submit(new MyCallable());System.out.println(future.get()); // 获取 Callable 的返回值executor.shutdown();}
}线程池的工作原理
线程池通过管理一组线程来提高应用程序的性能和资源利用率。通过合理的任务队列和线程管理策略线程池可以高效地处理并发任务并在多线程环境中保持系统的稳定性。
1. 线程池的组件
核心线程线程池初始化时创建的线程始终保持在池中。最大线程线程池可以创建的最大线程数量超出这个数量的任务会被放入任务队列。任务队列存放待执行任务的队列可以是不同类型的队列如无界队列、有界队列等。空闲线程存活时间核心线程以外的线程在没有任务时的存活时间超出这个时间会被销毁。
2. 工作流程
a. 线程池的创建
线程池通过 Executors 或 ThreadPoolExecutor 创建设定核心线程数、最大线程数和任务队列类型。
b. 任务提交
使用 submit() 或 execute() 方法将任务提交到线程池。提交任务时线程池会首先检查当前正在运行的线程数量。
c. 线程的处理 如果运行的线程少于核心线程 创建新线程来处理任务并立即执行。 如果运行的线程已达到核心线程数 将任务放入任务队列。如果队列已满且当前线程数小于最大线程数则创建新线程来处理任务。 如果运行的线程已达到最大线程数 根据任务队列的类型进行处理丢弃、抛出异常、执行某种策略等。
d. 任务执行
线程从任务队列中获取任务并执行。执行完毕后线程返回线程池准备接收新的任务。
e. 线程的销毁
如果空闲线程的数量超过核心线程数并且超过了指定的空闲存活时间则会被销毁。当线程池关闭时未完成的任务将根据关闭策略如 shutdown() 或 shutdownNow()进行处理。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {// 创建一个固定大小的线程池ExecutorService threadPool Executors.newFixedThreadPool(3);// 提交任务for (int i 1; i 10; i) {final int taskId i;threadPool.submit(() - {System.out.println(Task taskId is being executed by Thread.currentThread().getName());try {// 模拟任务执行时间Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println(Task taskId is completed by Thread.currentThread().getName());});}// 关闭线程池threadPool.shutdown();}
}List Set Map的区别
List适合需要按顺序访问元素的场景如保存用户列表、待办事项等。Set适合需要确保元素唯一的场景如存储用户的邮箱地址、商品的ID等。Map适合存储键值对关系的场景如存储用户信息用户名和对应的用户对象、产品ID与产品详情的关系等。
B树和红黑树的区别哪个效果更好为什么
索引帮助MySQL高效获取数据的排好序的数据结构如二叉树红黑树Hash表B-Tree
红黑树是一种二叉搜索树当左右子树高度不平衡是会进行调整
B树是一种多路搜索树
非叶子节点不存储数据只存储索引可以放更多的索引前一层存放的是下一层索引的第一个值叶子节点包含所有索引字段叶子节点用指针链接提高区间访问的性能
B树的效果更好因为高度更低查询效率更高。
常见的字符串操作 public class StringExample {public static void main(String[] args) {String str Hello, World! ;// 1. 字符串长度System.out.println(Length: str.length());// 2. 去除空格System.out.println(Trimmed: str.trim() );// 3. 转换为大写System.out.println(Uppercase: str.toUpperCase());// 4. 子字符串System.out.println(Substring: str.substring(7));// 5. 替换字符System.out.println(Replaced: str.replace(World, Java));// 6. 分割字符串String[] parts str.split(, );for (String part : parts) {System.out.println(Part: part);}// 7. 格式化字符串String formatted String.format(Name: %s, Age: %d, John, 30);System.out.println(Formatted: formatted);}
} char和varchar的区别 数据库的sql失效一般有哪些场景
SQL 失效通常指的是在数据库中原本可以使用的 SQL 查询突然变得无法执行或效率降低。以下是一些常见的场景 数据库结构变化 表结构、索引或数据类型的更改可能导致原有查询计划失效。 统计信息过时 数据库优化器依赖统计信息来生成执行计划。如果统计信息未更新可能导致选择不合适的查询计划。 参数变化 使用参数化查询时不同参数值可能导致生成不同的执行计划某些计划可能在某些参数下失效。 索引失效 索引被删除、修改或变得不再适用可能导致查询效率显著下降。 数据分布变化 数据量或数据分布发生变化例如数据倾斜可能导致原有的查询计划不再高效。 锁竞争或阻塞 由于高并发导致锁竞争或阻塞可能导致原本顺利执行的 SQL 变得缓慢或失效。 缓存失效 查询结果缓存失效导致相同的查询需要重新执行而不是从缓存中获取结果。 数据库配置变更 数据库参数配置或硬件资源的变化可能影响查询的执行计划。 代码逻辑修改 应用程序中 SQL 查询的逻辑改变可能导致执行效率下降。
面向对象和面向过程的区别
类的加载机制 加载 (Loading) 从 .class 文件中读取字节码并将其加载到内存中。加载器会根据类的名称和路径查找对应的 .class 文件。 链接 (Linking) 验证 (Verification)检查加载的字节码是否符合 Java 虚拟机规范确保安全性。准备 (Preparation)为类变量分配内存并设置其默认值。解析 (Resolution)将常量池中的符号引用转换为直接引用即确定实际的内存地址。 初始化 (Initialization) 执行类的静态初始化块和静态变量的初始化设置变量的实际值。这是类加载的最后一步。
Java 中的类加载器主要包括以下几种 引导类加载器 (Bootstrap ClassLoader) 负责加载 Java 核心类库如 java.lang.*、java.util.* 等。 扩展类加载器 (Extension ClassLoader) 负责加载 JRE 的扩展库通常在 lib/ext 目录中。 应用类加载器 (Application ClassLoader) 负责加载用户类路径classpath下的类包括用户自定义的类。
3. 类加载的双亲委派机制
在类加载过程中类加载器遵循双亲委派模型即一个类加载器在尝试加载类时会首先将请求委派给它的父类加载器。如果父加载器无法加载该类才会由当前加载器进行加载。这种机制可以防止类的重复加载和冲突。
获取一个class对象的方式?
可以通过三种方式获取某个类的Class对象
通过类的类名Class.forName(类的全限定名)通过对象对象.getClass()通过类名.class类名.class
// 通过类名获取
Class? clazz1 Class.forName(com.example.MyClass);// 通过对象获取
MyClass obj new MyClass();
Class? clazz2 obj.getClass();// 通过类名.class获取
Class? clazz3 MyClass.class;
如何获得类的属性
1. 通过getter方法获取属性
这是最常见的方式通常会在类中为每个属性定义相应的getter方法供外部代码调用。
public class Person {private String name;private int age;// Getter methodspublic String getName() {return name;}public int getAge() {return age;}
}public class Main {public static void main(String[] args) {Person person new Person();person.getName(); // 获取属性 nameperson.getAge(); // 获取属性 age}
}2. 通过反射机制获取属性
Java的反射机制允许我们在运行时获取对象的属性而不需要直接调用getter方法。通过反射可以动态地获取和修改类的属性即使这些属性是私有的。
import java.lang.reflect.Field;public class Person {private String name John;private int age 30;
}public class Main {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {Person person new Person();// 获取属性Field nameField person.getClass().getDeclaredField(name);nameField.setAccessible(true); // 设置访问权限String name (String) nameField.get(person);Field ageField person.getClass().getDeclaredField(age);ageField.setAccessible(true);int age (int) ageField.get(person);System.out.println(Name: name , Age: age);}
}3. 通过java.beans.Introspector获取属性
Java中还提供了Introspector类可以通过内省机制来获取对象的属性信息。它主要用于Java Beans提供了对类的属性、方法的描述。
import java.beans.Introspector;
import java.beans.PropertyDescriptor;public class Person {private String name John;private int age 30;// Getters and Setterspublic String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}
}public class Main {public static void main(String[] args) throws Exception {Person person new Person();for (PropertyDescriptor pd : Introspector.getBeanInfo(Person.class).getPropertyDescriptors()) {if (pd.getReadMethod() ! null !class.equals(pd.getName())) {System.out.println(pd.getName() : pd.getReadMethod().invoke(person));}}}
}
// 使用 StringBuilder
StringBuilder sb new StringBuilder();
sb.append(Hello);
sb.append( );
sb.append(World);
String result sb.toString();// 使用 StringBuffer
StringBuffer sbf new StringBuffer();
sbf.append(Hello);
sbf.append( );
sbf.append(World);
String result2 sbf.toString();springboot的多环境配置文件是怎么区分的
在 Spring Boot 中多环境配置文件通常通过不同的配置文件和 spring.profiles.active 属性来区分。
1. 创建配置文件
在 src/main/resources 目录下你可以创建不同的配置文件例如
application.properties默认配置application-dev.properties开发环境application-test.properties测试环境application-prod.properties生产环境
2. 配置 application.properties
在 application.properties 中可以指定活动的配置文件例如
spring.profiles.activedev3. 运行时指定活动配置
你可以在启动应用程序时通过命令行参数指定活动的配置文件。例如
java -jar your-app.jar --spring.profiles.activeprod4. 使用环境变量
你也可以通过设置环境变量来指定活动的配置文件
export SPRING_PROFILES_ACTIVEdev5. 访问配置属性
在代码中可以使用 Value 注解或 ConfigurationProperties 注解来访问不同环境下的配置属性
Value(${some.property})
private String someProperty;6. 配置优先级
application.properties 是基础配置。环境特定的配置文件如 application-dev.properties会覆盖基础配置。可以根据需要添加其他特定于环境的配置。
TCP和UDP的区别 文章转载自: http://www.morning.jpydf.cn.gov.cn.jpydf.cn http://www.morning.zlhcw.cn.gov.cn.zlhcw.cn http://www.morning.nlywq.cn.gov.cn.nlywq.cn http://www.morning.xqwq.cn.gov.cn.xqwq.cn http://www.morning.china-cj.com.gov.cn.china-cj.com http://www.morning.sgnjg.cn.gov.cn.sgnjg.cn http://www.morning.nqgjn.cn.gov.cn.nqgjn.cn http://www.morning.pwxkn.cn.gov.cn.pwxkn.cn http://www.morning.bchhr.cn.gov.cn.bchhr.cn http://www.morning.tkcct.cn.gov.cn.tkcct.cn http://www.morning.gprzp.cn.gov.cn.gprzp.cn http://www.morning.rwwdp.cn.gov.cn.rwwdp.cn http://www.morning.brwp.cn.gov.cn.brwp.cn http://www.morning.lbgfz.cn.gov.cn.lbgfz.cn http://www.morning.pmbcr.cn.gov.cn.pmbcr.cn http://www.morning.qrzqd.cn.gov.cn.qrzqd.cn http://www.morning.lrmts.cn.gov.cn.lrmts.cn http://www.morning.qyllw.cn.gov.cn.qyllw.cn http://www.morning.lmxrt.cn.gov.cn.lmxrt.cn http://www.morning.bqfpm.cn.gov.cn.bqfpm.cn http://www.morning.kxqpm.cn.gov.cn.kxqpm.cn http://www.morning.cyhlq.cn.gov.cn.cyhlq.cn http://www.morning.kgnnc.cn.gov.cn.kgnnc.cn http://www.morning.xmnlc.cn.gov.cn.xmnlc.cn http://www.morning.cwnqd.cn.gov.cn.cwnqd.cn http://www.morning.gbgdm.cn.gov.cn.gbgdm.cn http://www.morning.qcdtzk.cn.gov.cn.qcdtzk.cn http://www.morning.prfrb.cn.gov.cn.prfrb.cn http://www.morning.mdtfh.cn.gov.cn.mdtfh.cn http://www.morning.webife.com.gov.cn.webife.com http://www.morning.pqwjh.cn.gov.cn.pqwjh.cn http://www.morning.playmi.cn.gov.cn.playmi.cn http://www.morning.xmpbh.cn.gov.cn.xmpbh.cn http://www.morning.lcbgf.cn.gov.cn.lcbgf.cn http://www.morning.wclxm.cn.gov.cn.wclxm.cn http://www.morning.pdxqk.cn.gov.cn.pdxqk.cn http://www.morning.wjhpg.cn.gov.cn.wjhpg.cn http://www.morning.clkyw.cn.gov.cn.clkyw.cn http://www.morning.nlrxh.cn.gov.cn.nlrxh.cn http://www.morning.wrlqr.cn.gov.cn.wrlqr.cn http://www.morning.slmbg.cn.gov.cn.slmbg.cn http://www.morning.jlgjn.cn.gov.cn.jlgjn.cn http://www.morning.txnqh.cn.gov.cn.txnqh.cn http://www.morning.dmthy.cn.gov.cn.dmthy.cn http://www.morning.gqtxz.cn.gov.cn.gqtxz.cn http://www.morning.ztqyj.cn.gov.cn.ztqyj.cn http://www.morning.ndltr.cn.gov.cn.ndltr.cn http://www.morning.jtdrz.cn.gov.cn.jtdrz.cn http://www.morning.gjmbk.cn.gov.cn.gjmbk.cn http://www.morning.wqcz.cn.gov.cn.wqcz.cn http://www.morning.jzfxk.cn.gov.cn.jzfxk.cn http://www.morning.cnxpm.cn.gov.cn.cnxpm.cn http://www.morning.qynnw.cn.gov.cn.qynnw.cn http://www.morning.zdgp.cn.gov.cn.zdgp.cn http://www.morning.ghjln.cn.gov.cn.ghjln.cn http://www.morning.rwhlf.cn.gov.cn.rwhlf.cn http://www.morning.wjtxt.cn.gov.cn.wjtxt.cn http://www.morning.fpkdd.cn.gov.cn.fpkdd.cn http://www.morning.ybnzn.cn.gov.cn.ybnzn.cn http://www.morning.nfmtl.cn.gov.cn.nfmtl.cn http://www.morning.kfmlf.cn.gov.cn.kfmlf.cn http://www.morning.mzhh.cn.gov.cn.mzhh.cn http://www.morning.crhd.cn.gov.cn.crhd.cn http://www.morning.qgxnw.cn.gov.cn.qgxnw.cn http://www.morning.lprfk.cn.gov.cn.lprfk.cn http://www.morning.phlrp.cn.gov.cn.phlrp.cn http://www.morning.hrnrx.cn.gov.cn.hrnrx.cn http://www.morning.zynjt.cn.gov.cn.zynjt.cn http://www.morning.ypklb.cn.gov.cn.ypklb.cn http://www.morning.zmtrk.cn.gov.cn.zmtrk.cn http://www.morning.pmxw.cn.gov.cn.pmxw.cn http://www.morning.tpnxr.cn.gov.cn.tpnxr.cn http://www.morning.sfcfy.cn.gov.cn.sfcfy.cn http://www.morning.gjws.cn.gov.cn.gjws.cn http://www.morning.nzkkh.cn.gov.cn.nzkkh.cn http://www.morning.rnds.cn.gov.cn.rnds.cn http://www.morning.bgxgq.cn.gov.cn.bgxgq.cn http://www.morning.rbnnq.cn.gov.cn.rbnnq.cn http://www.morning.yrhd.cn.gov.cn.yrhd.cn http://www.morning.rbkl.cn.gov.cn.rbkl.cn