精华内容
下载资源
问答
  • 死磕Java之Java核心语法

    千次阅读 多人点赞 2020-03-15 14:09:30
    Java语言概述 1、Java是SUN1995年推出的一门高级编程语言。 2、Java之父还是有必要知道的,学Java不知道Java之父,被问到会被笑话的,Java之父是詹姆斯·高斯林(James Gosling)。 3、Java应用领域: Java SE...
    展开全文
  • 点击进入_更多_Java千百问1、java核心框架是什么样的我们知道,我们所说的java包含jdk、jre、jvm等(jdk包含jre,jre包含jvm),下面是个Java SE的模型图(本文部分摘自Oracle官方文档,非常权威):了解jdk、jre...

    点击进入_更多_Java千百问

    1、java核心框架是什么样的

    我们知道,我们所说的java包含jdk、jre、jvm等(jdk包含jre,jre包含jvm),下面是一个Java SE的模型图(本文部分摘自Oracle官方文档,非常权威):

    这里写图片描述

    了解jdk、jre、jvm看这里:什么是Java
    了解Java SE看这里:Java都有那些版本

    2、jdk都包含哪些组件

    jdk主要包含Java Language语言(语法)、Tools(编译器、调试器等)、Jre等,具体如下:

    1. Java Language
      Java编程语言是一种通用的、可并发的、强

    展开全文
  • Java代码是怎么运行的

    万次阅读 2018-07-24 21:29:50
    Java代码有很多运行方式。 在开发工具中运行 双击jar文件运行 在命令行中运行 在网页中运行 当然,上述运行方式都离不开JRE,&...JRE仅包含Java程序的必须组件,包括Java虚拟机以及Java核心类库...

    Java代码有很多运行方式。

    1. 在开发工具中运行
    2. 双击jar文件运行
    3. 在命令行中运行
    4. 在网页中运行

    当然,上述运行方式都离不开JRE, 也就是Java运行时环境。

    JRE仅包含Java程序的必须组件,包括Java虚拟机以及Java核心类库等。

    而我们Java程序员经常接触到的JDK(Java开发工具包)同样包含了JRE, 并且还附带了一系列开发、诊断工具。

    然而,运行C++程序则无需额外的运行时环境,C++编译器往往把C++代码编译成CPU能够理解的机器码。

    那么,既然C++的运行方式如此成熟,我们为什么要在JVM里运行Java代码呢?

    为什么Java要在虚拟机里运行?

    Java作为一门高级程序语言,它的语法复杂,抽象程度也很高。因此在硬件上运行Java代码并不现实,所以运行Java程序之前,我们需要对其进行一番转换。

    当前进行转换的主要思路是:设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换层该虚拟机所能识别的指令序列(Java字节码)。之所以这么取名,是因为Java字节码指令的操作码被固定成一个字节。

    Java虚拟机可以由硬件实现

    https://en.wikipedia.org/wiki/Java_processor

    当然,更多时候还是在各个现有平台(Windows_x64,Linux_aarch64)上提供软件实现。这么做的目的在于,一旦一个程序被编译成Java字节码,那么它变可以在不同平台上的虚拟机实现里运行。这也就是平时我们所说的Java的跨平台特性。

    虚拟机的另外一个好处是它带来了一个托管环境(Managed Runtime)。这个托管环境能够代替我们处理一些代码中冗长而且容易出错的部分。其中最广为人知的当属自动内存管理与垃圾回收,这部分内容甚至催生了一波垃圾回收调优的业务。

    除此之外,托管环境还提供了诸如数组越界,动态类型、安全权限等等的动态监测,使我们免于书写这些无关业务逻辑的代码。

    Java虚拟机具体是怎么运行Java字节码的?

    以标准JDK中的HotSpot虚拟机为例,从虚拟机和底层硬件两个角度,剖析该问题。

    从虚拟机的角度来看,执行Java代码首先需要将它编译而成的class文件加载到Java虚拟机中。加载后的Java类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法区内的代码。

    如果你熟悉X86的话,你会发现这和段式存储管理中的代码段类似。而且,Java虚拟机同样也会在内存中划分出堆和栈来存储运行时的数据。不同的是,Java虚拟机会将栈细分为面向Java方法的Java方法栈面向本地方法(用C++写的native方法)的本地方法栈,以及存放各个线程执行位置的PC寄存器

     

    在运行过程中,每当调用进入一个Java方法,Java虚拟机会在当前线程的Java方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且Java虚拟机不要求栈帧在内存空间里连续分布。

    当退出当前执行的方法时,不管是正常返回还是异常返回,Java虚拟机均会弹出当前线程的栈帧,并将之舍弃。

    在HotSpot里面,上述翻译过程有两种形式

    1. 解释执行,即逐条将字节码翻译成机器码并执行。
    2. 即时编译(Just-In-Time compilation, JIT), 即将一个方法中包含的所有字节码编译成机器码后再执行。

    前者的优势是无需等待编译,而后者的优势在于实际的运行速度更快。

    HotSpot默认采用混合模式,综合了解释执行和即时编译两者的优点。

    它会首先解释字节码。然后将其中反复执行的热点代码,以方法为单位即时编译

    Java虚拟机的运行效率究竟是怎么样的?

    HotSpot采用了多种技术来提升峰值性能,上文提到的即时编译技术便是其中最重要的技术之一。

    即时编译建立在程序符合二八定律的假设上。

    二八定律:20%的代码占用了程序执行过程中80%的资源。

    对于占据大部分的不常用的代码,我们无需耗费时间将其编译成机器码,而是采用解释执行的方式。

    另一方面,对于仅占据小部分的热点代码,我们则可以将其编译成机器码,打到理想的运行速度。

    理论上讲,即时编译后的Java程序的执行效率,是可以超过C++程序的。这是因为与静态编译相比,即时编译拥有程序的运行时信息,并且能够根据这个信息做出相应的优化。(实际上,编译时会插入一些有关jvm的代码)

    举个例子,我们知道虚方法是用来实现面向对象语言多态性的。对于一个虚方法调用,尽管它有很多个目标方法,但在实际运行过程中他可能只调用了其中的一个,这个信息便可以被即时编译器所利用,来规避虚方法调用的开销从而达到比静态编译的C++程序更高的性能。

    为了满足不同用户场景的需要,HotSpot内置了多个即时编译器:C1、C2和Graal。 Graal是Java 10正式引入的实验性即时编译器。

    之所以引入多个即时编译器,是为了在编译时间和生成代码的执行效率之间做取舍。 C1又叫做Client编译器,面向的是对启动性能有要求的客户端GUI程序,采用的优化手段相对简单,因此编译时间较短。C2又叫做Server编译器,面向的是对峰值性能有要求的服务端程序,采用的优化手段相对复杂,因此编译时间较长,但同时生成代码的执行效率较高。

    从Java 7开始,HotSpot默认采用分层编译的方式:热点方法首先被C1编译,而后热点方法中的热点会进一步被C2编译。

    为了不干扰应用的正常运行,HotSpot的即时编译是放在额外的编译线程中进行的。HotSpot会根据CPU的数量设置编译线程的数目,并且按1:2的比例配置给C1及C2编译器。

    在计算资源充足的情况下,字节码的解释执行和即时编译可同时进行。编译完成后的机器码后再下次调用时启用,以替换原本的解释执行。

    我们来完成老师布置的作业:了解Java语言和Java虚拟机看待boolean类型的方式是否不同。

    首先,撰写代码Foo.java

    
     
    1. public class Foo {
    2. public static void main(String[] args){
    3. boolean flag = true;
    4. if(flag)
    5. System.out.println( "Hello, Java!!");
    6. if(flag == true)
    7. System.out.println( "Hello, JVM!!!");
    8. }
    9. }
    
     
    1. javac Foo.java
    2. java Foo

    显然,它的执行结果是:

    Hello, Java!!
    Hello, JVM!!!

    我们使用asmtools.jar对其进行反汇编(此命令JDK7无法运行, 需要升级到JDK8)

    下载地址:https://download.csdn.net/download/ti_an_di/10555815

    java -cp ./asmtools.jar org.openjdk.asmtools.jdis.Main Foo.class > Foo.jasm.1
     

    我们得到它的反汇编代码(在Foo.jasm.1 中)

    
     
    1. super public class Foo
    2. version 52:0
    3. {
    4. public Method "<init>": "()V"
    5. stack 1 locals 1
    6. {
    7. aload_0;
    8. invokespecial Method java/lang/Object. "<init>": "()V";
    9. return;
    10. }
    11. public static Method main: "([Ljava/lang/String;)V"
    12. stack 2 locals 2
    13. {
    14. iconst_1; //看这里
    15. istore_1;
    16. iload_1;
    17. ifeq L14;
    18. getstatic Field java/lang/System.out: "Ljava/io/PrintStream;";
    19. ldc String "Hello, Java!!";
    20. invokevirtual Method java/io/PrintStream.println: "(Ljava/lang/String;)V";
    21. L14: stack_frame_type append;
    22. locals_map int;
    23. iload_1;
    24. iconst_1;
    25. if_icmpne L27;
    26. getstatic Field java/lang/System.out: "Ljava/io/PrintStream;";
    27. ldc String "Hello, JVM!!!";
    28. invokevirtual Method java/io/PrintStream.println: "(Ljava/lang/String;)V";
    29. L27: stack_frame_type same;
    30. return;
    31. }
    32. } // end Class Foo

    在运行指令

    awk 'NR==1,/iconst_1/{sub(/iconst_1/, "iconst_2")} 1' Foo.jasm.1 > Foo.jasm
     

    其作用是将Foo.jasm.1文件中第一个iconst_1 替换为iconst_2, 输出到文件Foo.jasm中

    
     
    1. super public class Foo
    2. version 52: 0
    3. {
    4. public Method "<init>": "()V"
    5. stack 1 locals 1
    6. {
    7. aload_0;
    8. invokespecial Method java/lang/Object. "<init>": "()V";
    9. return;
    10. }
    11. public static Method main: "([Ljava/lang/String;)V"
    12. stack 2 locals 2
    13. {
    14. iconst_2; //看这里
    15. istore_1;
    16. iload_1;
    17. ifeq L14;
    18. getstatic Field java/lang/System. out: "Ljava/io/PrintStream;";
    19. ldc String "Hello, Java!!";
    20. invokevirtual Method java/io/PrintStream.println: "(Ljava/lang/String;)V";
    21. L14: stack_frame_type append;
    22. locals_map int;
    23. iload_1;
    24. iconst_1;
    25. if_icmpne L27;
    26. getstatic Field java/lang/System. out: "Ljava/io/PrintStream;";
    27. ldc String "Hello, JVM!!!";
    28. invokevirtual Method java/io/PrintStream.println: "(Ljava/lang/String;)V";
    29. L27: stack_frame_type same;
    30. return;
    31. }
    32. } // end Class Foo

    我们现在将flag的值由1改为了2, 将修改后的代码汇编到Foo.class文件中

    java -cp ./asmtools.jar org.openjdk.asmtools.jasm.Main Foo.jasm
     

    再次运行Foo类

    
     
    1. java Foo
    2. Hello, Java!!

    可见JVM将true视为1, 不等于修改为2的flag,使用if_icmpne指令判断他们不相等,直接跳到L27执行,所以Hello, JVM!!!不会输出。而第一次判断是使用ifeq判断flag的值是否为0,所以Hello,Java!!会输出。

    此文从极客时间专栏《深入理解Java虚拟机》搬运而来,撰写此文的目的:

    1. 对自己的学习总结归纳

    2. 此篇文章对想深入理解Java虚拟机的人来说是非常不错的文章,希望大家支持一下郑老师。

    展开全文
  • 目录 、项目背景 二、eclipse安装lombok ...在写Java程序的时候经常会遇到如下情形: 新建了个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法。 ...

    目录

    一、项目背景

    二、eclipse安装lombok

    三、项目中使用lombok

    四、原理分析

    五、支持lombok的编译工具

    六、常用lombok注解

    七、其他问题

    八、lombok的罪恶

    参考文献:


    一、项目背景

    在写Java程序的时候经常会遇到如下情形:

    新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法。

    lombok项目的产生就是为了省去我们手动创建getter和setter方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter方法。即它最终能够达到的效果是:在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。

    比如源码文件: 

    import java.io.Serializable;  
       
    import lombok.Data;  
       
    @Data  
    public class BasicClusterInfo implements Serializable {  
       
        private static final long serialVersionUID = 3478135817352393604L;  
        private String            hbaseKey;  
        private int               receiverCount;  
    }  

    以下是编译上述源码文件得到的字节码文件,对其反编译得到的结果  

    public class BasicClusterInfo extends java.lang.Object implements java.io.Serializable{  
        public BasicClusterInfo();  
        public java.lang.String getHbaseKey();  
        public int getReceiverCount();  
        public void setHbaseKey(java.lang.String);  
        public void setReceiverCount(int);  
        public boolean equals(java.lang.Object);  
        public boolean canEqual(java.lang.Object);  
        public int hashCode();  
        public java.lang.String toString();  
    }  

    二、eclipse安装lombok

    为IDE安装lombok插件非常简单,以eclipse环境为例,其安装过程分为以下几个步骤:

    1)下载lombok.jar包
                lombok的官网地址:https://projectlombok.org/
                lombok的下载地址:https://projectlombok.org/download.html
                lombok项目的Github地址:https://github.com/rzwitserloot/lombok

    2)运行lombok.jar
                在windows命令行中输入以下命令: 

    java -jar D:\software\lombok.jar 

    其中D:\software\lombok.jar这是windows下lombok.jar所在的位置, 数秒后将弹出以下对话框,以指定eclipse的安装路径。  

    3)确认完eclipse的安装路径后,点击install/update按钮,即可完成安装。

    4)安装完成之后,请确认eclipse安装路径下是否多了一个lombok.jar包,并且其配置文件eclipse.ini中是否 添加了如下内容: 

        -javaagent:lombok.jar 
        -Xbootclasspath/a:lombok.jar 

    那么恭喜你已经安装成功,否则将缺少的部分添加到相应的位置即可 。

    5)重启eclipse。  

    三、项目中使用lombok

    在项目中使用lombok的方法很简单,分为四个步骤:
               1)在需要自动生成getter和setter方法的类上,加上@Data注解。
               2)在编译类路径中加入lombok.jar包,若是maven工程,引入相关依赖即可。 

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
    </dependencies>

               3)使用支持lombok的编译工具编译源代码(关于支持lombok的编译工具,见“五、支持lombok的编译工具”)。
               4)编译得到的字节码文件中自动生成了getter和setter方法。 

     

    四、原理分析

    接下来对lombok的工作原理进行分析,以Oracle的javac编译工具为例。

    自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。

    举例来说,现在有一个实现了"JSR 269 API"的程序A,那么使用javac编译源码的时候具体流程如下:
               1)javac对源代码进行分析,生成一棵抽象语法树(AST)。
               2)运行过程中调用实现了"JSR 269 API"的A程序。
               3)此时A程序就可以完成它自己的逻辑,包括修改第一步骤得到的抽象语法树(AST)。
               4)javac使用修改后的抽象语法树(AST)生成字节码文件。 

    详细的流程图如下: 

    五、支持lombok的编译工具

    1)由“四、原理分析”可知,Oracle javac直接支持lombok。
               2)常用的项目管理工具Maven所使用的java编译工具来源于配置的第三方工具,如果我们配置这个第三方工具为Oracle javac的话,那么Maven也就直接支持lombok了。
               3)Intellij Idea配置的编译工具为Oracle javac的话,也就直接支持lombok了。
               4)Eclipse中使用的不是Oracle javac这个编译工具,而是自己实现的Eclipse Compiler for Java (ECJ).要想使ECJ支持lombok,得进行设置,具体是在Eclipse程序目录中的eclipse.ini文件中添加如下两行设置: 

    -javaagent:[lombok.jar所在路径]
    -Xbootclasspath/a:[lombok.jar所在路径]

    六、常用lombok注解

    lombok 提供的注解不多,可以参考官方视频的讲解和官方文档。
               Lombok 注解在线帮助文档:http://projectlombok.org/features/index
               下面是几个比较常用的 lombok 注解:
            @Data   :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
            @Setter:注解在属性上;为属性提供 setting 方法
            @Getter:注解在属性上;为属性提供 getting 方法
            @Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
            @NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
            @AllArgsConstructor:注解在类上;为类提供一个全参的构造方法  

    七、其他问题

    现在使用Intellij Idea作为Java项目的IDE,配置Oracle javac作为编译工具。

    现在有一个A类,其中有一些字段,没有创建它们的setter和getter方法,使用了lombok的@Data注解,另外有一个B类,它调用了A类实例的相应字段的setter和getter方法。

    编译A类和B类所在的项目,并不会报错,因为最终生成的A类字节码文件中存在相应字段的setter和getter方法。但是,IDE发现B类源代码中所使用的A类实例的setter和getter方法在A类源代码中找不到定义,IDE会认为这是错误。

    要解决以上这个不是真正错误的错误,可以下载安装Intellij Idea中的"Lombok plugin"。  

    八、lombok的罪恶

    使用lombok虽然能够省去手动创建setter和getter方法的麻烦,但是却大大降低了源代码文件的可读性和完整性,降低了阅读源代码的舒适度。  

    参考文献:

               [1] http://stackoverflow.com/questions/6107197/how-does-lombok-work
               [2] https://projectlombok.org/download.html
               [3] http://stackoverflow.com/questions/3061654/what-is-the-difference-between-javac-and-the-eclipse-compiler
               [4] http://www.ibm.com/developerworks/library/j-lombok/
               [5] http://notatube.blogspot.com/2010/12/project-lombok-creating-custom.html 

     
    展开全文
  • 我公司给第三方的个项目现已开发完成,在交付时想对其中的核心代码部分进行加密,不让第三方看到。 我考虑了2种方案,但都不行,方案是: 1. 源代码混淆方法; 此方法虽可对源码进行混淆,但混淆的部分是...
  • Java代码是怎么运行的?

    万次阅读 2018-11-06 00:52:56
    极客时间《深入拆解Java虚拟机》...Java 代码有很多种不同的运行方式,比如在开发工具中运行、双击执行 jar 文件运行、在命令行中运行,甚至可以在网页中运行。 Java 的运行离不开 JRE(Java 运行时环境), JRE ...
  • 贪吃蛇的java代码分析(

    万次阅读 多人点赞 2016-06-01 16:57:16
    自我审视 最近自己学习java已经有了个多月的...回想这个多月,自己做到好的地方是把大部分时间都用在了看书和码代码上,学习的重点放在了追求对知识的理解和内容的广度之上。书籍方面阅读了《java核心技术》和《jav
  • 你那有没有 Java 方面的面试题可以分享波啊? 以上是读者田田给我发的私信,看完后于我心有戚戚焉啊,最近境况确实不容乐观,并非是个人的原因造成的。那,既然需要面试题,二哥就义不容辞,必须得准备波。 ...
  • javapoet动态生成java代码

    千次阅读 2018-05-23 10:28:51
    你要考虑导包的问题,以及复杂的语法javapoet代码仓库地址其实git地址官方介绍的demo写的很清楚,这里我只是坐下笔记先说几个核心类MethodSpec定义方法TypeSpec定义类丶接口丶抽象类丶枚举JavaFile定义个输出java...
  • JAVA核心知识点--本地方法

    万次阅读 2017-04-19 10:10:27
    简单地讲,个本地方法(Native Method)就是Java调用非java代码的接口。 个本地方法是这样java方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这机制,...
  • Java OCR tesseract 图像智能字符识别技术 Java代码实现

    万次阅读 多人点赞 2014-04-17 21:33:11
    接着上篇OCR所说的,上篇给大家介绍了tesseract 在命令行的简单用法,当然了要继承到我们的程序中,还是需要代码实现的,下面...下面是核心代码: package com.zhy.test; import java.io.BufferedReader; import
  • JAVA核心】Java GC机制详解

    万次阅读 多人点赞 2018-10-17 16:30:13
    垃圾收集 Garbage Collection 通常被称为“GC”,本文详细讲述Java垃圾回收机制。 导读: 1、什么是GC 2、GC常用算法 3、垃圾收集器 4、finalize()方法详解 5、总结--根据GC原理来优化代码 正式阅读之前...
  • Java核心技术卷】Java的解释执行与编译执行

    千次阅读 多人点赞 2019-02-28 18:23:16
    JVM:种能够运行Java字节码(Java bytecode)的虚拟机。(下面有更具体的JVM的内容) 字节码:字节码是已经经过编译(.class文件),但与特定机器码无关,需要解释器转译后才能成为机器码的中间代码Java...
  • JVM是如何运行Java代码

    千次阅读 2018-12-07 19:50:29
    作为Java 程序员,你应该知道,Java 代码有很多种不同的运行方式。比如说可以在开发工具中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至可以在网页中运行。当然,这些执行方式都离不开 JRE,也...
  • Java高级技术第三章——Java核心类库

    千次阅读 2018-02-12 10:24:47
    前言 ... Java自带很多实用的包,这些包中定义了很多类库,可以很方便地进行代码重用。...常用的Java核心包及其功能是: 包名 主要功能 java.applet 提供了创建applet需要的所有类 java.awt.* ...
  • Java代码有很多运行方式。 在开发工具中运行 双击jar文件运行 在命令行中运行 在网页中运行 ...JRE仅包含Java程序的必须组件,包括Java虚拟机以及Java核心类库等。 而我们Java程序员经常接触到的JDK(J...
  • 思考:在讲反射之前,先思考个问题,java中如何创建个对象,有几种方式? Java中创建对象大概有这几种方式: 1、使用new关键字:这是我们最常见的也是最简单的创建对象的方式 2、使用Clone的方法:无论何时...
  • JAVA核心知识点--Instrumentation

    万次阅读 2017-05-24 23:13:41
    利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题。使用 Inst...
  • JAVA bootstrap ClassLoader和JAVA核心API替换1 双亲委派模型  JAVA虚拟机规范定义了两种类型的类装载器-启动类装载器和用户自定义类装载器,启动类装载器是JAVA虚拟机实现的一部分,通过继承ClassLoader类,...
  • 提高 Java 代码质量

    千次阅读 2017-01-22 21:30:04
    确保高的 Java 代码质量有两个步骤:尽早并经常地编写各个层次的测试用例,以及持续的监测质量状况。那么我们又该如何实践呢?本专题汇集了大量来自代码质量专家们的专业经验、最佳实践以及实用技巧,内容涵盖了软件...
  • 初探JAVA代码在虚拟机中的运行机制

    千次阅读 2018-08-04 00:06:13
    作为名Android程序员,我们都知道Java代码有很多种运行方式,比如:可以在命令行中运行,可以在开发工具中运行,可以以jar文件的形式运行,甚至可以在网页中运行。这些执行的方式都离不开JRE(Java Runtime ...
  • Java Web安全之代码审计

    千次阅读 2019-02-13 09:14:00
    通俗的说Java代码审计就是通过审计Java代码来发现Java应用程序自身中存在的安全问题,由于Java本身是编译型语言,所以即便只有class文件的情况下我们依然可以对Java代码进行审计。对于未编译的Java代码文件我们...
  • Java核心类库

    千次阅读 2015-12-04 14:49:22
    ava 的类定义语法: [类类型关键字] class 类名字 [extends] 父类名字 {  [存取权限关键字] [静态标志] 变量名字;... 抽象类至少要有个抽象操作函数,这样的类不能实例化,必须被子类继承,并改写
  • JAVA代码重构–改善既有代码的设计() 本文主要借鉴了&lt;重构 改善既有代码的设计&gt;与&lt;设计模式&gt;这两本书; 主要解释重构的原理(principles)和最佳实践方式(best practices),并指出...
  • java图片爬虫脚本_代码下载

    万次阅读 2016-03-31 09:49:21
    这篇文章主要介绍了,如何用纯java个图片爬虫,美女图片爬虫代码分享,本文以采集抓取美女图片为例,需要的朋友可以参考下继续鼓捣爬虫,你懂的!粘贴就可以用.
  • Java代码优化提点

    万次阅读 多人点赞 2013-10-30 11:04:16
    程序代码可以是中间代码,也可以是目标代码。等价的含义是使得变换后的代码运行结果与变换前代码运行结果相同。优化的含义是最终生成的目标代码更加轻松自如(运行时间更短、占用空间更小)地工作,时空效率优化。 ...
  • Java核心目的和并发编程

    千次阅读 2018-10-10 11:22:24
    Java 编程思想》这本书赢得了全球程序员的广泛赞誉,从 Java 的基础语法到最高级特性,都能指导我们 Java 程序员轻松掌握。
  • Java多线程编程实战指南(核心篇)读书笔记(

    千次阅读 多人点赞 2017-07-31 11:17:45
    Java多线程编程实战指南(核心篇)读书笔记
  • 书评:Java核心编程卷1——基础

    千次阅读 2013-11-04 23:24:31
    本文来源于我在InfoQ中文站翻译的文章,原文地址是:...那时所有与Java相关的图书基本上都是由Sun公司的几个工程师们所发布的,比如说Arthur Van Hoff et.al所写的“H

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 455,224
精华内容 182,089
关键字:

java核心代码是哪一部分

java 订阅