• [交流吐槽] 日常Java练习题5
    以下关于 abstract 关键字的说法,正确的是()正确答案: D 你的答案: D (正确)abstract 可以与final 并列修饰同一个类。abstract 类中不可以有private的成员。abstract 类中必须全部是abstract方法。abstract 方法必须在abstract类或接口中。题解:1、abstract类不能与final,static使用。final修饰方法,子类可以调用,但不能覆盖。2、最好不要有private因为私有和抽象放在一起,子类如果想重写父类的私有方法根本继承不过来,也就无法重写3、抽象类中可以有非抽象方法4、抽象类中可以都是非抽象的,但是抽象方法一定要在类和接口中
  • [交流吐槽] 日常Java练习题4
    现有一变量声明为 boolean aa; 下面赋值语句中正确的是 ( )正确答案: A 你的答案: A (正确)aa=false;aa=False;aa=“true”;aa=0;题解:boolean的值要不是true,要不就是false。
  • [技术干货] redis 支持的 Java 客户端
    支持的 Java 客户端有 Redisson、jedis、lettuce 等
  • [技术干货] 测试工程师必看——Web自动化测试Java&Pyhton;
    了解自动化的目的,熟练掌握testng&unittest自动化框架,以及断言与日志处理。
  • [问题求助] 求求大神帮助,区块链实例化报错(java,fabric)
    no such file or directory
  • [交流吐槽] 日常Java练习题3
    以下代码执行后输出结果为( )public class ExceptionTest{    public void method()    {        try        {            System.out.println("进入到try块");        }        catch (Exception e)        {             System.out.println("异常发生了!");        }        finally        {            System.out.println("进入到finally块");        }            System.out.println("后续代码"); }     public static void main(String[] args)     {         ExceptionTest test = new ExceptionTest();         test.method();     } }进入到try块 异常发生了! 进入到finally块 后续代码进入到try块 进入到finally块 后续代码进入到try块 后续代码异常发生了! 后续代码题解:对于这题,没有异常,直接从try进入到finally,然后执行下面的后续代码。
  • [交流吐槽] 日常Java练习题2
    区分类中重载方法的依据是( )。正确答案: C 你的答案: C (正确)不同的形参名称不同的返回值类型不同的形参列表不同的访问权限题解:两个重载函数必须在下列一个或两个方面有所区别:1、函数的参数个数不同。2、函数的参数类型不同或者参数类型顺序不同
  • [交流吐槽] 日常Java练习题1
    设Tree为已定义的类名,下列语句能正确创建 Tree 对象的是 。正确答案: B 你的答案: B (正确)Tree t=new Tree;Tree t=new Tree();Tree t=Tree();Tree t[ ]=new Tree[10];题解:需要对象,当然只需new一个了,还有别忘了括号。
  • [新手课堂] 读取Java运行属性
    package com.day15.demo;public class ListDemo {    public static void main(String[] args) {        System.getProperties().list(System.out);    }}
  • [新手课堂] 为什么使用双亲委派模式?
    1)使用双亲委派模型来组织类加载器之间的关系,有一个显而易见的好处就是 Java 类随着它的类加载器一起具备了一种带有优先级的层次关系。2)如果没有使用双亲委派模型,由各个类加载器自行去加载的话,如果用户自己编写了一个java.lang.Object 的类,并放在程序的 ClassPath 中,那系统中将会出现多个不同的 Object 类,Java 类型体系中最基础的行为也就无法保证,应用程序也将会变得一片混乱。
  • [新手课堂] Tomcat 的类加载过程?
    Tomcat 的类加载过程,也就是 WebappClassLoaderBase#loadClass 的逻辑如下。1)首先本地缓存 resourceEntries,如果已经被加载过则直接返回缓存中的数据。2)检查 JVM 是否已经加载过该类,如果是则直接返回。3) 检查要加载的类是否是 Java SE 的类,如果是则使用 BootStrap 类加载器加载该类,以防止 webapp 的类覆盖了 Java SE 的类。例如你写了一个 java.lang.String 类,放在当前应用的 /WEB-INF/classes 中,如果没有此步骤的保证,那么之后项目中使用的 String 类都是你自己定义的,而不是 rt.jar 下面的,可能会导致很多隐患。4)针对委托属性 delegate 显示设置为 true、或者一些特殊的类(javax、org 包下的部分类),使用双亲委派模式加载,只有很少部分使用双亲委派模型来加载。5)尝试从本地加载类,如果步骤5中加载失败也会走到本步骤,这边打破了双亲委派模型,优先从本地进行加载。7)走到这,代表步骤6加载失败,如果之前不是使用双亲委派模式,则在这边会委托给父类加载器来尝试加载。8)走到这边代表所有的尝试都加载失败,抛出 ClassNotFoundException。
  • [毕昇JDK] 【毕昇 JDK】毕昇 JDK 四大关键特性解读
    毕昇 JDK 是华为基于 OpenJDK 优化后的开源版本,是一款高性能、可用于生产环境的 OpenJDK 发行版。毕昇 JDK 稳定运行在华为内部 500 多个产品上,毕昇 JDK 团队积累了丰富的开发经验,解决了许多实际业务中由原生 OpenJDK 缺陷引起的问题。毕昇 JDK 致力于为 Java 开发者提供一款稳定可靠、高性能、易调测的 JDK,也为用户在鲲鹏 AArch64 架构上提供一个更好的选择。本文基于毕昇 JDK8 和毕昇 JDK11 版本特性进行介绍。了解毕昇 JDK毕昇 JDK 是 OpenJDK 的下游,对华为内部一些应用场景上遇到的性能和稳定性问题进行了修复,并针对鲲鹏 AArch64 架构进行了稳定性增强和性能优化,尤其在大数据场景下性能更好。License:采用 GPLv2 with Classpath Exception 协议。支持 Java 版本:目前毕昇 JDK 支持 8 和 11 两个 LTS 版本。支持架构:支持鲲鹏 AArch64 架构,毕昇 JDK 开源代码支持 x86 版本自构建。支持操作系统:目前仅支持 Linux 版本,对操作系统的要求是鲲鹏  AArch64 平台上 glibc 版本不低于 2.17,基本覆盖所有主流操作系统,已验证的 OS 列表,可参考鲲鹏社区产品页的兼容性查询工具。毕昇 JDK 新增特性在 OpenJDK 基础上,毕昇 JDK 在鲲鹏 ARM 架构上进行了性能优化,新增了快速序列化、AppCDS、G1GC 堆内存伸缩、KAE Provider 等特性,充分提升毕昇 JDK 在鲲鹏 ARM 架构下的运行性能。下文将对这四项优势特性进行详细的介绍。快速序列化——提升原生序列化性能问题背景:在一些无法使用 Kyro(无法修改代码时),需要使用 OpenJDK 原生序列化特性的场景,OpenJDK 原生的序列化机制会耗时较长,导致性能较低。毕昇 JDK8&11 通过实行快速序列化特性提升其性能,快速序列化实现原理大致如下图:快速序列化的实现原理通过减少序列化数据字段和提供数据缓存的方式提升 OpenJDK 原生序列化的性能,详细介绍可参考毕昇 JDK 社区快速序列化特性介绍,该特性在毕昇 JDK8&11 都支持。场景建议:业务中序列化/反序列化部分占比较高的场景可以考虑使用。比如:readObject/ writeObject 热点方法占比较高,可以尝试使能该特性。重复对象越多,场景收益越大。实测在某序列化占比较高场景,快速序列化特性较原生序列化性能收益提升15%。使能方法:-XX:+UnlockExperimentalVMOptions-XX:+UseFastSerializer -DfastSerializerEscapeMode=trueAppCDS——提升 java 应用启动速度在 Java 程序运行初始阶段,类的加载是一个比较耗时的过程,且在每次程序运行中均需要执行一遍。而 CDS(Class Data Sharing)技术,就是把类加载后的数据保存到文件中,下次运行时,直接将加载后的类数据从文件中恢复到内存中,不需要再重新执行类的加载过程,从而提高性能。AppCDS 特性在原 CDS 特性基础上增加了对应用类的支持,实现原理如下图所示:AppCDS 的实现原理从实现原理图可以看到,AppCDS 特性通过从 JSA 文件读取共享数据,省略了共享类的加载过程。同时 Shared Memory 支持多进程间共享,也减少对内存的占用。具体使能方式可参考毕昇 JDK 社区关于 AppCDS 特性的使用介绍。G1GC 堆内存伸缩——及时释放空闲堆内存在 OpenJDK 社区的 8u 版本中,即使 G1GC 在空闲堆内存没有被使用时,也不会主动及时归还给 OS,会造成内存资源占用浪费情况。由于 G1 尽可能避免触发 Full GC,因此在许多情况下,除非强制从外部执行 Full GC,否则 G1 不会将空闲的 Java 堆内存释放给操作系统。毕昇 JDK8 通过在 G1 中引入堆内存伸缩特性,在应用程序 CPU 占比不高情况下,定期尝试释放 G1 的空闲堆内存空间给 OS,达到内存资源的最优使用。特性开启后内存释放示意图上图为某业务使能该特性后实测的 JProfile 示意图,可见空闲内存会被平滑释放。在产品线某业务场景下运行 49 个微服务,实测开启 G1 堆内存回收特性比默认 G1GC 的实际物理内存减少 40%。在默认情况下,毕昇 JDK8 不主动开启此功能,对于延迟和吞吐量敏感的业务,不会受到影响。使能方式:-XX:+UseG1GC –XX:+G1UncommitKAE Provider——支持鲲鹏硬加速/提升加解密速度KAE 加解密是鲲鹏加速引擎的加解密模块,鲲鹏硬加速模块实现了 RSA/ SM3/ SM4/ DH/ MD5/ AES等算法,提供了高性能对称加解密、非对称加解密算法能力,兼容 openssl1.1.1a 及其之后版本,支持同步和异步机制。毕昇 JDK 8 通过利用 Provider 机制,实现对鲲鹏服务器 KAE 加解密特性的支持,以帮助用户提升在鲲鹏 AArch64 服务器加解密业务的竞争力,特性实现原理可参考下图,详细介绍可参考毕昇 JDK 社区关于 KAE Provider 特性说明。KAE Provider 特性实现原理该特性在某 web 中间件业务场景中,性能收益较 OpenJDK 原生特性提升90%。支持算法列表:算法说明摘要算法包括 MD5、SHA256、SHA384、SM3对称加密算法 AES支持 ECB、CBC、CTR、GCM 模式对称加密算法 SM4包括 ECB、CBC、CTR、OFB 模式HMac包括 HmacMD5、HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA51非对称加解密算法 RSA支持512、1024、2048、3072、4096位秘钥大小DH包括 DHKeyPairGenerator 和 DHKeyAgreement,支持512、1024、2048、3072、4096位秘钥ECDH包括 ECKeyPairGenerator 和 ECDHKeyAgreement,支持曲线secp224r1、prime256v1、secp384r1、secp521r1RSA 签名包括 RSASignature 和 RSAPSSSignature,私钥只支持 RSAPrivateCrtKey其他特性毕昇 JDK 其他特性如:G1GC 支持 Numa-Aware、毕昇 JDK 11 AArch64 版本支持的 ZGC、G1 Full GC 优化、Jmap 支持并行扫描等详情请点击毕昇JDK产品页获取。毕昇 JDK8 和 11 均已开源,并每隔 3 个月进行版本升级和新特性合入,欢迎来毕昇 JDK 开源社区获取最新信息和技术讨论。如果遇到相关技术问题(包括但不限于毕昇 JDK),也可以通过毕昇 JDK 社区进行讨论。原文转载自 华为计算-【鲲鹏 DevKit 黑科技揭秘】┃毕昇 JDK 4大关键特性解读
  • [新手课堂] Java 虚拟机中有哪些类加载器?
    从 Java 虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java语言实现,独立于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader。从Java开发人员的角度来看,绝大部分Java程序都会使用到以下3种系统提供的类加载器。1)启动类加载器(Bootstrap ClassLoader):这个类加载器负责将存放在\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。2)扩展类加载器(Extension ClassLoader):这个加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。3)应用程序类加载器(Application ClassLoader):这个类加载器由sun.misc.Launcher$AppClassLoader实现。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也称它为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
  • [新手课堂] Java 虚拟机中有哪些类加载器?
    从 Java 虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java语言实现,独立于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader。从Java开发人员的角度来看,绝大部分Java程序都会使用到以下3种系统提供的类加载器。1)启动类加载器(Bootstrap ClassLoader):这个类加载器负责将存放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。2)扩展类加载器(Extension ClassLoader):这个加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载<JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。3)应用程序类加载器(Application ClassLoader):这个类加载器由sun.misc.Launcher$AppClassLoader实现。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也称它为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
  • [新手课堂] Java的实现
    // Bubble sort in Javaimport java.util.Arrays;class Main {  // perform the bubble sort  static void bubbleSort(int array[]) {    int size = array.length;        // loop to access each array element    for (int i = 0; i < size - 1; i++)          // loop to compare array elements      for (int j = 0; j < size - i - 1; j++)        // compare two adjacent elements        // change > to < to sort in descending order        if (array[j] > array[j + 1]) {          // swapping occurs if elements          // are not in the intended order          int temp = array[j];          array[j] = array[j + 1];          array[j + 1] = temp;        }  }  public static void main(String args[]) {          int[] data = { -2, 45, 0, 11, -9 };        // call method using class name    Main.bubbleSort(data);        System.out.println("Sorted Array in Ascending Order:");    System.out.println(Arrays.toString(data));  }}