java 高级用法整理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 高级用法整理相关的知识,希望对你有一定的参考价值。

一、retentionpolicy.class vs runtime区别

java5,增加了注解的功能;其中retentionpolicy注解的生命周期,提供了三种选择策略 source、class和runtime三种选择;

source:源码级别的,主要是方便程序上查看;它的生命周期是编译后,就消亡了,不会存留在classs文件中

class:编译级别的,字节码文件中会留存。生命周期在类加载到虚拟机的时候,消亡;所以它不会加载到java虚拟机中。不过他可以通过aspectj、becl(asm)等字节码库去使用,从而达到修改字节码的效果

runtime:运行时级别;可以被加载到虚拟机中,因此可以通过java反射获取到

参考:

1、https://stackoverflow.com/questions/5971234/retentionpolicy-class-vs-runtime

2、关于becl的用法:https://blog.csdn.net/garfielder007/article/details/56319242

二、String.intern()方法

intern 逻辑判断:当调用 intern 方法时,如果常量池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用

参考1中,有段文字,是这样写的

Invoking intern method on a string object, either creates a new object that enters the intern-pool or return an existing object from the pool that has same value. The invocation on any object which is not in the intern-pool, does NOT move the object to the pool. It rather creates another object that enters the pool.

这是基于JKD1.7之前的,JDK7就做了优化,常量池支持对象引用的存储;因此如果常量池没有equals 对于此字符串对象的,将会将字符串对象的引用加入到常量池中;

其次关注下:JDK7,将常量池从永生区转移到了堆中,避免java.lang.OutOfMemoryError: PermGen space错误

 

参考:

1、https://stackoverflow.com/questions/1855170/when-should-we-use-intern-method-of-string-on-string-literals

2、https://www.cnblogs.com/Kidezyq/p/8040338.html

3、https://tech.meituan.com/in_depth_understanding_string_intern.html

 

以上是关于java 高级用法整理的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#java高级用法之:在JNA中将本地方法映射到JAVA代码中

java高级用法之:JNA中的Structure

Java进阶之光!2021必看-Java高级面试题总结

多年经验总结,写出最惊艳的 Markdown 高级用法

多年经验总结,写出最惊艳的 Markdown 高级用法

Python切片中的误区与高级用法