- 在
判断是否为空
时可以用一些工具类
以保证结果的准确性 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
型的范围,会抛出ArithmeticException
。BigInteger
和Integer
、Long
一样,也是不可变类,并且也继承自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()
方法。InputStream
和OutputStream
都实现了这个接口,因此,都可以用在try(resource)
中。 URL
编码和Base64
编码都是编码算法,它们不是加密算法;URL
编码的目的是把任意文本数据编码为%
前缀表示的文本,便于浏览器和服务器处理;Base64
编码的目的是把任意二进制数据编码为文本,但编码后数据量会增加1/3
。- 用哈希存储口令时要考虑彩虹表攻击,可以加盐(
salt
)。(MD5因为输出长度较短,短时间内破解是可能的,目前已经不推荐使用
) - Java标准库的
java.security
包提供了一种标准机制,允许第三方提供商无缝接入。我们要使用BouncyCastle
提供的RipeMD160
算法,需要先把BouncyCastle
注册一下:Security.addProvider(new BouncyCastleProvider());
。BouncyCastle
是一个开源的第三方算法提供商;BouncyCastle
提供了很多Java标准库没有提供的哈希算法和加密算法; Hmac
算法是一种标准的基于密钥的哈希算法,可以配合MD5
、SHA-1
等哈希算法,计算的摘要长度和原摘要算法长度相同。- 数字签名就是用发送方的私钥对原始数据进行签名,只有用发送方公钥才能通过签名验证。数字签名用于:防止伪造、防止抵赖、检测篡改。常用的数字签名算法包括:
MD5withRSA
/SHA1withRSA
/SHA256withRSA
/SHA1withDSA
/SHA256withDSA
/SHA512withDSA
/ECDSA
等。 CompletableFuture
可以指定异步处理流程:thenAccept()
处理正常结果;exceptional()
处理异常结果;thenApplyAsync()
用于串行化另一个CompletableFuture
;anyOf()
和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标准库提供了IntStream
、LongStream
和DoubleStream
这三种使用基本类型的Stream
,它们的使用方法和范型Stream
没有大的区别,设计这三个Stream
的目的是提高运行效率
Java杂录
最新推荐文章于 2024-05-01 18:35:46 发布