String字符串是我们日常工作中常用的一个类,在面试中也是高频考点,这里Hydra精心总结了一波常见但也有点烧脑的String面试题,一共5道题,难度从简到难,来一起来看看你能做对几道吧。
本文基于jdk8版本中的String进行讨论,文章例子中的代码运行结果基于Java 1.8.0_261-b12
第1题,奇怪的 nullnull
下面这段代码最终会打印什么?
public class Test1 { private static String s1; private static String s2; public static void main(String[] args) { String s= s1+s2; System.out.println(s); }}
揭晓答案,看一下运行结果,打印了nullnull
:
在分析这个结果之前,先扯点别的,说一下为空null
的字符串的打印原理。查看一下PrintStream
类的源码,print
方法在打印null
前进行了处理:
public void print(String s) { if (s == null) { s = "null"; } write(s);}
因此,一个为null
的字符串就可以被打印在我们的控制台上了。
再回头看上面这道题,s1
和s2
没有经过初始化所以都是空对象null
,需要注意这里不是字符串的"null"
,打印结果的产生我们可以看一下字节码文件:
编译器会对String
字符串相加的操作进行优化,会把这一过程转化为StringBuilder
的append
方法。那么,让我们再看看append
方法的源码:
public AbstractStringBuilder append(String str) { if (str == null) return appendNull();//...}
如果append
方法的参数字符串为null
,那么这里会调用其父类AbstractStringBuilder
的appendNull
方法:
private AbstractStringBuilder appendNull() { int c = count; ensureCapacityInternal(c + 4); final char[] value = this.value; value[c++] = "n"; value[c++] = "u"; value[c++] = "l"; value[c++] = "l"; count = c; return this;}
这里的value
就是底层用来存储字符的char
类型数组,到这里我们就可以明白了,其实StringBuilder
也对null
的字符串进行了特殊处理,在append
的过程中如果碰到是null
的字符串,那么就会以"null"
的形式被添加进字符数组,这也就导致了两个为空null
的字符串相加后会打印为"nullnull"
。
第2题,改变String的值
如何改变一个String字符串的值,这道题可能看上去有点太简单了,像下面这样直接赋值不就可以了吗?
String s="Hydra";s="Trunks";
恭喜你,成功掉进了坑里!在回答这道题之前,我们需要知道String是不可变的,打开String的源码在开头就可以看到:
private final char value[];
可以看到,String的本质其实是一个char
类型的数组,然后我们再看两个关键字。先看final
,我们知道final
在修饰引用数据类型时,就像这里的数组时,能够保证指向该数组地址的引用不能修改,但是数组本身内的值可以被修改。
是不是有点晕,没关系,我们看一个例子:
final char[] one={"a","b","c"};char[] two={"d","e","f"};one=two;
如果你这样写,那么编译器是会报错提示Cannot assign a value to final variable "one"
,说明被final
修饰的数组的引用地址是不可改变的。但是下面这段代码却能够正常的运行:
final char[] one={"a","b","c"};one[1]="z";
也就是说,即使被final
修饰,但是我直接操作数组里的元素还是可以的,所以这里还加了另一个关键字private
,防止从外部进行修改。此外,String类本身也被添加了final
关键字修饰,防止被继承后对属性进行修改。
到这里,我们就可以理解为什么String是不可变的了,那么在上面的代码进行二次赋值的过程中,发生了什么呢?答案很简单,前面的变量s
只是一个String对象的引用,这里的重新赋值时将变量s
指向了新的对象。
上面白话了一大顿,其实是我们可以通过比较hashCode
的方式来看一下引用指向的对象是否发生了改变,修改一下上面的代码,打印字符串的hashCode
:
public static void main(String[] args) { String s="Hydra"; System.out.println(s+": "+s.hashCode()); s="Trunks"; System.out.println(s+": "+s.hashCode());}
查看结果,发生了改变,证明指向的对象发生了改变:
那么,回到上面的问题,如果我想要改变一个String的值,而又不想把它重新指向其他对象的话,应该怎么办呢?答案是利用反射修改char
数组的值:
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { String s="Hydra"; System.out.println(s+": "+s.hashCode()); Field field = String.class.getDeclaredField("value"); field.setAccessible(true); field.set(s,new char[]{"T","r","u","n","k","s"}); System.out.println(s+": "+s.hashCode());}
再对比一下hashCode
,修改后和之前一样,对象没有发生任何变化:
最后,再啰嗦说一点题外话,这里看的是jdk8
中String的源码,到这为止还是使用的char
类型数组来存储字符,但是在jdk9
中这个char
数组已经被替换成了byte
数组,能够使String对象占用的内存减少。
第3题,创建了几个对象?
相信不少小伙伴在面试中都遇到过这道经典面试题,下面这段代码中到底创建了几个对象?
String s = new String("Hydra");
其实真正想要回答好这个问题,要铺垫的知识点还真是不少。首先,我们需要了解3个关于常量池的概念,下面还是基于jdk8
版本进行说明:
class文件常量池:在class文件中保存了一份常量池(Constant Pool
),主要存储编译时确定的数据,包括代码中的字面量(literal
)和符号引用
运行时常量池:位于方法区中,全局共享,class文件常量池中的内容会在类加载后存放到方法区的运行时常量池中。除此之外,在运行期间可以将新的变量放入运行时常量池中,相对class文件常量池而言运行时常量池更具备动态性
字符串常量池:位于堆中,全局共享,这里可以先粗略的认为它存储的是String对象的直接引用,而不是直接存放的对象,具体的实例对象是在堆中存放
可以用一张图来描述它们各自所处的位置:
接下来,我们来细说一下字符串常量池的结构,其实在Hotspot JVM中,字符串常量池StringTable
的本质是一张HashTable
,那么当我们说将一个字符串放入字符串常量池的时候,实际上放进去的是什么呢?
以字面量的方式创建String对象为例,字符串常量池以及堆栈的结构如下图所示(忽略了jvm中的各种OopDesc
实例):
实际上字符串常量池HashTable
采用的是数组加链表的结构,链表中的节点是一个个的HashTableEntry
,而HashTableEntry
中的value
则存储了堆上String对象的引用。
那么,下一个问题来了,这个字符串对象的引用是什么时候被放到字符串常量池中的?具体可为两种情况:
使用字面量声明String对象时,也就是被双引号包围的字符串,在堆上创建对象,并驻留到字符串常量池中(注意这个用词)
调用intern()
方法,当字符串常量池没有相等的字符串时,会保存该字符串的引用
注意!我们在上面用到了一个词驻留,这里对它进行一下规范。当我们说驻留一个字符串到字符串常量池时,指的是创建HashTableEntry
,再使它的value
指向堆上的String实例,并把HashTableEntry
放入字符串常量池,而不是直接把String对象放入字符串常量池中。简单来说,可以理解为将String对象的引用保存在字符串常量池中。
我们把intern()
方法放在后面细说,先主要看第一种情况,这里直接整理引用R大的结论:
在类加载阶段,JVM会在堆中创建对应这些class文件常量池中的字符串对象实例,并在字符串常量池中驻留其引用。
这一过程具体是在resolve阶段(个人理解就是resolution解析阶段)执行,但是并不是立即就创建对象并驻留了引用,因为在JVM规范里指明了resolve阶段可以是lazy的。CONSTANT_String会在第一次引用该项的ldc指令被第一次执行到的时候才会resolve。
就HotSpot VM的实现来说,加载类时字符串字面量会进入到运行时常量池,不会进入全局的字符串常量池,即在StringTable中并没有相应的引用,在堆中也没有对应的对象产生。
这里大家可以暂时先记住这个结论,在后面还会用到。
在弄清楚上面几个概念后,我们再回过头来,先看看用字面量声明String的方式,代码如下:
public static void main(String[] args) { String s = "Hydra";}
反编译生成的字节码文件:
public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=1, locals=2, args_size=1 0: ldc #2 // String Hydra 2: astore_1 3: return
解释一下上面的字节码指令:
0: ldc
,查找后面索引为#2
对应的项,#2
表示常量在常量池中的位置。在这个过程中,会触发前面提到的lazy resolve,在resolve过程如果发现StringTable
已经有了内容匹配的String引用,则直接返回这个引用,反之如果StringTable
里没有内容匹配的String对象的引用,则会在堆里创建一个对应内容的String对象,然后在StringTable
驻留这个对象引用,并返回这个引用,之后再压入操作数栈中
2: astore_1
,弹出栈顶元素,并将栈顶引用类型值保存到局部变量1中,也就是保存到变量s
中
3: return
,执行void
函数返回
可以看到,在这种模式下,只有堆中创建了一个"Hydra"
对象,在字符串常量池中驻留了它的引用。并且,如果再给字符串s2
、s3
也用字面量的形式赋值为"Hydra"
,它们用的都是堆中的唯一这一个对象。
好了,再看一下以构造方法的形式创建字符串的方式:
public static void main(String[] args) { String s = new String("Hydra");}
同样反编译这段代码的字节码文件:
public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=2, args_size=1 0: new #2 // class java/lang/String 3: dup 4: ldc #3 // String Hydra 6: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V 9: astore_1 10: return
看一下和之前不同的字节码指令部分:
0: new
,在堆上创建一个String对象,并将它的引用压入操作数栈,注意这时的对象还只是一个空壳,并没有调用类的构造方法进行初始化
3: dup
,复制栈顶元素,也就是复制了上面的对象引用,并将复制后的对象引用压入栈顶。这里之所以要进行复制,是因为之后要执行的构造方法会从操作数栈弹出需要的参数和这个对象引用本身(这个引用起到的作用就是构造方法中的this
指针),如果不进行复制,在弹出后会无法得到初始化后的对象引用
4: ldc
,在堆上创建字符串对象,驻留到字符串常量池,并将字符串的引用压入操作数栈
6: invokespecial
,执行String的构造方法,这一步执行完成后得到一个完整对象
到这里,我们可以看到一共创建了两个String对象,并且两个都是在堆上创建的,且字面量方式创建的String对象的引用被驻留到了字符串常量池中。而栈里的s
只是一个变量,并不是实际意义上的对象,我们不把它包括在内。
其实想要验证这个结论也很简单,可以使用idea中强大的debug功能来直观的对比一下对象数量的变化,先看字面量创建String方式:
这个对象数量的计数器是在debug时,点击下方右侧Memory
的Load classes
弹出的。对比语句执行前后可以看到,只创建了一个String对象,以及一个char数组对象,也就是String对象中的value
。
再看看构造方法创建String的方式:
可以看到,创建了两个String对象,一个char数组对象,也说明了两个String中的value
指向了同一个char数组对象,符合我们上面从字节码指令角度解释的结果。
最后再看一下下面的这种情况,当字符串常量池已经驻留过某个字符串引用,再使用构造方法创建String时,创建了几个对象?
public static void main(String[] args) {String s = "Hydra";String s2 = new String("Hydra");}
答案是只创建一个对象,对于这种重复字面量的字符串,看一下反编译后的字节码指令:
Code: stack=3, locals=3, args_size=1 0: ldc #2 // String Hydra 2: astore_1 3: new #3 // class java/lang/String 6: dup 7: ldc #2 // String Hydra 9: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V 12: astore_2 13: return
可以看到两次执行ldc
指令时后面索引相同,而ldc
判断是否需要创建新的String实例的依据是根据在第一次执行这条指令时,StringTable
是否已经保存了一个对应内容的String实例的引用。所以在第一次执行ldc
时会创建String实例,而在第二次ldc
就会直接返回而不需要再创建实例了。
第4题,烧脑的 intern
上面我们在研究字符串对象的引用如何驻留到字符串常量池中时,还留下了调用intern
方法的方式,下面我们来具体分析。
从字面上理解intern
这个单词,作为动词时它有禁闭、关押的意思,通过前面的介绍,与其说是将字符串关押到字符串常量池StringTable
中,可能将它理解为缓存它的引用会更加贴切。
String的intern()
是一个本地方法,可以强制将String驻留进入字符串常量池,可以分为两种情况:
如果字符串常量池中已经驻留了一个等于此String对象内容的字符串引用,则返回此字符串在常量池中的引用
否则,在常量池中创建一个引用指向这个String对象,然后返回常量池中的这个引用
好了,我们下面看一下这段代码,它的运行结果应该是什么?
public static void main(String[] args) { String s1 = new String("Hydra"); String s2 = s1.intern(); System.out.println(s1 == s2); System.out.println(s1 == "Hydra"); System.out.println(s2 == "Hydra");}
输出打印:
falsefalsetrue
用一张图来描述它们的关系,就很容易明白了:
其实有了第三题的基础,了解这个结构已经很简单了:
在创建s1
的时候,其实堆里已经创建了两个字符串对象StringObject1
和StringObject2
,并且在字符串常量池中驻留了StringObject2
当执行s1.intern()
方法时,字符串常量池中已经存在内容等于"Hydra"
的字符串StringObject2
,直接返回这个引用并赋值给s2
s1
和s2
指向的是两个不同的String对象,因此返回 fasle
s2
指向的就是驻留在字符串常量池的StringObject2
,因此s2=="Hydra"
为 true,而s1
指向的不是常量池中的对象引用所以返回false
上面是常量池中已存在内容相等的字符串驻留的情况,下面再看看常量池中不存在的情况,看下面的例子:
public static void main(String[] args) { String s1 = new String("Hy") + new String("dra"); s1.intern(); String s2 = "Hydra"; System.out.println(s1 == s2);}
执行结果:
true
简单分析一下这个过程,第一步会在堆上创建"Hy"
和"dra"
的字符串对象,并驻留到字符串常量池中。
接下来,完成字符串的拼接操作,前面我们说过,实际上jvm会把拼接优化成StringBuilder
的append
方法,并最终调用toString
方法返回一个String对象。在完成字符串的拼接后,字符串常量池中并没有驻留一个内容等于"Hydra"
的字符串。
所以,执行s1.intern()
时,会在字符串常量池创建一个引用,指向前面StringBuilder
创建的那个字符串,也就是变量s1
所指向的字符串对象。在《深入理解Java虚拟机》这本书中,作者对这进行了解释,因为从jdk7开始,字符串常量池就已经移到了堆中,那么这里就只需要在字符串常量池中记录一下首次出现的实例引用即可。
最后,当执行String s2 = "Hydra"
时,发现字符串常量池中已经驻留这个字符串,直接返回对象的引用,因此s1
和s2
指向的是相同的对象。
第5题,还是创建了几个对象?
解决了前面数String对象个数的问题,那么我们接着加点难度,看看下面这段代码,创建了几个对象?
String s="a"+"b"+"c";
先揭晓答案,只创建了一个对象! 可以直观的对比一下源代码和反编译后的字节码文件:
如果使用前面提到过的debug小技巧,也可以直观的看到语句执行完后,只增加了一个String对象,以及一个char数组对象。并且这个字符串就是驻留在字符串常量池中的那一个,如果后面再使用字面量"abc"
的方式声明一个字符串,指向的仍是这一个,堆中String对象的数量不会发生变化。
至于为什么源代码中字符串拼接的操作,在编译完成后会消失,直接呈现为一个拼接后的完整字符串,是因为在编译期间,应用了编译器优化中一种被称为常量折叠(Constant Folding)的技术。
常量折叠会将编译期常量的加减乘除的运算过程在编译过程中折叠。编译器通过语法分析,会将常量表达式计算求值,并用求出的值来替换表达式,而不必等到运行期间再进行运算处理,从而在运行期间节省处理器资源。
而上边提到的编译期常量的特点就是它的值在编译期就可以确定,并且需要完整满足下面的要求,才可能是一个编译期常量:
被声明为final
基本类型或者字符串类型
声明时就已经初始化
使用常量表达式进行初始化
下面我们通过几段代码加深对它的理解:
public static void main(String[] args) { final String h1 = "hello"; String h2 = "hello"; String s1 = h1 + "Hydra"; String s2 = h2 + "Hydra"; System.out.println((s1 == "helloHydra")); System.out.println((s2 == "helloHydra"));}
执行结果:
truefalse
代码中字符串h1
和h2
都使用常量赋值,区别在于是否使用了final
进行修饰,对比编译后的代码,s1
进行了折叠而s2
没有,可以印证上面的理论,final
修饰的字符串变量才有可能是编译期常量。
再看一段代码,执行下面的程序,结果会返回什么呢?
public static void main(String[] args) { String h ="hello"; final String h2 = h; String s = h2 + "Hydra"; System.out.println(s=="helloHydra");}
答案是false
,因为虽然这里字符串h2
被final
修饰,但是初始化时没有使用常量表达式,因此它也不是编译期常量。那么,有的小伙伴就要问了,到底什么才是常量表达式呢?
在Oracle
官网的文档中,列举了很多种情况,下面对常见的情况进行列举(除了下面这些之外官方文档上还列举了不少情况,如果有兴趣的话,可以自己查看):
基本类型和String类型的字面量
基本类型和String类型的强制类型转换
使用+
或-
或!
等一元运算符(不包括++
和--
)进行计算
使用加减运算符+
、-
,乘除运算符*
、 /
、%
进行计算
使用移位运算符 >>
、 <<
、 >>>
进行位移操作
……
至于我们从文章一开始就提到的字面量(literals),是用于表达源代码中一个固定值的表示法,在Java中创建一个对象时需要使用new
关键字,但是给一个基本类型变量赋值时不需要使用new
关键字,这种方式就可以被称为字面量。Java中字面量主要包括了以下类型的字面量:
//整数型字面量:long l=1L;int i=1;//浮点类型字面量:float f=11.1f;double d=11.1;//字符和字符串类型字面量:char c="h";String s="Hydra";//布尔类型字面量:boolean b=true;
再说点题外话,和编译期常量相对的,另一种类型的常量是运行时常量,看一下下面这段代码:
final String s1="hello "+"Hydra";final String s2=UUID.randomUUID().toString()+"Hydra";
编译器能够在编译期就得到s1
的值是hello Hydra
,不需要等到程序的运行期间,因此s1
属于编译期常量。而对s2
来说,虽然也被声明为final
类型,并且在声明时就已经初始化,但使用的不是常量表达式,因此不属于编译期常量,这一类型的常量被称为运行时常量。
再看一下编译后的字节码文件中的常量池区域:
可以看到常量池中只有一个String类型的常量hello Hydra
,而s2
对应的字符串常量则不在此区域。对编译器来说,运行时常量在编译期间无法进行折叠,编译器只会对尝试修改它的操作进行报错处理。
总结
最后再强调一下,本文是基于jdk8
进行测试,不同版本的jdk
可能会有很大差异。例如jdk6
之前,字符串常量池存储的是String对象实例,而在jdk7
以后字符串常量池就改为存储引用,做了非常大的改变。
至于最后一题,其实Hydra在以前单独拎出来写过一篇文章,这次总结面试题把它归纳在了里面,省略了一些不重要的部分,大家如果觉得不够详细可以移步看看这篇:String s="a"+"b"+"c",到底创建了几个对象?
那么,这次的分享就写到这里,我是Hydra,我们下篇再见~
参考资料:
《深入理解Java虚拟机(第三版)》
https://www.zhihu.com/question/55994121
https://www.iteye.com/blog/rednaxelafx-774673#
作者:码农参上
来源:https://www.cnblogs.com/trunks2008/p/15907320.html
标签: String
凡注有"三板富 | 专注于新三板的第一垂直服务平台"或电头为"三板富 | 专注于新三板的第一垂直服务平台"的稿件,均为三板富 | 专注于新三板的第一垂直服务平台独家版权所有,未经许可不得转载或镜像;授权转载必须注明来源为"三板富 | 专注于新三板的第一垂直服务平台",并保留"三板富 | 专注于新三板的第一垂直服务平台"的电头。
- 脂肪粒如何消除视频(脂肪粒如何消除)
- 百达智能拟将持有宁波百秦14%的140万股权转让给宁波源盛 交易价格不超过140万
- 信邦智能:已与广汽丰田、东风日产、比亚迪等客户在新能源行业开展合作-环球关注
- 上海凯宝:公司子公司顺捷医药拥有《医疗器械经营许可证》资质证书 可开拓医疗器械相关领域的业务-焦点观察
- 翰宇药业醋酸加尼瑞克原料药在美获批
- 东方雨虹(002271)龙虎榜数据(11-11)-全球视点
- 博世科:与华友钴业方面签署新能源电池材料回收利用合作协议-世界热文
- 丢掉苹果订单后 歌尔还将失去面包房-每日视讯
- 菲鹏生物携手华润医疗器械 共同打造IVD开放平台生态
- 格林斯达控股股东戴恩平配偶沈娇拟以9.5万的价格向安徽格林斯达环保设备有限公司转让别克牌汽车-关注
- 罗 牛 山:截止2022年9月末 公司生猪存栏数 45.75万头 其中种猪4.20万头-全球要闻
- 美股盘前要点 | 美股盘前走高 美元指数进一步走低 美国金融条件指数单日跌超50基点-当前简讯
- 工信部等部门:支持培育一批智能光伏示范企业-全球百事通
- “第二支箭”支持民营房企发债:美的置业、碧桂园等房企正沟通对接发债注册意向-今日快讯
- 方天股份拟增加与江苏纳邦数字技术有限公司的关联交易额 交易总金额不超过1300万-天天看点
- 湖北能源:拟54亿元投建江陵电厂二期扩建项目及新能源配套项目-当前要闻
- 电子税务局怎样导出财务报表(厦门市电子税务局财务报表在哪里导出)
- 说说心里话!-天天即时看
- 中青宝:拟购买广州宝云100%股权 14日起复牌-环球动态
- 润贝航科与南方航空签署合作项目,前三季度研发投入同比增30%
- 华联医疗拟向银行申请4500万承兑汇票 全资控股子公司提供连带责任担保-全球热推荐
- 雅化集团:拟向DMCC公司采购锂辉石矿产品-每日速看
- 当代置业(01107.HK):重组生效日期预期为11月18日或之前-每日观点
- 速腾聚创公布新一轮战略融资 多个产业投资方齐聚
- 英记茶庄集团(08241)发布中期业绩 净亏损366.1万港元 同比减少23.54%-天天微头条
- 顺鑫农业:拟对5款牛栏山陈酿产品提价-天天快资讯
- 云天化新能源材料项目加速落地 2023年起磷酸铁锂产能将逐步释放-天天信息
- 百达智能拟购买袁迪欢所持有的金百达10%的100万股权 交易完成后公司持有金百达60%股权-世界观天下
- 中科云网(002306.SZ):正与江苏省包括徐州市在内的多地市政府部门洽谈项目执行相关事宜-天天头条
- 京唐城际铁路开始试运行 北京通州至河北唐山最快39分钟
- 花架子什么意思简解(花架子什么意思)
- 北交所将于11月12日开展新增北交所证券类别通关测试-世界焦点
- 大禹节水:联合体收到37亿元江西省梅江灌区项目成交通知书-时快讯
- 南都电源:子公司拟6000万元向关联方购买锂离子电池绿色高效循环利用项目机器设备及无形资产-世界通讯
- 中国奥园10月销售额约9亿元 尚未披露去年年报及今年中报
- 北交所推出融资融券制度
- 十厘米参照物示意图(十厘米)
- 住房公积金上调意味着什么?有哪些好处?-热推荐
- 移为通信(300590.SZ):11.1825万股限制性股票将归属、上市流通-天天精选
- 百胜中国恢复开店步伐 近8个交易日股价涨幅超过20%
- 砍单风波中的歌尔股份-每日视讯
- 公告精选:顺鑫农业拟对5款牛栏山陈酿进行提价;三七互娱拟3亿元-6亿元回购股份-天天热点评
- 中指快评:杭州取消“认房又认贷”,二套首付最低四成-实时
- 中指快评:《天津津城城市更新规划指引(2021—2035年)》公开征求意见-当前热点
- 探寻数字化浪潮下的数字化转型之路-世界快播报
- 中大力德(002896)龙虎榜数据(11-11)-每日时讯
- “10连板”上涨1.6倍!供销社概念股天鹅股份将停牌核查
- 南都电源(300068.SZ):拟开展融资租赁业务、融资合计不超8.7亿元
- 港股创新药ETF(513120)涨4.86%,康希诺生物涨超14%-天天观热点
- 粤海饲料:公司与国内从事水产养殖、水产饲料经销业务的供销社及农民养殖专业合作社有业务合作-当前简讯
- 首届全球数字贸易博览会将在浙江杭州开幕
- 南都电源:子公司拟购买锂离子电池绿色高效循环利用项目资产-每日快播
- 瑞风新能源(00527.HK):已成立合营公司红松新能源(东营)有限公司-世界热头条
- 办理房产证所需要的材料有哪些?房产证土地使用权证办理程序-天天热头条
- 上峰水泥:出资5000万元与傲林科技、南方水泥合资设立建材数智研究院-环球视讯
- 今年双11中小主播日子难过:商家难被割韭菜,免坑位费免佣金抢资源,明星光环也不好使
- 银涛控股(01943.HK)料中期录得亏损净额约1000万-1500万港元-天天观速讯
- 中国金融投资管理(00605.HK)向上市覆核委员会提出覆核有关撤销上市的决定请求-全球报资讯
- 北京特种机械研究所携三大体系亮相中国航展
- 走进深圳坪山生物医药研究院 感受产业创新活力
- 1060显卡吃鸡设置最佳性能(1060显卡吃鸡设置最佳)
- 微信收不到消息(微信收不到消息)
- 河南电气每10股派现0.41元 共计派发现金红利206万
- 孚能科技完成超33亿元定增 为何被三家广州国资企业包揽?-每日消息
- 中达安:公司控制权拟发生变更
- 德联集团(002666.SZ):部分董监高拟合计减持不超84.58万股-天天热议
- 申朴信息每10股派现6.8元 共计派发现金红利2053.26万-焦点观察
- 永成股份权益分派实施 每10股转增2.1股 共计转增210万股-世界聚看点
- 圣邦股份(300661.SZ):荣基香港拟减持不超47.04万股-世界头条
- 鑫宇科技每10股派现3.3元 共计派发现金红利3033.25万-环球热推荐
- PF GROUP(08221)附属太平基业证券授出4600万港元融资贷款-视点
- 注意!怡亚通将于11月28日召开股东大会-最新快讯
- 一顿操作猛如虎 最后便宜两毛八 波司登这种价格套路怎么破?
- 宏景科技(301396)龙虎榜数据(11-11)-当前资讯
- 东方国信:公司有Web3.0底层技术栈储备 包括区块链、云计算、人工智能、数字孪生/元宇宙-观焦点
- 中南文化(002445.SZ):华润信托自6月6日起已累计减持5%股份-天天热资讯
- 信安世纪:拟收购普世科技80%股权 14日起停牌
- 榕基软件跌停 龙虎榜上机构买入5076.33万元 卖出35.88万元-世界讯息
- 隔夜美股史诗级暴涨,港股互联网ETF(513770)大涨超7%!
- 实益达(002137)龙虎榜数据(10-27)-全球消息
- 比优集团(08053)发布中期业绩 股东应占溢利9643.1万元 同比增加12.74%-全球头条
- 大宗交易:联创光电成交892.15万元,折价9.03%(11-11)
- 湖北能源:拟约54亿元投建江陵电厂二期扩建项目及新能源配套项目
- 联君科技每10股派现6.8元 共计派发现金红利1700万-每日焦点
- 什么是阳光工程(什么是阳包阴)
- 酷我音乐vip账号2021(酷我音乐vip账号密码)
- 麦捷科技:比亚迪是公司重点拓展的客户之一
- 百事达注销控股孙公司深圳百思童科技有限公司-焦点报道
- 丰岛食品及子公司以抵押、保证方式向银行合计申请1.34亿授信额度-环球观天下
- 国美1亿持股被冻结,创始人黄光裕夫妇密集套现-今日快讯
- 安道设计拟利用闲置募集资金不超过2000万(含2000万)购买银行理财产品-观点
- 星湖科技:公司目前尚未开通微博
- 恒大深圳湾地块75亿元挂牌转让:处于抵押状态,已停工超1年-环球热闻
- YGM TRADING(00375.HK)盈警:预计中期税后综合亏损2500万港元
- 青海华鼎(600243)龙虎榜数据(11-11)-世界微头条
- 博大新材全资子公司惠州天选拟购买土地使用权 预计总价不超过2300万-环球热推荐
- 小商品城:拟减免小微企业或个体工商户租金
- 川发龙蟒(002312.SZ):就收购重钢矿业49%的股权已完成过户-天天看热讯
- 普门科技(688389.SH):瀚钰生物、瑞普医疗、瑞源成健康拟减持合计不超6%股份-观察
- 聚焦粤港澳大湾区生物医药发展,2022粤港澳大湾区生物医药企业十强揭晓-天天即时看
公司
焦点
精彩推送
- 大港股份(002077)龙虎榜数据(11-11)-环球讯息
- 潮州社保缴费标准基数及比例2022一览表(潮州2022年个人社保缴费标准表)-每日视讯
- 那些加盟连锁咖啡店的人,现在怎么样了?-今日观点
- 大宗交易:长春高新成交207.99万元,折价9.37%(11-11)
- 雅化集团:全资子公司签署锂辉石矿产品承购协议-天天新资讯
- ST大集(000564)龙虎榜数据(11-11)-全球热门
- 青岛胶州“一网统管” 有效破解“停车难”
- 龙津药业(002750)龙虎榜数据(11-11)-全球最资讯
- 天鸿新材拟向浦东发展银行阜阳分行申请专精特新“小巨人”信用贷款 贷款金额总计1000万-全球速讯
- 云浮社保缴费标准基数及比例2022年一览表(2022年个人社保缴费标准表)
- 复盘66只涨停股:天鹅股份10板 众生药业天地板 天下秀炸板回封-天天热文
- 贵阳贵安2023医保怎么缴费?居民医保缴费方式-聚焦
- 金银河(300619.SZ)股东梁可累计减持比例达1.35% 减持数量过半-今日报
- 华峰测控(688200.SH)部分股东及董监高拟合计减持不超1.79万股-环球滚动
- 许家印再卖资产:恒大总部大楼退租一年后,75.43亿转让深圳湾总部地块-环球即时看
- 农民失地保险金如何领取?失地保险金有多少?-环球时讯
- 农民失地保险金怎么领取?有多少钱?
- 多型功勋航天惯导首次亮相中国航展
- 信用卡存款能取出来吗(信用卡存款)
- ST易购:公司苏宁易购广场(百货业态)有美妆、美容相关业态-天天热资讯
- 黑马•产业丨解构聚玻网:数智化重塑玻璃产业链,创立7年营收过百亿-焦点精选
- 天目湖振幅16.43% 机构龙虎榜净卖出4937.51万元
- 光荣之家门牌发放规定河北(光荣之家门牌发放的意义)
- 大港股份今日涨8.21%,上榜营业部席位近3日合计成交12.72亿元-新要闻
- 宁波韵升:参股公司中韵矿业拟收购非洲稀土矿权
- 国网信通:子公司中标3.87亿元国家电网采购项目
- 港股强劲拉升,恒生科技30ETF(513010)大涨5.8%-每日快报
- 深交所:本周对近期涨幅异常的“竞业达”“天地在线”进行重点监控
- 互太纺织(01382)发盈警,预计中期股东应占溢利可能同比下降约28.6%-短讯
- 天鹅股份:公司股价近期波动较大 停牌核查-天天资讯
- 宁波韵升:参股公司以500万美元收购中矿香港稀土100%股份
- 华纳药厂(688799.SH):监事金焰拟减持不超75.9万股
- 好消息!好消息!黄生就市论势本周分享多股止盈,实力杠杠的!-世界资讯
- 科美诊断股东拟合计减持不超9%股份-环球观点
- 龙虎榜丨荣联科技今日涨停 知名游资孙哥净买入4357.57万元-当前快报
- 华密新材“双11”北交所顺利过会:国家级专精特新“小巨人”企业 去年实现净利润4420万元
- 三七互娱拟斥资3亿元至6亿元回购股份 彰显长期信心
- 犀牛午讯:恒大挂牌转让原深圳总部地块 瑞斯康达回应被立案-天天热门
- 天鹅股份:股价异动 停牌核查-当前视点
- 天鹅股份:公司股价近期波动较大 停牌核查-天天速讯
- 华光环能:拟收购汕头益鑫股权并投建澄海益鑫天然气分布式能源项目
- 宁波韵升:参股公司中韵矿业拟收购非洲稀土矿权
- 顺鑫农业:公司部分产品提价
- 时隔5年杭州回归“认房不认贷” 二套首付降至四成-全球今热点
- 11月11日沪深两市主力资金净流入451.23亿元,加仓房地产、医药生物、非银金融-全球速看
- 宏润建设:公司与安徽省新能创业投资有限责任公司投资设立的上海皖宏新能源有限公司已完成工商登记手续
- 若羽臣(003010.SZ):朗姿股份减持比例达1.7887%-世界今日报
- 许家印再卖资产:恒大总部大楼退租一年后,75.43亿转让深圳湾总部地块-热点在线
- 普甜食品(01699):2021年年度业绩将于11月22日刊发 继续停牌
- 信安世纪(688201.SH)筹划增发及现金收购普世科技80%股权事宜 11月14日起停牌
- 外交部:中方出台进一步优化疫情防控工作二十条措施绝不是躺平
- 若羽臣:公司目前未和阿富汗、非洲等地有业务往来
- 微信否认“微信支持撤回5分钟内消息”
- 外交部:美方应该立即停止对中国光伏企业的无理打压-环球热消息
- 南大光电:公司电子特气产品可以应用于chiplet技术工艺-每日讯息
- 良莠不齐怎么读(良莠)
- 协鑫集成:目前芜湖电池项目已经取得项目备案证 确定了项目土地,能评、环评等正在办理中-全球微资讯
- 富士康拟大举扩建印度工厂 未来两年计划新招5.3万名员工
- 中欣氟材:公司主要对京新药业、国邦药业、浙江医药、天宇药业等公司提供医药中间体-环球讯息
- 安记食品(603696.SH):实控人林肖芳以大宗交易减持1.99%的股份-今热点
- 大森控股(01580.HK):财政年度年结日由12月31日变更为3月31日
- 广电运通:公司在Web3.0涉及的区块链、数字货币、NFT等方面拥有技术储备-今亮点
- 北美木制品规模预计在2026年达到24389亿美元-每日精选
- 苏宁家电加盟(苏宁家电)
- 家居卖场“转战”直播做“副业”-当前热门
- 机构:煤电基准价上调,电源均有望获益!电力ETF基金飘红
- 前三季度6家上市定制家居企业净利下滑 大宗业务加持不再?-环球微速讯
- STYLAND HOLD(00211.HK)拟11月25日举行董事会会议 审批中期业绩
- 债转股是否需要验资 债转股对股民是好是坏?
- 天阳科技:北京时间及其一致行动人珠海时间拟清仓减持合计6.94%公司股份
- 医疗保险和商业保险的区别是什么?哪个更好?
- 惠云钛业:上调各型号钛白粉销售价格-天天快讯
- 医保电子凭证亲情账户怎么使用?激活家庭成员流程一览-天天热头条
- 光线传媒控股股东拟减持降低负债,Q3亏损9876万元-环球热点
- 三七互娱:拟斥资3亿元至6亿元回购股份
- 老三板股票在哪里看行情分析 老三板交易费用怎么算?
- 芬兰木材进出口出现大幅缩减-全球动态
- 东方园林:股东何巧女所持4774万股公司股份将被司法拍卖-全球快看
- 75.4亿!原恒大深圳总部地块挂牌,成交款将用于还债-最资讯
- 机构:医药行业有望反转,美诺转债涨超15%!可转债ETF涨近1%-微速讯
- 这届“双11”:主播通宵卖货,但“狂欢”不再-全球信息
- 深圳市抽查家具、人造板等产品34批次不合格
- 合肥社保缴费基数2022是多少?2022年合肥社保一个月要交多少钱?-全球关注
- 场内基金是指什么 场内基金在哪个平台买比较好一点?
- 安井食品(603345.SH):董事长刘鸣鸣、总经理张清苗拟合计减持不超1.6707%股份-环球简讯
- 国网信通(600131.SH)四家子公司共计中标3.87亿元国家电网招标采购项目-实时
- 上海社会保险缴费基数2022下限6520元-环球要闻
- 农民失地保险金有多少?需要哪些资料?-速递
- 热继电器型号(热继电器符号)
- 公积金联名卡有什么用处 没有联名卡怎么提取公积金余额?
- 个人独资企业注册资金最低多少 注册一个空壳公司一年交多少费用合适?
- 优先股是指什么意思 优先股的优缺点是什么?
- 知名英语培训机构全国多个分校突然关门!学员索要学费 老师:我们也是受害者
- 办信用卡哪个银行好批额度高 有什么容易通过的信用卡?
- 收评:三大指数全天放量大涨 两市成交额突破1.2万亿-速读
- 太湖新城污水厂凸显互联互通优势 污水管“长途奔袭”15公里
- Web3.0概念热度不减 天地在线11日斩获9板 公司否认迎合热点概念炒作-世界快消息
- 北向资金净买入146.67亿元,中止连续4日净卖出-今日报
- NTT DATA业务解决方案荣获2022年SAP创新奖
- 新威凌11月11日14时北交所IPO路演: 国内锌粉生产领域龙头企业 打破国外垄断实现进口替代-当前要闻