字符常量池是什么意思
可以理解为内存里面专门为string类型变量开辟的一片区域譬如String a = "abc"; 当你定义这样一个变量的时候,java此时先会去常量池寻找有没有"abc"这样的字符串,如果有,直接把内存地址交给a, 否则就生成一个"abc"的字符串当下一个String b = "abc";的时候,发现常量池已经有"abc"了,此时JVM不会再次生成"abc",而是直接交给"abc"引用给b, 所以此时你会发现a == b
vjm指的是什么
vjm指的是常量池,常量池是在java用于保存在编译期已确定的,已编译的class文件中的一份数据。
它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = "java"这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间
jvm元空间存哪些数据
JVM(Java虚拟机)的元空间(Metaspace)是用于存储Java类、方法、字段等元数据信息的区域。在JDK8及以上版本中,元空间取代了传统的永久代(Permanent Generation),它不再与Java堆绑定,而是直接使用本地内存。
元空间主要存储以下数据:
类型信息(Type Information):Java类的名称、父类、实现的接口、字段和方法的信息等。
字节码信息(Bytecode Information):Java类的字节码以及相关的调试信息、注释信息等。
符号引用信息(Symbolic References):Java类中使用到的常量池、字段、方法等符号引用。
额外的元数据信息(Additional Metadata Information):如注解信息、枚举类型信息等。
需要注意的是,由于元空间是直接使用本地内存的,因此它的大小可以根据应用程序的需要进行自动调整。同时,元空间也是一个不断增长的区域,当元数据信息不再被使用时,它们会被垃圾回收器回收并释放空间
JAVA中为什么String比StringBuffer的处理效率更高
其实,String和StringBuffer在Java中都是用作字符串处理。当然,这两个类还经常会跟StringBuilder进行比较。
其实不论是String还是StringBuilder和StringBuffer,都是基于字符数组实现(JDK8之后是基于字节数组实现)。但是三者之间的异同点是什么呢?
其中,String类是被final进行修饰的,因此其值不可变。当然,大家肯定会有疑问,String不是可以用“+”号进行字符串拼接运算没?我打印过那个值,值确实改变了。对此我需要解释一下,所谓字符串拼接,只不过是新生成一个字符串后将新生成的字符串赋给了原本的变量罢了。当然,中间还会包含一次在字符串常量池判断是否已存在字符串值的操作。但不管怎么操作,最终的结果都是用拼接后的新字符串取代了旧的字符串,或者对该字符串变量重新进行了赋值。
而StringBuffer和StringBuilder的值则可变的,如果只是日常使用,这两者并没有太大的区别。只不过在多线程环境中使用时候,StringBuffer的效率要差些。因为StringBuffer的方法被synchronized关键字修饰,也就是说当StringBuffer被多个线程共享时,会存在锁争抢和等待问题,从而导致耗时增加。而StringBuilder则没有个限制,但是却容易发生线程安全问题。
所以业内使用习惯是,单线程中用StringBuilder, 多线程中用StringBuffer。