Java杂录

  • 判断是否为空时可以用一些工具类以保证结果的准确性
  • list 集合存放的是对象地址,在 add 对象时要注意
  • 自动装箱和自动拆箱只发生在编译阶段,目的是为了少写代码。
  • 装箱和拆箱会影响代码的执行效率,因为编译后的class代码是严格区分基本类型和引用类型的。并且,自动拆箱执行时可能会报NullPointerException
  • 所有的包装类型都是不变类
  • Integer.valueOf()就是静态工厂方法,它尽可能地返回缓存的实例以节省内存。 创建新对象时,优先选用静态工厂方法而不是new操作符。
  • 所有的整数和浮点数的包装类型都继承自Number,因此,可以非常方便地直接通过包装类型获取各种基本类型
  • 使用Introspector.getBeanInfo(xx.class)可以获取属性列表。
  • Java使用enum定义枚举类型,它被编译器编译为final class Xxx extends Enum { … };通过name()获取常量定义的字符串,注意不要使用toString();enum的构造方法要声明为private,字段强烈建议声明为final;enum适合用在switch语句中。
  • BigInteger做运算的时候,只能使用实例方法,和long型整数运算比,BigInteger不会有范围限制,但缺点是速度比较慢。使用longValueExact()方法时,如果超出了long型的范围,会抛出ArithmeticExceptionBigIntegerIntegerLong一样,也是不可变类,并且也继承自Number类。可以把BigInteger转换成基本类型。如果BigInteger表示的范围超过了基本类型的范围,转换时将丢失高位信息,即结果不一定是准确的。如果需要准确地转换成基本类型,可以使用intValueExact()longValueExact()等方法,在转换时如果超出范围,将直接抛出ArithmeticException异常。
  • 需要使用安全随机数的时候,必须使用SecureRandom,绝不能使用Random
  • 调用printStackTrace()可以打印异常的传播栈,对于调试非常有用;
  • 越早睡越困可能是生物钟不适应,需要调整一段时间,睡眠时间也不可过长
  • 使用类似<? extends Number>通配符作为方法参数时表示:方法内部可以调用获取Number引用的方法,例如:Number n = obj.getFirst();;方法内部无法调用传入Number引用的方法(null除外),例如:obj.setFirst(Number n);
  • 使用类似<T extends Number>定义泛型类时表示:泛型类型限定为Number以及Number的子类。
  • 何时使用extends,何时使用super?为了便于记忆,我们可以用PECS原则:Producer Extends Consumer Super。即:如果需要返回T,它是生产者(Producer),要使用extends通配符;如果需要写入T,它是消费者(Consumer),要使用super通配符。
  • Map可以通过for each遍历keySet(),也可以通过for each遍历entrySet(),直接获取key-value
  • 如果Map的key是enum类型,推荐使用EnumMap,既保证速度,也不浪费空间。
  • 读写Properties时,注意仅使用getProperty()setProperty()方法,不要调用继承而来的get()put()等方法。
  • Collections还提供了一组方法把可变集合封装成不可变集合。如果我们希望把一个可变List封装成不可变List,那么,返回不可变List后,最好立刻扔掉可变List的引用,这样可以保证后续操作不会意外改变原始对象,从而造成“不可变”List变化了:
  • try ... finally来编写关闭资源代码会感觉比较复杂,更好的写法是利用Java 7引入的新的try(resource)的语法,只需要编写try语句,让编译器自动为我们关闭资源。如:try (InputStream input = new FileInputStream("src/readme.txt")) {...}。实际上,编译器并不会特别地为InputStream加上自动关闭。编译器只看try(resource = ...)中的对象是否实现了java.lang.AutoCloseable接口,如果实现了,就自动加上finally语句并调用close()方法。InputStreamOutputStream都实现了这个接口,因此,都可以用在try(resource)中。
  • URL编码和Base64编码都是编码算法,它们不是加密算法;URL编码的目的是把任意文本数据编码为%前缀表示的文本,便于浏览器和服务器处理;Base64编码的目的是把任意二进制数据编码为文本,但编码后数据量会增加1/3
  • 用哈希存储口令时要考虑彩虹表攻击,可以加盐(salt)。(MD5因为输出长度较短,短时间内破解是可能的,目前已经不推荐使用
  • Java标准库的java.security包提供了一种标准机制,允许第三方提供商无缝接入。我们要使用BouncyCastle提供的RipeMD160算法,需要先把BouncyCastle注册一下:Security.addProvider(new BouncyCastleProvider());BouncyCastle是一个开源的第三方算法提供商;BouncyCastle提供了很多Java标准库没有提供的哈希算法和加密算法;
  • Hmac算法是一种标准的基于密钥的哈希算法,可以配合MD5SHA-1等哈希算法,计算的摘要长度和原摘要算法长度相同。
  • 数字签名就是用发送方的私钥对原始数据进行签名,只有用发送方公钥才能通过签名验证。数字签名用于:防止伪造、防止抵赖、检测篡改。常用的数字签名算法包括:MD5withRSASHA1withRSASHA256withRSASHA1withDSASHA256withDSASHA512withDSAECDSA等。
  • CompletableFuture可以指定异步处理流程:thenAccept()处理正常结果;exceptional()处理异常结果;thenApplyAsync()用于串行化另一个CompletableFutureanyOf()allOf()用于并行化多个CompletableFuture
  • Fork/Join线程池在Java标准库中就有应用。Java标准库提供的java.util.Arrays.parallelSort(array)可以进行并行排序,它的原理就是内部通过Fork/Join对大数组分拆进行并行排序,在多核CPU上就可以大大提高排序的速度。
  • ThreadLocal表示线程的“局部变量”,它确保每个线程的ThreadLocal变量都是各自独立的;使用ThreadLocal要用try ... finally结构,并在finally中清除。
  • 计算机网络:由两台或更多计算机组成的网络;互联网:连接网络的网络;IP地址:计算机的网络接口(通常是网卡)在网络中的唯一标识;网关:负责连接多个网络,并在多个网络之间转发数据的计算机,通常是路由器或交换机;网络协议:互联网使用TCP/IP协议,它泛指互联网协议簇;IP协议:一种分组交换传输协议;TCP协议:一种面向连接,可靠传输的协议;UDP协议:一种无连接,不可靠传输的协议。
  • SAX是一种流式解析XML的API;SAX通过事件触发,读取速度快,消耗内存少;调用方必须通过回调方法获得解析过程中的数据。使用Jackson解析XML,可以直接把XML解析为JavaBean,十分方便。
  • FunctionalInterface允许传入:1.接口的实现类(传统写法,代码较繁琐);2.Lambda表达式(只需列出参数名,由编译器推断类型);3.符合方法签名的静态方法;4.符合方法签名的实例方法(实例类型被看做第一个参数类型);5.符合方法签名的构造方法(实例类型被看做返回类型)。FunctionalInterface不强制继承关系,不需要方法名称相同,只要求方法参数(类型和数量)与方法返回类型相同,即认为方法签名相同。
  • List存储的每个元素都是已经存储在内存中的某个Java对象,而Stream输出的元素可能并没有预先存储在内存中,而是实时计算出来的。换句话说,List的用途是操作一组已存在的Java对象,而Stream实现的是惰性计算.
  • 创建Stream的方法有 :通过指定元素、指定数组、指定Collection创建Stream;通过Supplier创建Stream,可以是无限序列;通过其他类的相关方法创建。
  • 因为Java的范型不支持基本类型,所以我们无法用Stream<int>这样的类型,会发生编译错误。为了保存int,只能使用Stream<Integer>,但这样会产生频繁的装箱、拆箱操作。为了提高效率,Java标准库提供了IntStreamLongStreamDoubleStream这三种使用基本类型的Stream,它们的使用方法和范型Stream没有大的区别,设计这三个Stream的目的是提高运行效率
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值