202010-10 Java内部类的实现原理与可能的内存泄漏说明 在使用java内部类的时候要注意可能引起的内存泄漏代码如下packagecom.example;publicclassMyClass{publicstaticvoidmain(String[]args)throwsThrowable{}publicclassA{publicvoidmethed1(){}}publicstaticclassB{publicvoidmethed1(){}}编译生成了如下文件反编译MyClass反编译MyClassA反编译GlassB从反编译的结果可以知道,内部类的实现其实是通过编译器的语法糖实现的,通过生成... 继续阅读 >
202010-10 Java优先队列(PriorityQueue)重写compare操作 wecancustomminheapormaxheapbyoverridethemethodcompare.packagemyapp.kit.quickstart.utils;importjava.util.Comparator;importjava.util.Queue;/***priorityqueue(heap)demo.**@authorhuangdingsheng*@version1.0,2020/5/8*/publicclassPriorityQueue{publicstaticvoidmain(String[]args){//minheap,processcustomdatastructQueue<Node>minHeap=newjava.util.Pr... 继续阅读 >
202010-10 Java map 优雅的元素遍历方式说明 Java8,Lambda+foreach语法糖,写起来非常的cleanpublicstaticvoidmain(String[]args){//mapinitMap<String,String>map=newHashMap<>();map.put("k","v");/*=====处理函数只有单条语句=====*/map.forEach((k,v)->System.out.println(k+v));/*=====处理函数有多个步骤=======*/map.forEach((k,v)->{System.out.println(111);System.out.println(k+v);}... 继续阅读 >
202010-10 解决JAVA非对称加密不同系统加密结果不一致的问题 最近在做一个项目,需要用到非对称加密,但是出现一个很诡异的情况,本地开发环境是Windows环境,测试环境是Linux环境,出现一个问题,那就是本地环境与开发环境同一个私钥字符串加密加密同一个信息,得到的加密结果不一样。经过查询网络得知,这是由于填充的规则不同导致。原来的加密的部分代码byte[]keyBytes=Base64.decodeBase64(privateKey);PKCS8EncodedKeySpecpkcs8KeySpec=newPKCS8EncodedKeySpec(keyBytes);KeyFac... 继续阅读 >
202010-10 解决对接JAVA SM2加密遇到的坑 遇到有接口需要使用国密的SM2算法,对方使用的是JAVA,我们使用的是go,原以为都是标准算法不会有什么大问题,结果巨坑无法..对方使用的加密模块,SM2.java和SM2KeyPairs.java,不知道最初是谁开发的,网上貌似很多都是这个版本的实现,但是和go的交互总是有问题,用这个java模块加密的,go里面怎么也无法正确解密。仔细核对之后发现,这个java模块有几个地方并不符合GB/T32891的标准。SM2加密的流程SM2使用的椭圆曲线基点记为G,... 继续阅读 >
202010-10 Java读取OpenSSL生成的PEM公钥文件操作 JDK8的JCE是不支持读取PEM文件的。需要使用bouncycastle。项目需求,使用SHA1WithRSA算法,对接口数据做签名。代码如下:@ServiceclassSignService{privatestaticLoggerLOG=LoggerFactory.getLogger(SignService.class);@AutowiredprivateConfigconfig;privateSignaturesignature;@PostConstructprivatevoidinit(){try{PKCS8EncodedKeySpecpriKeySpec=newPKCS8EncodedKeySpec(getDecoder().dec... 继续阅读 >
202010-10 Java 并行数据处理和性能分析 并行流并行流是一个把元素分成多个块的流,每个块用不同的线程处理。可以自动分区,让所有的处理器都忙起来。假设要写一个方法,接受一个数量n做参数,计算1-n的和。可以这样实现:publiclongsequentialSum(longn){returnStream.iterate(1L,i->i+1).limit(n).reduce(0L,Long::sum);}也许可以使用parallel方法,简单地使用并行计算,提高程序性能:publiclongsequentialSum(longn){re... 继续阅读 >
202010-10 java 一个类实现两个接口的案例 直接用英文逗号分隔就可以了,比如:inerfaceIHello{StringsayHello(Stringname);}interfaceIHi{StringsayHi(Stringname);}classServiceImplimplementsIHello,IHi{//实现三个四个。。。n个接口都是使用逗号分隔publicStringsayHello(Stringname){return"Hello,"+name;}publicStringsayHi(Stringname){return"Hi,"+name;}}补充知识:Java一个类实现的多个接口,有相同签名的default方... 继续阅读 >
202010-10 Java接口操作(继承父类并实现多个接口) /*使用接口的时候,需要注意:1.接口是没有静态代码块或者构造方法的。2.一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。格式:publicclassMyInterfaceImplimplementsMyInterfaceA,MyInterfaceB{//覆盖重写所有抽象方法}3.如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。A接口packagecn.itcast.day10.demo02;publicinterfaceMyInterfaceA{//错误写法!接口... 继续阅读 >
202010-10 Java形参和实参的实例之Integer类型与Int类型用法说明 经常会有这样一道面试题,有两个整形变量分别是a=1,b=2。编写一个方法swap互换他们的值。 class Main { public static void main ( String [] args ) { Integer a = 1 ; ... 继续阅读 >
202010-10 Java父类继承中的static和final用法 1、父类中staitic修饰的静态方法,不能覆盖、不能继承。2、父类中staitic修饰的变量或常量,能覆盖、不能继承。static修饰的变量和方法,只属于类本身,不属于对象;当声明一个对象时,并不产生static变量和方法的拷贝。也就是说,用static修饰的变量和方法在类加载的时候,会分配一块存储空间,所有此类的对象都可以操控此块存储空间;注意:当子类没有与父类同名的static变量(或方法时),子类的对象也可操控这块内存空间。但是... 继续阅读 >
202010-10 聊聊Java 成员变量赋值和构造方法谁先执行的问题 对于这个问题应该用JVM的工作步骤来解释,首先看如下代码classX{Yb=newY();X(){System.out.print("X");}}classY{Y(){System.out.print("Y");}}publicclassZextendsX{Yy=newY();Z(){System.out.print("Z");}publicstaticvoidmain(String[]args){newZ();//结果是YXYZ}}这段代码的执行过程如下:1.在栈内存定义变量此时为初始值,定义方法。基本数据类型为0,引用数据类型为nu... 继续阅读 >
202010-10 浅谈Java方法调用的优先级问题 实现Java多态性的时候,关于方法调用的优先级:我们这样假设下,super(超类)、this(当前类对象)、show(方法)、object(对象),方法调用优先顺序:①this.show(object)>②super.show(object)>③this.show((super)object)>④super.show((super)object)先看以下代码classParentCls{publicStringshow(ChildAobj){return"ParentandChildA";}publicStringshow(ParentClsobj){return"Parent";}}然后写... 继续阅读 >
202010-10 Java JTable 实现日历的示例 效果图:主要思想:日历最核心的功能就是能显示某年某月对应的日期和星期几。因此只要实现传入具体的年份和月份,得到一组存放了日期的数组a[]即可。其中数组的大小设置成42,要考虑的问题是当月的第一天对应星期几。日期数组中的前七个,肯定包含了当月的第一天,把这一天找到,将“1”填入,后面的日期依次累加直到加完该月最后一天为止。MyCalendar类:得到用于显示日期数组a[]importjava.util.Calendar;publicclassMyCalen... 继续阅读 >
202010-10 java 各种数据类型的互相转换实例代码 StringBuilder转化为StringStringstr="abcdefghijklmnopqrs";StringBuilderstb=newStringBuilder(str);整型数组转化为字符串StringBuilders=newStringBuilder();for(i=1;i<=n;i++){s.append(String.valueOf(a[i]));}Stringstr=""+s;字符串转化为整形数组Stringstr="123456";int[]a=newint[str.length()];for(inti=0;i<str.length();i++){a[i]=str.charAt(i)-'0';}字符串转化为字符数组Stringstr="... 继续阅读 >
202010-10 java和jsp之间的request传值方法 一:前=>后上图为jsp前端代码点击提交按钮后,通过form表单里面action(路劲,Enter)传递给名为Enter的java后端,则后端通过jsp中的表单,取到name为id(随意命名,id)的值下图为java取值代码二:后=>前上图为后端代码,java通过request.setAttribute("命名",值),将“账号或密码错误”这几个字存到request里,在通过第二排代码的跳转页面将这几个字传递回“Enter.jsp”jsp页面,其后的代码不用在意,跳转时必要的,照搬就好。提示... 继续阅读 >