精华内容
下载资源
问答
  • 二、深入分析transient关键字 为了更加深入的去分析transient关键字,我们需要带着几个问题去解读: (1)transient底层实现的原理是什么? (2)被transient关键字修饰过得变量真的不能被序列化嘛? (3)静态变量...

    这个关键字的作用其实我在写java的序列化机制中曾经写过,不过那时候只是简单地认识,只要其简单的用法,没有深入的去分析。这篇文章就是去深入分析一下transient关键字。

    先给出这篇文章的大致脉络

    首先,介绍了transient的基本概念和基本用法
    然后,介绍深入分析一下transient关键字,并介绍几个需要掌握的问题
    最后,来个总结

    一、初识transient关键字

    其实这个关键字的作用很好理解,就是简单的一句话:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。

    概念也很好理解,下面使用代码去验证一下:

    public 

    然后我们在Test中去验证一下:

    public 

    从上面可以看出,在序列化SerializeUser方法中,首先创建一个序列化user类,然后将其写入到G://Test/template路径中。在反序列化DeSerializeUser方法中,首先创建一个File,然后读取G://Test/template路径中的数据。

    这就是序列化和反序列化的基本实现,而且我们看一下结果,也就是被transient关键字修饰的age属性是否被序列化。

    6ea48c23b224511ba532b53419a9d161.png

    从上面的这张图可以看出,age属性变为了0,说明被transient关键字修饰之后没有被序列化。

    二、深入分析transient关键字

    为了更加深入的去分析transient关键字,我们需要带着几个问题去解读:

    (1)transient底层实现的原理是什么?

    (2)被transient关键字修饰过得变量真的不能被序列化嘛?

    (3)静态变量能被序列化吗?被transient关键字修饰之后呢?

    带着这些问题一个一个来解决:

    1、transient底层实现原理是什么?

    java的serialization提供了一个非常棒的存储对象状态的机制,说白了serialization就是把对象的状态存储到硬盘上 去,等需要的时候就可以再把它读出来使用。有些时候像银行卡号这些字段是不希望在网络上传输的,transient的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化,意思是transient修饰的age字段,他的生命周期仅仅在内存中,不会被写到磁盘中。

    2、被transient关键字修饰过得变量真的不能被序列化嘛?

    想要解决这个问题,首先还要再重提一下对象的序列化方式:

    Java序列化提供两种方式。

    • 一种是实现Serializable接口
    • 另一种是实现Exteranlizable接口。 需要重写writeExternal和readExternal方法,它的效率比Serializable高一些,并且可以决定哪些属性需要序列化(即使是transient修饰的),但是对大量对象,或者重复对象,则效率低。

    从上面的这两种序列化方式,我想你已经看到了,使用Exteranlizable接口实现序列化时,我们自己指定那些属性是需要序列化的,即使是transient修饰的。下面就验证一下

    首先我们定义User1类:这个类是被Externalizable接口修饰的

    public 

    然后我们就可以测试了

    public 

    上面,代码分了两个方法,一个是序列化,一个是反序列化。里面的代码和一开始给出的差不多,只不过,User1里面少了age这个属性。

    然后看一下结果:

    ae732e426bcabf6b638862cc550f5609.png

    结果基本上验证了我们的猜想,也就是说,实现了Externalizable接口,哪一个属性被序列化使我们手动去指定的,即使是transient关键字修饰也不起作用。

    3、静态变量能被序列化吗?没被transient关键字修饰之后呢?

    这个我可以提前先告诉结果,静态变量是不会被序列化的,即使没有transient关键字修饰。下面去验证一下,然后再解释原因。

    首先,在User类中对age属性添加transient关键字和static关键字修饰。

    然后,在Test类中去测试

    //序列化
    

    最后,测试一下,看看结果

    ceedf8a53884669b5a9aa887a598ebb1.png

    结果已经很明显了。现在解释一下,为什么会是这样,其实在前面已经提到过了。因为静态变量在全局区,本来流里面就没有写入静态变量,我打印静态变量当然会去全局区查找,而我们的序列化是写到磁盘上的,所以JVM查找这个静态变量的值,是从全局区查找的,而不是磁盘上。user.setAge(18);年龄改成18之后,被写到了全局区,其实就是方法区,只不过被所有的线程共享的一块空间。因此可以总结一句话:

    静态变量不管是不是transient关键字修饰,都不会被序列化

    三、transient关键字总结

    java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。像银行卡、密码等等这些数据。这个需要根据业务情况了。

    感谢大家支持

    最后还是给出我的维信公众号吧,谢谢关注,给新手一个支持

    0c1f853726f2f448f526b0ec68c91911.png
    展开全文
  • File file = new File("C:/Users/Admin/Desktop/images/snail.jpg...String fileStr = file.toString();System.out.println(fileStr);String outImg = fileStr.substring(0, fileStr.lastIndexOf("/")) ;System.out....

    c87822d18161adfc4eb6868dd00b7115.png

    File file = new File("C:/Users/Admin/Desktop/images/snail.jpg");
    String fileStr = file.toString();
    System.out.println(fileStr);
    String outImg = fileStr.substring(0, fileStr.lastIndexOf("/")) ;
    System.out.println(outImg);

    由于在操作时一直报错,java.lang.StringIndexOutOfBoundsException: String index out of range: -1,意思差不多就是下标越界,找不到 "/" 这个斜杆,最后将fileStr 打印出来才发现toString后是这样的 C:UsersAdminDesktopimagessnail.jpg,一个是正斜杆一个是反斜杆,肯定找不到。所以最后改成

    String outImg = fileStr.substring(0, fileStr.lastIndexOf(""))

    就没报错了

    查了写正反斜杆的区别:大概就是

    java中的路径一般用"/"

    windows中的路径用""

    linux,unix中的路径一般用"/"

    其中java中 "/"等同于""

    如:FileInputStream file=new FileInputStream("D:111.txt")

    FileInputStream file=new FileInputStream("D:/111.txt")

    展开全文
  • 1 Lombok背景介绍官方介绍如下:Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, ...大致意思是Lombok通过增加一些“处理程序”,可以让java变得简...

    1 Lombok背景介绍

    官方介绍如下:

    Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.

    大致意思是Lombok通过增加一些“处理程序”,可以让java变得简洁、快速。

    2 Lombok使用方法

    Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。

    Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些。

    Lombok的使用跟引用jar包一样,可以在官网(https://projectlombok.org/dow...)下载jar包,也可以使用maven添加依赖:

    org.projectlombok lombok 1.16.20provided

    接下来我们来分析Lombok中注解的具体用法。

    2.1 @Data

    @Data注解在类上,会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。

    2.2 @Getter/@Setter

    如果觉得@Data太过残暴(因为@Data集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor的所有特性)不够精细,可以使用@Getter/@Setter注解,此注解在属性上,可以为相应的属性自动生成Getter/Setter方法。

    2.3 @NonNull

    该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针。

    2.4 @Cleanup

    该注解能帮助我们自动调用close()方法,很大的简化了代码。

    示例如下:

    import lombok.Cleanup;import java.io.*;public class CleanupExample { public static void main(String[] args) throws IOException { @Cleanup InputStream in = new FileInputStream(args[0]); @Cleanup OutputStream out = new FileOutputStream(args[1]); byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; out.write(b, 0, r); } }}

    2.5 @EqualsAndHashCode

    默认情况下,会使用所有非静态(non-static)和非瞬态(non-transient)属性来生成equals和hasCode,也能通过exclude注解来排除一些属性。

    2.6 @ToString

    类使用@ToString注解,Lombok会生成一个toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。

    通过将includeFieldNames参数设为true,就能明确的输出toString()属性。这一点是不是有点绕口,通过代码来看会更清晰些。

    2.7 @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

    无参构造器、部分参数构造器、全参构造器。Lombok没法实现多种参数构造器的重载。

    3 Lombok工作原理分析

    会发现在Lombok使用的过程中,只需要添加相应的注解,无需再为此写任何代码。自动生成的代码到底是如何产生的呢?

    核心之处就是对于注解的解析上。JDK5引入了注解的同时,也提供了两种解析方式。

    运行时解析

    运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样就可以通过反射拿到该注解。java.lang,reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等都实现了该接口,对反射熟悉的朋友应该都会很熟悉这种解析方式。

    编译时解析

    编译时解析有两种机制,分别简单描述下:

    1)Annotation Processing Tool

    apt自JDK5产生,JDK7已标记为过期,不推荐使用,JDK8中已彻底删除,自JDK6开始,可以使用Pluggable Annotation Processing API来替换它,apt被替换主要有2点原因:

    • api都在com.sun.mirror非标准包下
    • 没有集成到javac中,需要额外运行

    2)Pluggable Annotation Processing API

    JSR 269自JDK6加入,作为apt的替代方案,它解决了apt的两个问题,javac在执行的时候会调用实现了该API的程序,这样我们就可以对编译器做一些增强,这时javac执行的过程如下:

    c88e44562d0382b19e231549e99e5974.png

    Lombok本质上就是一个实现了“JSR 269 API”的程序。在使用javac的过程中,它产生作用的具体流程如下:

    1. javac对源代码进行分析,生成了一棵抽象语法树(AST)
    2. 运行过程中调用实现了“JSR 269 API”的Lombok程序
    3. 此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点
    4. javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)

    拜读了Lombok源码,对应注解的实现都在HandleXXX中,比如@Getter注解的实现时HandleGetter.handle()。还有一些其它类库使用这种方式实现,比如Google Auto、Dagger等等。

    4. Lombok的优缺点

    优点:

    1. 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
    2. 让代码变得简洁,不用过多的去关注相应的方法
    3. 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等

    缺点:

    1. 不支持多种参数构造器的重载
    2. 虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度

    5. 总结

    Lombok虽然有很多优点,但Lombok更类似于一种IDE插件,项目也需要依赖相应的jar包。Lombok依赖jar包是因为编译时要用它的注解,为什么说它又类似插件?因为在使用时,eclipse或IntelliJ IDEA都需要安装相应的插件,在编译器编译时通过操作AST(抽象语法树)改变字节码生成,变向的就是说它在改变java语法。它不像spring的依赖注入或者mybatis的ORM一样是运行时的特性,而是编译时的特性。这里我个人最感觉不爽的地方就是对插件的依赖!因为Lombok只是省去了一些人工生成代码的麻烦,但IDE都有快捷键来协助生成getter/setter等方法,也非常方便。

    知乎上有位大神发表过对Lombok的一些看法:

    这是一种低级趣味的插件,不建议使用。JAVA发展到今天,各种插件层出不穷,如何甄别各种插件的优劣?能从架构上优化你的设计的,能提高应用程序性能的 ,实现高度封装可扩展的..., 像lombok这种,像这种插件,已经不仅仅是插件了,改变了你如何编写源码,事实上,少去了代码你写上去又如何? 如果JAVA家族到处充斥这样的东西,那只不过是一坨披着金属颜色的屎,迟早会被其它的语言取代。

    虽然话糙但理确实不糙,试想一个项目有非常多类似Lombok这样的插件,个人觉得真的会极大的降低阅读源代码的舒适度。

    虽然非常不建议在属性的getter/setter写一些业务代码,但在多年项目的实战中,有时通过给getter/setter加一点点业务代码,能极大的简化某些业务场景的代码。所谓取舍,也许就是这时的舍弃一定的规范,取得极大的方便。

    我现在非常坚信一条理念,任何编程语言或插件,都仅仅只是工具而已,即使工具再强大也在于用的人,就如同小米加步枪照样能赢飞机大炮的道理一样。结合具体业务场景和项目实际情况,无需一味追求高大上的技术,适合的才是王道。

    Lombok有它的得天独厚的优点,也有它避之不及的缺点,熟知其优缺点,在实战中灵活运用才是王道。

    de7f72ec08163bbb5b9148abb1eaaf5a.png

    转自:https://segmentfault.com/a/1190000020538816

    展开全文
  • ​zhuanlan.zhihu.com在逛 Stack Overflow 的时候,发现了一些访问量像‎安第斯山一样高的问题,比如说这个:打印 Java 数组最优雅的方式是什么?访问量足足有 220W+,想不到啊,这么简单的问题竟然有这么多程序员被...

    f5d527c875009950a498900626176c68.png
    一只Tom猫:终极手撕之架构大全:分布式+开源框架+微服务+性能优化,够不够?zhuanlan.zhihu.com
    5174eab105e5195618c768e552efa749.png

    在逛 Stack Overflow 的时候,发现了一些访问量像‎安第斯山一样高的问题,比如说这个:打印 Java 数组最优雅的方式是什么?访问量足足有 220W+,想不到啊,这么简单的问题竟然有这么多程序员被困扰过。

    一只Tom猫:手撕分布式技术:限流、通讯、缓存,全部一锅端走送给你!zhuanlan.zhihu.com
    3e45085e62d3fcb3cec350362d7e33a9.png

    来回顾一下提问者的问题吧:

    在 Java 中,数组虽然是一个对象,但并未明确的定义这样一个类,因此也就没有覆盖 toString() 方法的机会。如果尝试直接打印数组的话,输出的结果并不是我们预期的结果。那有没有一些简单可行的方式呢?

    如果大家也被这个问题困扰过,或者正在被困扰,就请随来,咱们肩并肩手拉手一起梳理一下这个问题,并找出最佳答案。Duang、Duang、Duang,打怪进阶喽!

    01、为什么不能直接打印

    很好奇,是不是,为什么不能直接使用 System.out.println() 等系列方法来打印数组?来看这样一个例子。

    String [] cmowers = {"沉","二","一枚有趣的程序员"};
    System.out.println(cmowers);

    程序打印的结果是:

    [Ljava.lang.String;@3d075dc0

    [Ljava.lang.String; 表示字符串数组的 Class 名,@ 后面的是十六进制的 hashCode——这样的打印结果太“人性化”了,一般人表示看不懂!为什么会这样显示呢?查看一下 java.lang.Object 类的 toString() 方法就明白了。

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    PS:数组虽然没有显式定义成一个类,但它的确是一个对象,继承了祖先类 Object 的所有方法。

    那为什么数组不单独定义一个类来表示呢?就像字符串 String 类那样呢?

    一个合理的解释是 Java 将其隐藏了。假如真的存在一个 Array.java,我们也可以假想它真实的样子,它必须要定义一个容器来存放数组的元素,就像 String 类那样。

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
    }

    但这样做真的有必要吗?为数组单独定义一个类,是不是有点画蛇添足的意味。

    02、使用 Stream

    如果使用的是 JDK8 以上的版本,我们可以使用 Stream 这种时髦、fashion 的方式来遍历数组,顺带将其打印出来。

    第一种:

    Arrays.asList(cmowers).stream().forEach(s -> System.out.println(s));

    第二种:

    Stream.of(cmowers).forEach(System.out::println);

    第三种:

    Arrays.stream(cmowers).forEach(System.out::println);

    打印的结果如下所示。

    沉
    二
    一枚有趣的程序员

    没错,这三种方式都可以轻松胜任本职工作,并且显得有点高大上,毕竟用到了 Stream,以及 lambda 表达式。但在我心目中,它们并不是最优雅的方式。

    03、使用 for 循环

    当然了,如果不喜欢 Stream 的方式,也可以使用 for 循环对数组进行变量顺便打印的方式,甚至 for-each 也行。

    for(int i = 0; i < cmowers.length; i++){
        System.out.println(cmowers[i]);
    }
    for (String s : cmowers) {
    System.out.println(s);
    }

    但如果你是一名有追求的程序员的话,不免觉得这样的方式有点 low。那到底最优雅的方式是什么呢?

    04、使用 Arrays.toString()

    Arrays.toString() 可以将任意类型的数组转成字符串,包括基本类型数组和引用类型数组,截个图大家感受一下。

    b6fe0869d0200ac57b562c9ce2bbcd9e.png

    Arrays 类就不用我多做介绍了吧?虽然我的意思大家懂,但我还是忍不住要废话两句:该类包含了各种操作数组的便捷方法,与其命名为 Arrays,不如命名为 ArrayUtil。

    使用 Arrays.toString() 方法来打印数组再优雅不过了,就像,就像,就像蒙娜丽莎的微笑。

    26f2133fedd95ecb1f07e6a2052fc544.png

    被逗笑了吧?来,怀揣着愉快的心情看一下代码示例。

    String [] cmowers = {"沉","二","一枚有趣的程序员"};
    System.out.println(Arrays.toString(cmowers));

    程序打印结果:

    [沉, 二, 一枚有趣的程序员]

    哇,打印格式不要太完美,不多不少!完全是我们预期的结果:[] 表明是一个数组,, 点和空格用来分割元素。

    顺便再来看一下 toString() 方法的源码。

    public static String toString(Object[] a) {
        if (a == null)
            return "null";
        int iMax = a.length - 1;
        if (iMax == -1)
            return "[]";
        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(String.valueOf(a[i]));
            if (i == iMax)
                return b.append(']').toString();
            b.append(", ");
        }
    }

    1)如果数组为 null,那就返回“null”字符串,考虑很周全,省去了 NullPointerException 的麻烦。

    2)如果数组长度为 0,那就返回“[]”字符串。注意,此处没有使用 a.length == 0 进行判空,而是用了 a.length - 1 == -1,又为之后的 for 循环中的 i == iMax 埋下了伏笔,资源一点也没有浪费。

    3)for 循环中字符串的拼接更是巧妙,for 循环的条件中没有判断 i < a.length,而在循环体内使用了 i == iMax,这样有什么好处呢?

    通常来说,一般的程序员拼接字符串的时候是这样做的。

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; i < cmowers.length; i++) {
        b.append(cmowers[i]);
        b.append(", ");
    }
    b.delete(b.length()-2, b.length());
    b.append(']');

    没错吧,非常的循规蹈矩,但比起 toString() 方法源码中的写法,就要相形见绌了。情不自禁地感慨一下啊:要想成为一名卓越的程序员,而不只是一名普通的程序员,最快的捷径就是学习 Java 的源码

    05、使用 Arrays.deepToString()

    如果需要打印多维码数组的话,Arrays.toString() 就无能为力了。

    String[][] deepArray = new String[][] {{"沉", "二"}, {"一枚有趣的程序员"}};
    System.out.println(Arrays.toString(deepArray));

    打印结果如下所示。

    [[Ljava.lang.String;@7ba4f24f, [Ljava.lang.String;@3b9a45b3]

    不不不,这不是我们期望的结果,怎么办呢?使用 Arrays.deepToString(),专为多维数组而生。

    String[][] deepArray = new String[][] {{"沉", "二"}, {"一枚有趣的程序员"}};
    System.out.println(Arrays.deepToString(deepArray));

    打印结果如下所示。

    [[沉, 二], [一枚有趣的程序员]]

    优秀吧!至于 deepToString() 的源码,本文就不再分析了,大家感兴趣的话自己看一看。(如果你想卓越的话,必须要看啊)

    作者:沉默王二
    原文链接:https://juejin.im/post/5e042ba5518825127324b275
    展开全文
  • 在逛 Stack Overflow 的时候,发现了一些访问量像‎安第斯山一样高的问题,比如说这个:打印 Java 数组最优雅的方式是什么?访问量足足有 220W+,想不到啊,这么简单的问题竟然有这么多程序员被困扰过。来回顾一下...
  • toString()Object的方法,因为所有类都默认继承了Object类,所以也e68a84e8a2ad62616964757a686964616f31333436316338都具有toString()方法,但是并不是通常想要的功能。举个例子:你定义了一个类Person如下:...
  • 因为String.prototype重写了toString方法,所以调用字符串的toString时,调用的String.prototype的,不是Object.prototype的。 'abc'.__proto__ === String.prototype; // true 'abc'.__proto__.__proto__ === ...
  • ToString()转化为字符串的方法 Trim()去两边空格的方法 把StringBuffer转换成String类型时 没有用.trim()会导致意想不到的结果-- 用if语句判断时跟想的不一样 if(returnStrnull||returnStr”“){//没有.trim()...
  • 一个以0.1纳秒为单位的时间戳, 就是一个long型的数, 其实DateTime本质上就是一个long型的,通过0.1纳秒的单位,换算成各种时间,如果分,秒,年月日等等这些组合起来就是一个DateTime类型了
  • a[i]表示一维数组的一个数据,使用toString()方法转换为string字符串类型; trim()表示字符串去掉空格; 如果a[i].toString().trim().equals(" ")则表示与空格进行比较,看字符串是否为空.
  • 一个以0.1纳秒为单位的时间戳,就是一个long型的数,其实DateTime本质上就是一个long型的,通过0.1纳秒的单位,换算成各种时间,如果分,秒,年月日等等这些组合起来就是一个DateTime类型了 =======================...
  • for in循环模式。循环遍历{toString}这个对象中的属性,循环时属性赋给P这个变量。 语法: 1 2 3 4 5 6 ...for(varpin{toString});...1)p变量 ...2){toString}对象 3)后面的;{...
  • 新建一个GUID实例 自定义格式字符串“b”传递给该实例的 ToString 方法, 则 Convert.ToString 的重载返回该实例的值的二进制(基 2)字符串表示形式 Guid.NewGuid.ToString("n") ="4546a166b64746f784099789ec8f...
  • 数制中 权位 意思:   权:在数学/数据结构等学科中都有相关联定义:指定系列位置上的数据所代表数值大小; 比如:在十进制实数中,个位上的数字1表示的权值就是1;而百位上的1权值100;当然在百分位的1就是...
  • 除非你需要用到@override意思是什么? 有什么用?JAVA中 @Override 的作用如果想重写父类的方法,比如toString()方法的话,在方法前面加上@Override 系统可以帮你检查方法的正确性,@Overridepublic String toString()...
  • }//这段代码的作用是什么?*/ public static void main(String[] args) { Scanner sc=new Scanner(System.in); int m = sc.nextInt(); int d = sc.nextInt(); int y = sc.nextInt(); try { ...
  • 什么是session,,@(Session["UserID"])是什么意思,,为什么就直接得到id了,,,,session的用法 public ActionResult Manage() { try { if (Session["UserID"].ToString() != null) return View(); else ...
  • Element set = set(StringUtils.isBlank(bean.getYear()) ? "未知年份" : bean.getYear(), bean.getAmount().toString()) 这句是什么意思
  • ``` public class ToStringTest { static int i =1; public static void main(String[] args){ System.out.println(... public String toString(){ System.out.println("I "); return "java "; } } ```
  • httpURLConnection.addRequestProperty("Host", stringBuilder.toString()); if (httpURLConnection.getResponseCode() != 200) return null; InputStream inputStream = httpURLConnection.getInputStream(); ...
  • Double.parseDouble()是什么意思

    千次阅读 2019-10-29 09:51:45
    Double.parseDouble()的使用 用Double.parseDouble()把括号里面内容变成double...例如:Double overdueMoney = Double.parseDouble(map.get(“overdue_money”).toString()); 如果要变成int,则用Integer.pars...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 193
精华内容 77
关键字:

tostring是什么意思