Java——重要但容易忽略的知识

简介: 本文将一点一滴的累计记录Java中的一些细节知识。不只是加以说明,而是所有的细节都找到来源,以官方文档、知名社区的介绍为主。

本文将一点一滴的累计记录Java中的一些细节知识。不只是加以说明,而是所有的细节都找到来源,以官方文档、知名社区的介绍为主。

StringTokenizer和String.split

    //Use StringTokenizer 
    StringTokenizer st = new StringTokenizer("this is a test");
    while (st.hasMoreTokens()) {
        System.out.println(st.nextToken());
    }
    //Use split
    String[] results = "this is a test".split("\\s");
    for (String result:results){
         System.out.println(result);
    }

关于StringTokenizer和String.split的差异说法很多。官方文档http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html 有定性说明(附注:最新的JDK8 API文档中也是相同的说明)。

StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.

大意是StringTokenizer是一个历史遗留类,为了保证向后兼容性而保留这个类。推荐在新的代码中使用split或regex替换。

至于网上的测评资料说StringTokenizer比String.split效率更高,由于没有亲测就不妄加评论了。作为项目管理者,从风险和可靠性的角度考虑,在项目规范和代码review的过程中,还是以官方文档为准。

transient和volatile关键词的使用

transient volatile Set<K> keySet = null;
transient volatile Collection<V> values = null;

transient是变量修饰符,表明该字段不是对象持久状态的一部分,储存的时候不用储存,比如序列化这个对象时,该字段是不会储存的。
        volatile也是变量修饰符,只能用来修饰变量。volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。 而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
在此解释一下Java的内存机制:
Java使用一个主内存来保存变量当前值,而每个线程则有其独立的工作内存。线程访问变量的时候会将变量的值拷贝到自己的工作内存中,这样,当线程对自己工作内存中的变量进行操作之后,就造成了工作内存中的变量拷贝的值与主内存中的变量值不同。
        Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时地得到共享成员变量的变化。而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

相关文章
|
1月前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
106 60
|
5月前
|
Java 物联网 大数据
day1:认识Java
【7月更文挑战第1天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
52 7
|
Oracle Java 关系型数据库
Java是什么?
Java是什么?
345 0
|
存储 缓存 运维
JAVA问答12
JAVA问答12
130 0
|
存储 SQL 缓存
JAVA问答16
JAVA问答16
123 0
|
编解码 监控 负载均衡
JAVA问答7
JAVA问答7
110 0
|
Oracle Java 关系型数据库
什么是java
什么是java
119 0
|
Java 测试技术
1070 结绳(JAVA)
给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串连后,原来两段绳子的长度就会减半。
1070 结绳(JAVA)
|
Java
java24-if..else...if
java24-if..else...if
106 0
java24-if..else...if
|
Java 程序员 C语言
Java是什么
ava到底是啥?它能干什么? 自己也看过不少的课程和书,大部分都是从Java的发展史开始讲,总之就是那些什么Java历史悠久,Java很优秀,Java越来越牛,用的人越来越多,什么编程语言排行榜常年第一,大致都是这些,然后再扯些其他的,接着就上起了Hello World!就这样,你Java生涯的第一个代码开始了,意思是“你好,世界!” 我还是想不通,Java是啥,能干嘛,能不能先告诉我? 可能你在刚开始学习Java的时候也有这样的疑惑,那么你会怎么做呢?你不知道啊,怎么办?问别人?不,你应该会想到百度,不是说 百度一下,你就知道吗? 好嘞,我们上百度看看去: 640?wx_fmt=
188 0