`
sungang_1120
  • 浏览: 325240 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Java你不知道的那些事儿—Java隐藏特性(上)

阅读更多

每种语言都很强大,不管你是像我一样的初学者还是有过N年项目经验的大神,总会有你不知道的东西。就其语言本身而言,比如Java,也许你用Java开发 了好几年,对其可以说是烂熟于心,但你能保证Java所有的用法你都知道吗?今天没事就来整理下Java中有哪些隐藏的特性呢?知道的可以举手哦~~~

 

一、双括号初始化语法(DoubleBraceInitialization)(这里指的是大括号{})

 主要指的是集合类(List,Map,Set等),我们创建一个常量集合或传递一个常量集合作为参数,往往都会这么做(以Set为例):

 

Set<String> validCodes = new HashSet<String>();
 validCodes.add("XZ13s");
 validCodes.add("AB21/X");
 validCodes.add("YYLEX");
 validCodes.add("AR2D");
 removeProductsWithCodeIn(validCodes);

//或在类中初始化一个常量集合:

private static final Set<String> VALID_CODES = new HashSet<String>();
 static {
    validCodes.add("XZ13s");
    validCodes.add("AB21/X");
    validCodes.add("YYLEX");
    validCodes.add("AR2D");
 }

 

 

 会不会觉得每次都这样很费时费力,其实,有更好的办法,那就是双括号语法,像下面这样:

private static final Set<String> VALID_CODES = new  HashSet<String>() {{
    add("XZ13s");
    add("AB21/X");
    add("YYLEX");
    add("AR2D");
 }};
 
// Or:
 
 removeProductsWithCodeIn(new HashSet<String>() {{
    add("XZ13s");
    add("AB21/X");
    add("YYLEX");
    add("AR5E");
 }});
 这里解释下这两个括号:第一个括号创建了一个新的匿名内部类,相信这个大家都知道;第二个括号声明了匿名内部类实例化时运行的实例初始化块。
 

使用双括号语法需要注意两点:

1. 如果要在匿名内部类中要建立匿名子类,那么只能用于非final的类,这很明显,且不仅局限于集合类,可以用来实例化任何对象,例如用于GUI对象,如下:

add(new JPanel() {{
    setLayout(...);
    setBorder(...);
    add(new JLabel(...));
    add(new JSpinner(...));
 }});

 2,这种语法与常用的equals(Objecto)方法不兼容。例如Example类有这样的方法:

public boolean equals(final Object o) {
    if (o == null) {
        return false;
    } else if (!getClass().equals(o.getClass())) {
        return false;
    } else {
        Example other = (Example) o;
        // Compare this to other.
    }
  }

 

那么,使用双括号初始化语法创建的任何对象都不会与未使用双括号语法创建的对象相等。因此,建议大家:如果类中需要equals(Object o)方法,那就老老实实不要使用这种语法了。不过集合类没有这种问题,应该是因为集合内部优化了的原因。

那么什么时候建议大家使用双括号语法呢?

如果你只是要创建并初始化一个实例而不是创建一个新类,或者创建任何不添加字段属性或重载方法的匿名类时,用双括号语法就很nice了。

 

3. 如果你用的是集合类且该类有构造器参数接受另一个集合生成该集合的实例,那么有个更好的更惯用的替代方法,如大家都知道的List初始化可以用Arrays.asList(),如下:

 

List<String> myList = new ArrayList<String>(Arrays.asList("One", "Two", "Three"));

 但需要注意:

asList返回的是一个长度不可变的列表。数组是多长,转换成的列表是多长,我们是无法通过add、remove来增加或者减少其长度的。

 

二、类型参数的与操作&(TypeParameterJointUnion

就是参数绑定多个类型,如:

public class ClassName<T extends Class & Interface1 & Interface2 & ...> {}

 

注意:这里extends后面只有第一个为类Class,后面&的全部都是接口Interface,而且类Class的声明或定义必须在Interface之前。

 

 

举个例子:如果你想要一个既是 Comparable类又是Collection类的参数,实现的功能是:两个给定的集合是否相等或两个集合中的任一个是否包含指定的元素,那么你可以用下面的函数实现:

public static <A, B extends Collection<A> & Comparable<B>> boolean foo(B b1, B b2, A a) {
    return (b1.compareTo(b2) == 0) || b1.contains(a) || b2.contains(a);
}

 这里b1和b2可以同时具有类型Collection和Comparable类型,因此可以使用Collection类的contains方法也可以使用Comparable类的compareTo方法。

 

三、VisualVM监控工具(Java VisualVM

这是JDK6.0 update 7 中自带的监控工具(java启动时不需要特定参数,该工具在bin/jvisualvm.exe),能够监控线程,内存情况,查看方法的CPU时间和内存 中的对象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。

 

双击打开,从UI上来看,这个软件是基于NetBeans开发的了。

从界面上看还是比较简洁的,左边是树形结构,自动显示当前本机所运行的Java程序,还可以添加远程的Java VM,其中括号里面的PID指的是进程ID。OverView界面显示VM启动参数以及该VM对应的一些属性。Monitor界面则是监控Java堆大 小,Permgen大小,Classes和线程数量。Profiler界面比较有趣,看样子似乎可以动态的对某个Java程序进行调优了。不过我没试用这 个功能,感觉要调优还是在Netbeans里面比较自然一点,起码有代码,没代码调优了用处也不大。

 

四、Classpath支持通配符(Setting the class path

 

这是Java 6开始支持的功能,比如在工程中经常会有这样的配置:
java -classpath ./lib/log4j.jar:./lib/commons-codec.jar:./lib/commons-httpclient.jar:./lib/commons-collections.jar:./lib/myApp.jar so.Main
 比较复杂,还容易出错,其实可以用通配符更加简洁方便:
java -classpath ./lib/* so.Main
 

五、协变返回类型( covariant return types

这是Java 5添加的功能,在Java5之前我们在子类中覆盖基类的方法时是不能改变被覆盖方法的返回类型的,就是基类和父类的方法必须一模一样,想要改变只能在创建 对象时Cast。Java 5过后,我们就可以改变了,不过需要注意的是:改变后的类型必须是原类型的子类型。举个例子就一目了然了。

public class CovariantReturnTypesTest {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
 
        Mill m = new Mill();
        Grain g = m.process();
        System.out.println(g);  // output: Grain
        m = new WheatMill();
        g = m.process();
        System.out.println(g); // output: Wheat
    }
 
}
 
class Grain {
    public String toString() {
        return "Grain";
    }
}
 
class Wheat extends Grain {
    public String toString() {
        return "Wheat";
    }
}
 
class Mill {
    Grain process() {
        return new Grain();
    }
}
 
class WheatMill extends Mill {
    // 这里返回类型改为了Grain的子类型Wheat
    Wheat process() {
        return new Wheat();
    }
}

 

 

分享到:
评论

相关推荐

    Java编程那些事儿[完整版]PDF(加密版)

    有CSDN的MVB 陈跃峰老师摘写,适合JAVA初学者的一本书! 由本人收集整理成完成版转换成PDF格式上传CSDN! 作者:陈跃峰老师 收集整理:云低夕落人归

    Java程序员上班那点事儿txt版本

    Java程序员上班那点事儿不全希望你喜欢谢谢了

    java那些事儿chm版本

    Java编程那些事儿系列文章(全集) 整理好的chm 作者:陈跃峰 来源:http://blog.csdn.net/mailbomb

    java那些事儿

    Java那些事儿,这是一个专为Java初学者准备的学习资源,涵盖了丰富的知识内容,旨在帮助新接触Java编程的人士快速上手并深入理解这门强大的编程语言。在这个压缩包中,我们有两份重要的文件:《Java编程那些事儿》的...

    Java核心技术 第12版 开发基础+高级特性 英文原版

    《Java核心技术 第12版》是一本针对Java开发基础和高级特性的详尽教程,适合Java初学者和有经验的开发者。本版已更新至Java 17,涵盖了最新的语言特性。作者Cay S. Horstmann是美国圣何塞州立大学的计算机科学教授,...

    Java程序员上班那点事儿

    "Java程序员上班那点事儿"的主题不仅涵盖了他们的日常工作,还揭示了他们在编程世界中的挑战、成长与乐趣。 首先,Java作为一种面向对象的编程语言,其特性使得它在企业级应用开发中占据了主导地位。Java程序员需要...

    JAVA_API1.6文档(中文)

    java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类...

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java 面经手册·小傅哥.pdf

    这是一本以面试题为入口讲解 Java 核心内容的技术书籍,书中内容极力的向你证实代码是对数学逻辑的具体实现。当你仔细阅读书籍时,会发现Java中有大量的数学知识,包括:扰动函数、负载因子、拉链寻址、开放寻址、...

    java 17 window 安装包

    这个安装包是专为在Windows x64平台上运行和开发Java应用程序设计的。让我们深入了解一下Java 17以及如何在Windows系统上进行安装。 Java 17,正式命名为Java SE 17 (Standard Edition),是Oracle公司推出的最新...

    Java基础 学习笔记 Markdownr版

    通过阅读和理解这些笔记,你将能够掌握Java的基本语法、核心概念以及高级特性,为进一步学习Java的框架和技术打下坚实的基础。同时,笔记采用Markdown格式,方便转换为PDF、Word等其他格式,适应不同的阅读和学习...

    尚硅谷Java视频Java8新特性视频教程

    尚硅谷Java视频Java8新特性视频教程,本Java视频涵盖了 Java8 的所有新特性:Lambda表达式、强大的 Stream API、全新时间日期 API、ConcurrentHashMap、MetaSpace。Java8 的新特性使 Java 的运行速度更快、代码更少...

    java2python--java代码转python工具

    这种转换对于那些熟悉Java但希望进入Python生态系统,或者想要利用Python特定功能的开发人员来说特别有用。Python以其简洁的语法和丰富的库而闻名,是数据分析、机器学习和Web开发等领域的首选语言。 在描述中提到...

    Head First Java 3rd (英文版)

    《Head First Java》第三版针对2022年及以后的Java程序员,涵盖了最新的Java语言特性和最佳实践。 书中特别强调了Java 8及更高版本引入的重要特性,如Java流(Java Streams)和函数式编程(Functional Programming...

    java转js工具

    综上所述,"java转js工具"是一个重要的开发辅助工具,它帮助开发者在Java和JavaScript之间架起桥梁,使得跨平台开发变得更加便捷。然而,使用时需要注意语言特性的差异,以及转换过程中可能出现的问题和挑战。

    东北大学Java期末试题

    Java 语言的跨平台特性指的是 Java 语言可以在不同的操作系统平台上运行,而不需要进行修改。这是因为 Java 语言的 bytecode 可以在不同的虚拟机上运行,而不需要关心底层的操作系统。这种跨平台特性使得 Java 语言...

    Java程序员+上班那点事儿.pdf

    Java程序员+上班那点事儿.pdf 很好的文章 菜鸟 大虾都有帮助!

    JAVA USB监听器

    隐藏性能较好的特性意味着该软件设计时考虑了用户隐私和安全性。为了实现隐藏运行,开发者可能采用了后台服务的方式,使得程序能够在不显示界面的情况下持续运行。此外,可能还使用了权限控制和隐藏文件的方法,防止...

    java3d下载

    1.3版本适合那些对性能要求不高的基础3D应用,而1.4和1.5版本则适用于需要更高级特性和更好性能的应用。在安装过程中,通常需要将Java3D的库文件添加到Java类路径中,以便在应用程序中引用。 尽管Java3D在过去是3D...

    《码农翻身》第二章 Java帝国.emmx

    你最爱的Java 搞懂了这几点,你就学会了Web编程 Spring本质系列(1) -- 依赖注入 Spring本质系列(2) -- AOP 三层架构和MVC那点事儿 ...Junit你不知道的那些事儿 Java EE的历史 Java EE读书指南 给小白的Java

Global site tag (gtag.js) - Google Analytics