一篇文章带你彻底弄懂Java的==符号

1 篇文章 0 订阅
订阅专栏
本文详细介绍了Java中`==`符号在基本类型、包装类以及String对象中的使用和判断逻辑,包括基本类型的数值比较、包装类的对象相等性判断以及String对象在字符串常量池中的行为。重点讨论了自动装箱、自动拆箱、Integer缓存和字符串常量池对`==`判断的影响,强调在比较字符串内容时应使用`equals()`方法。
摘要由CSDN通过智能技术生成

本篇文章6735字,大概阅读时间20分钟。本文中使用到的JDK版本为1.8.0_301

目录

==符号的定义

基本类型中==符号的判断

String类型中==符号的判断


==符号的定义

        在Java中==符号的作用分为两类:

        1:==符号在八种基本类型的作用是比较对应基本类型的数值是否相等

        2:==符号在对象类型的作用是比较两个对象是否相等

        在对象类型中又有两类特殊情况,一种是基本类型中包装类对象,一种是String对象。前者由于存在缓存导致,后缀则是有字符串常量池的存在导致。

基本类型中==符号的判断

        在基本类型中==符号的作用是判断基本类型的数值是否相同

        int i1 = 1;
        int i2 = 2;
        int i3 = 1;
        System.out.println(i1 == i2); //false
        System.out.println(i1 == i3); //true

        char c1 = 'a';
        char c2 = 'b';
        char c3 = 'a';

        System.out.println(c1 == c2); //false
        System.out.println(c1 == c3); //true

        在基本类型的包装类中由于存在缓存以及自动拆箱/装箱,导致==符号的使用存在一定的差异,下面将会解释到。

        首先基本类型和包装类对应关系

基本类型包装类型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

        在看一段代码(建议将代码复制粘贴到别处,下文会经常提到这段代码中的内容)

        Integer i1 = 127; //数值127 自动装箱
        Integer i2 = 127; //数值127 自动装箱
        System.out.println(i1 == i2);  //true

        Integer i3 = 128; //数值128 自动装箱
        Integer i4 = 128; //数值128 自动装箱
        System.out.println(i3 == i4);  //false

        Integer i5 = new Integer(127);
        Integer i6 = new Integer(127);
        System.out.println(i5 == i6);  //false

        Integer i7 = new Integer(128);
        Integer i8 = new Integer(128);
        System.out.println(i7 == i8);  //false

        int i9 = 127;
        System.out.println(i1 == i9); // true i1自动拆箱
        System.out.println(i5 == i9); // true i9自动拆箱

        首先i1==i2(true)和i3==i4(false) 这两种情况,要解释这两种情况,先看看自动拆箱/装箱背后的逻辑。将上面这段代码编译成Class文件,然后通过javap命令进行反编译,查看字节码的执行逻辑 。

        javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区 (字节码指令)、局部变量表、异常表和代码行偏移量映射表、常量池等信息。

          通过执行 javap -c /xx.class 命令,输出下面内容

        在输出内容中,可以看到反汇编后,代码Integer i1 = 127在=号右边的127会调用Integer.valueOf(127)方法,将数值127包装成Integer(127)的Integer对象,同理i2、i3、i4也是相同原理。通过上述内容可以看出,自动装箱就是调用包装类的valueOf()方法将基本类型的值封装成对应的包装类对象。

        现在我们去看一下Integer.valueOf方法具体做了哪些事情

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
}

        在看一下IntegerCache的代码

    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h; //127
            //创建一个Integer类型的cache数组长度为256
            cache = new Integer[(high - low) + 1];
            int j = low;
            //从下标0开始依次存入-128 -127 .... 126 127
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

        在valueOf()方法中首先会判断传入的i在不在-128~127之间,如果在这区间就会调用 IntegerCache.cache,而cache是一个Integer对象的数组,并且是在static代码块中进行初始化,在IntegerCache对象初始化完成后,cache数组已经初始化完毕。所以如果在-128~127之间,直接返回cache中已经创建好的Integer对象,如果不在-128~127之间则会重新new一个Integer对象。

        通过上面的分析就可以得出 i1=127和i2=127在进行自动装箱的时候,通过valueOf方法返回的都是同一个已经在cache中存在的Integer(127)对象,而i3=128和i4=128则是直接通过new的方式创建的两个不同的Integer对象。而==符号在比较两个对象的时候是判断两个对象是否相等,明显i1和i2都是cache缓存中的同一个对象所以==比较结果为true,而i3和i4是两个不同的对象,所以==比较的结果是false。

        注意:通过上面的分析,在包装类比较数值是否相等的时候需要使用equals方法进行,不要使用==进行比较数值是否相等,由于有缓存的存在可能导致结果出现差异

        继续看上面的代码,在 i5、i6、i7、i8都是创建的不同的Integer对象,所以使用==符号的时候比较的结果都是false。

        在i9处定义了一个数值为127的常量,i1==i9和i5==i9比较的时候,我们继续查看反编译              在i1==i9和i5==i9比较的时候 i1和i5会调用intValue()方法,获取Integer对象中存储的常量值

public int intValue() {return value;}

        所以i1==i9和i5==i9比较的是数值大小,在基本类型和包装类型进行比较的时候,包装类型通过调用xxxValue()方法获取对应的常量值,这个就是自动拆箱。 

        总结:

        1:在引用类型是包装类型的时候,而等号右边是基本类型的字面量,类似Integer i = 127的时候,会触发自动装箱,调用对应的valueOf()方法将字面量封装成包装类型。

        2:在基本类型的字面量和包装类对象比较的时候,包装类对象会调用对应xxxValue()方法,获取对象中的字面量值,所以比较的是字面量的值。

        3:基本类型的自动装箱就是调用对应包装类的valueOf()方法,而自动拆箱就是包装类调用xxxValue()方法。

        上面介绍的时候是使用int和int的包装类Integer作为例子,下面将会罗列出八种基本类型全部情况。 

基本类型包装类型缓存(valueOf方法)
byteByte存在缓存 -128~127之间
shortShort存在缓存 -128~127之间
intInteger存在缓存 -128~127之间
longLong存在缓存 -128~127之间
floatFloat没有缓存
doubleDouble没有缓存
charCharacter存在缓存 0~127之间
booleanBoolean存在缓存 true/false

String类型中==符号的判断

        本文所用的JDK版本为1.8.0_301,在不同JDK版本中字符串常量池存在差异,所以接下来代码的运行环境都是1.8.0_301版本。

        在JDK8中字符串常量池的定义为:字符串常量池在堆中存储

        先看下面代码

String s1 = "abc";
String s2 = new String("abc");

        通过javap命令进行反编译

        上图中ldc、astore这些JVM指令的解释可以查看 这里,使用页面搜索来查找

        解读反编译后的内容

        Code 0:ldc指令将"abc"字面量存储到字符串常量池中,也就是String s1 = "abc"。如果常量池中不存在则需要在常量池中创建,如果常量池中有则直接使用。

        Code 2:将s1引用保存到局部变量表中

        Code 3:new一个字符串对象,对应的是String s2 = new String("abc")

        Code 6:将创建的对象s2压入操作数栈中

        Code 7:由于s2中的字符串"abc"已经存在在字符串常量池中,所以不需要再次创建"abc",直接从常量池中获取

        Code 9:初始化s2对象,调用String(str String)的构造方法,将已经存在常量池中的"abc"字符串传入构造方法,完成s2对象的创建

        Code 12:将s2引用保存到局部变量表中

         再将上面一段代码,顺序颠倒

 String s2 = new String("abc");
 String s1 = "abc";

        再通过javap命令进行反编译

        解读反编译后的内容

        Code 0:new一个字符串对象,对应的是String s2 = new String("abc")

        Code 3:将创建的对象s2压入操作数栈中

        Code 4:ldc指令将new String("abc")中的"abc"字面量存储到字符串常量池中,如果常量池中不存在则需要在常量池中创建,如果常量池中有则直接使用。这里"abc"由于在常量池中不存在,则第一次创建。

        Code 6:初始化s2对象,调用String(str String)的构造方法,将已经存在常量池中的"abc"字符串传入构造方法,完成s2对象的创建

        Code 9:将s2引用保存到局部变量表中

        Code 10:创建String s1 = "abc",由于"abc"已经在常量池中存在,则无需再次创建,直接使用常量池中的"abc"。

        Code 12:将创建的对象s1压入操作数栈中 

         通过上面的分析,总结如下:

        1:jdk8中字符串常量池存是在堆中创建一块区域进行存储。

        2:字符串字面值的创建是直接在字符串常量池中进行创建,在创建前会检查常量池中是否已经存在对应的字符串,如果不存在则在常量池中进行创建,存在则直接使用。

        3:如果通过new 来创建字符串对象,首先会判断字面值是否在常量池中已经存在,如果不存在则在常量池中进行创建,存在则直接使用。然后将常量池中的字符串引用传递给在堆中创建的字符串对象,再将堆中创建的字符串对象传递给s2。

        通过上面的分析还可得出一个常见的面试问题String s2 = new String("abc"),s2的创建过程一共创建了几次对象?

        答案是一次或者两次

        一次:类似第一种情况,常量池中已经存在了对应的"abc"字符串,所以只需要在堆中创建new String("abc")对象即可,然后将堆中的对象指向s2。

        两次:类似第二种情况,常量池中不存在,则首先要在常量池中创建一次"abc"字符串对象,然后再在堆中第二次创建new String("abc")对象,并且把常量池中的对象指向堆中的对象,然后堆中的对象再指向s2。

        通过上面的分析,接下来可以研究==符号在字符串中的判断

        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        String s4 = new String("abc");
        System.out.println(s1 == s2); //true
        System.out.println(s1 == s3); //false
        System.out.println(s3 == s4); //false

        s1和s2都是在常量池中创建的,并且在s2创建的时候"abc"字符串已经存在,所以s2得引用指向的是s1,故s1==s2为true,而s3和s4都是在堆上创建的对象,虽然s3和s4中字符串指向的是常量池中的同一个"abc",但是s3和s4是堆上的不同对象所以 s1==s3和s3==s4为false

        下面在分析几种使用+拼接字符串的情况下==符号的判断

        在判断之前先熟悉两个概念

        常量折叠优化:是指Java在编译期做的一个优化,将一些表达式在编译期能计算好的,不用放到运行期间进行计算

        例如  1+1或者 "ab" +"c"这些可以在编译期直接计算出表达式的结果 2和"abc"。

        字面量:指直接写在代码中的数字、字符串或布尔值。例如数值123 123.11或者字符串"abc"直接在代码中定义的值。

        接下来看+号拼接字符串的情况下==符号的判断

        第一种情况:常量折叠优化

        String s1 = "abc";
        String s2 = "a" + "b" + "c";
        System.out.println(s1 == s2); //true

        在这种情况下 s2在编译期间会进行常量折叠优化,直接拼接成"abc"。

        第二种情况:拼接字符串中有一个是变量或是通过new关键字实例化的对象

        String s1 = "abc";
        String s2 = "ab";
        String s3 = s2 + "c";
        String s4 = new String("ab") + "c";
        String s5 = new String("ab") + new String("c");
        System.out.println(s1 == s3); //false
        System.out.println(s1 == s4); //false
        System.out.println(s1 == s5); //false

        这种情况下,由于无法再编译器确定对象的值,只能在运行期间确定,s3、s4、s5都是在堆上创建的不同的字符串对象,所以比较结果都是false。    

         第三种情况:final修饰的字面量实例化的字符串编译器在编译前也可以直接确认它的值。

        String s1 = "abc";
        final String s2 = "ab";
        String s3 = s2 + "c";
        String s4 = s2 + new String("c");
        System.out.println(s1 == s3);  //true
        System.out.println(s1 == s4);  //false

        s2是被final修饰的常量,其值不会发生改变。在s3=s2+"c",可以看成 s3="ab"+"c"。所以在上面的判断中s1==s3为true。 而s4中虽然s2是常量带时候+后面跟着一个变量,所以在堆中创建了s4,故s1==s4为false。

        通过上面的分析,我们可以得出如下结论:

        1:字符串的字面量都是存在在常量池中,并且如果字面量在常量池中已经存在,则不会再次创建。

        2: 由于有常量折叠优化的存在,字符串的字面量在使用+号拼接的时候可以在编译期确定其值

        3:+号拼接字符串中有一个是变量或是通过new关键字实例化的对象,都是会在堆中创建其对象

        4:final修饰的字面量实例化的字符串编译器在编译前也可以直接确认它的值

        还有在字符串需要比较值是否相等的时候,需要使用equals()方法。并且equals方法的左边最好是确定不为空或者字符串的字面值。防止出现NullPointException异常。

        结束语:

        本文从八大基本类型和其包装类,以及String对象分析==字符在Java中的应用判断情况,相信通过本篇文章的阅读,可以使你如同文章标题一样,全面搞定==符号。当然这也是我写这篇文章的目的,感谢您能看到最后。

        方便自己,也方便他人,坚持原创!

        

Java的字符串变量使用“==”运算的规则
weixin_37460579的博客
01-25 828
Java的字符串变量使用“==”运算的规则 在上一篇博文,我们讨论了比较运算符“== ”,即:当两个变量的值相等时(无论是基本类型变量还是引用类型变量),“== ”比较运算的结果会返回true。 下面,我们看一个字符串变量进行“==”运算的简单例子 public class StringTest { public static void main(String[] args) { //定义三个字符...
Java中的==
m0_48844699的博客
08-03 3813
Java中的==符号是一个很令人费解的点,它究竟代表的是什么,下面由我来揭示一下它所包含的奥妙!
==和equals(JAVA基础)
ZangLing的博客
08-27 440
一、==和equals的区别
Java 中 `==` 和 `equals()` 的区别详解
最新发布
YT的博客
09-08 1404
本文将深入探讨== 和 equals() 之间的区别,并通过示例解释如何正确使用它们。
java的equals_(转)Java语法----Java中equals和==的区别
weixin_39777540的博客
02-12 307
一、java当中的数据类型和“==”的含义:基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为...
java中的==
wondering24的博客
03-22 995
java中的==,基础的用法就是,比较两者的内存地址。 但是这么说是不准确的。 如果比较的是数字,那么就是比较值。 比如: public static void main(String[] args) { int a =10; long b =10; float d =10.0f; float e =0.5f; double f =0.5d; double c =10.0d; System.out.println(a==b); Sy
java中的==。
weixin_33713707的博客
10-16 87
看下面代码: public static void main(final String[] args) { Integer a = new Integer(100); Integer b = 100; System.out.println(a == b); } 这段代码的输出是什么?相信很多人都会很容易的猜到:false,因为a、b两个对象的地...
Java中==什么意思
琅枫的博客
03-23 4985
=是赋值 == 是判断 如a=b 就是把b的值赋予给a; ab 就是判断a等于b 用 语句 一般情况都是 在要前面 加if 语句 作为判断 if a==b 执行什么什么
Java中 == 的使用
weixin_53236070的博客
03-19 4920
Java中 == 使用的详解,== 判断的机制
java中(==)的用法
weixin_34315665的博客
10-19 415
转载于:https://www.cnblogs.com/sunyubin/p/9817167.html
java使用正则表达式分割字符串,一招彻底弄懂!
m0_56662269的博客
05-20 1030
前言 前段时间,我向一位在阿里的朋友寻求进大厂的秘诀,他分享给我一份阿里内部资料——JAVA核心进阶手册,仔细翻阅一番才知道里面收纳整理的知识可真是齐全,不得不来感叹一番… 我将JAVA核心进阶手册大致分为以下5篇内容 基础:多线程+网络+数据结构与算法+MySQL+Tomcat 框架:设计模式+Spring+SpringMVC+MyBatis 分布式架构:限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka) 微服务架构:RPC+SpringBoot+
别再报班了,一篇文章你入门Python
量慧实工作室LHStudio的博客
02-21 412
【万字长文】别再报班了,一篇文章你入门Python 最近有许多小伙伴后台联系我,说目前想要学习Python,但是没有一份很好的资料入门。一方面的确现在市面上Python的资料过多,导致新手会不知如何选择,另一个问题很多资料内容也很杂,从1+1到深度学习都包括,纯粹关注Python本身语法的优质教材并不太多。 刚好我最近看到一份不错的英文Python入门资料,我将它做了一些整理和翻译写下了本文。这份资料非常纯粹,只有Python的基础语法,专门针对想要学习Python的小白。 注释 Py..
JVM学习总结(二):深入探究Java内存结构及String详解(彻底搞懂intern的用法)
weixin_42208959的博客
08-07 515
前言 上一篇主要从整体架构上概括了Java的内存结构,只是在宏观上有一个大体的认识,不够深入,接下来这篇文章,将进一步深入探究Java的内存结构模型,作为上一篇的补充。 正文 接下来,结合一段代码来深入探究Java 的内存结构, /** * @author King老师 * VM参数 * -Xms30m * -Xmx30m * -XX:MaxMetaspaceSize=30m * -XX:+UseConcMarkSweepGC * -XX:-UseCompressedOops *
java浮点数存储方式_一文帮你读懂Java浮点数的存储原理
weixin_42356307的博客
02-13 858
前言Java数值分整数和浮点数,前一篇文章已经解析了Java整数的存储原理,本篇将接着解析浮点数在计算机里的存储原理。Java浮点数分单精度类型( float)和双精度类型(double),float 数据占用 32bit,double 数据占用 64bit。Java浮点数标准java中浮点数采用的IEEE754标准,该标准的全称为IEEE二进制浮点数算术标准。这个标准规定的存储格式是这样的:符号...
java实践体会,java实践心得体会范文3篇
weixin_30916653的博客
03-09 1575
在我所学的语言当中,我自认为JAVA是一门比较强大的面向对象的编程语言,不仅仅因为它的跨平台性,更多的是因为它的灵活多变和实用性较强,可以说比较的经典和强悍。所以学好java语言有很大的用处,这次实训,我们更多学到的是不懂就问和自己应该尽自己的全力去尝试,哪怕失败,只要自己尽自己的全力,和身边同学一起探讨而不是抄袭,团结合作,发挥团队意识,最后在自己的努力下,终于运行成功,这种成就感美不可言,心情...
java中 == 号
hanshuijianbing的博客
05-29 248
两侧为基本类型时,比较的是值的大小是否相等。两侧为引用类型时,比较的是地址值是否相同。
Java中==的使用
小景的博客
06-13 1476
Java中采用值传递的方式 而在赋值方面也是如此, 基本数据类型变量、引用类型变量的赋值都是采用值传递的方式。不过,基本数据类型变量的赋值,两个变量相互独立。而由于引用类型的赋值赋的是地址值,所以两个变量实际上指向同一个对象,彼此的操作会互相影响。 使用==判断两个变量是否相等时,比较的是JVM虚拟机栈中局部变量表中存放的值。 对于基本数据类型,局部变量表中存放的就是其表示的值; 对于引用类型的变量,局部变量表中存放的是其所指的对象在JVM堆区中的地址值 所以,==可以判断基本数据类型的变.
java将字符串中的单独一个\符号替换成=
06-10
如果要将字符串中的单独一个`\`符号替换成`=`,可以使用Java中的正则表达式来匹配单独一个`\`符号,然后进行替换。 示例代码如下: ``` String str = "abc\\def\\ghi\\jkl"; String replacedStr = str.replaceAll("(?<!\\\\)\\\\(?!\\\\)", "="); System.out.println(replacedStr); ``` 输出结果为: ``` abc\def\ghi=jkl ``` 解释一下代码: - 第一行定义了一个字符串`str`,其中包含了多个`\`符号。 - 第二行使用`replaceAll()`方法将单独一个`\`符号替换成`=`,并将结果保存到`replacedStr`变量中。 - 在`replaceAll()`方法中,使用正则表达式来匹配单独一个`\`符号,具体解释如下: - `(?<!\\\\)`表示负向先行断言,表示该`\`符号前面不能有`\`符号。 - `\\\\`表示匹配单独一个`\`符号。 - `(?!\\\\)`表示负向后行断言,表示该`\`符号后面不能有`\`符号。 - 将上述三个部分组合起来,就可以匹配单独一个`\`符号了。 - 最后一行使用`System.out.println()`方法输出替换后的字符串`replacedStr`。 需要注意的是,由于正则表达式中也使用了`\`符号,因此需要使用`\\\\`来表示一个`\`符号
写文章

热门文章

  • Java面试题大全~基础题(55题) 13217
  • 一篇文章带你彻底弄懂Java的==符号 5833
  • Scala面试题大全~基础题(35题) 1079
  • Java面试题大全~进阶题(71题) 347

分类专栏

  • 大数据面试 2篇
  • java 1篇
  • scala 1篇
  • 大数据 1篇
  • 读书

最新评论

  • Java面试题大全~基础题(55题)

    天蓝999: 可以的,我看的另一篇,面试时90%以上的题目都在下边这个文章里:https://knife.blog.csdn.net/article/details/121219272

  • 一篇文章带你彻底弄懂Java的==符号

    CSDN-Ada助手: 恭喜你写出了第一篇博客!标题很吸引人,让我想要进一步了解Java中的==符号。接下来,建议你可以尝试写一些实例代码,以帮助读者更好地理解这个符号的使用。同时,也鼓励你继续创作,分享更多关于Java的知识和经验。 推荐【每天值得看】:https://bbs.csdn.net/forums/csdnnews?typeId=21804&utm_source=csdn_ai_ada_blog_reply1 如果您持续创作,完成第三篇博客,并且质量分达到 80 分以上,在评论区就有机会获得红包奖励哦!

最新文章

  • Scala面试题大全~基础题(35题)
  • Java面试题大全~进阶题(71题)
  • Java面试题大全~基础题(55题)
2023年4篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇曹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司兰州网站优化价格实惠长短影响网站优化吗山西网站优化排名株洲网站搜索引擎优化白银市网站seo优化排名新乡新站网站优化公司深圳纺织网站seo优化5000块钱做网站优化如何进行企业网站的优化沧州肃宁网站优化罗湖公司网站优化平台芜湖整站网站优化网站优化吧滁州网站优化多少钱一年网站php的优化面试网站运营的优化三亚网站优化关键词推广昌吉网站seo优化哪家好凌海网站seo优化推广如何用铭美网站优化网站优化中友情链接怎么做黄浦区网站优化费用广州南沙网站优化湖南专业网站优化推广福田中文网站推广优化沧州百度快照网站优化许昌网站优化推广报价单乐昌网站优化seo设计新颖的网站优化茂名网站优化托管香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化