学习内容:java程序的参数,程序运行过程中接收用户输入,System类Runtime类的相关用法,Object和Objects类,使用String、StringBuffer、StringBuilder类,Math类进行数学计算,BigDecimal保存精确浮点数,使用Random类生成各种伪随机数,Date、Calendar的用法及之间的联系,java8新增的日期、时间API的功能和用法,创建正则表达式,使用正则表达式以及程序国际化的思路
学习笔记:
1、Object类的clone()方法虽然简单易用,但它只是一种浅克隆----它只是克隆该对象的所有成员变量值,不会对引用类型的成员变量值所引用的对象进行克隆。
2、两个Random对象的种子相同,而且方法的调用顺序也相同,它们就会产生相同的数字序列,也就是说,Random产生的数字并不是真正随机的,而是一种伪随机。为了避免两个Random对象产生相同的数字序列,通常推荐使用当前时间作为Random对象的种子。
3、创建BigDecimal对象时,不要使用浮点数作为构造器的参数,否则同样会发生精度丢失的问题。
学习内容:集合的概念和作用,使用Lambda表达式遍历集合,Collection集合的常规用法,使用Predicate操作集合,使用Iterator和foreach遍历集合,Set、LIst、Deque、Map的用法,固定长度的List集合,Hash算法对性能的影响,Collections工具类的用法,java的集合体系
学习笔记:
1、集合类和数组不一样数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象。
2、对于Set 、List、 Queue 、Map四中集合,最常用的是HashSet LinkedHashSet TreeSet EnumSet ArrayList LinkedList ArrayDeque HashMap LinkedHashMap TreeMap EnumMap等实现类。
3、当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只用通过Iterator的remove()方法删除上一次next()方法返回的集合元素才可以,否则将会引发异常。
4、独立使用Stream的步骤如下:①使用Stream或者XXXStream的builder()类方法创建该Stream对应的Builder。②重复使用Builder的add()方法向该流中添加多个元素。③调用Builder的build()方法获取对应的Stream。④调用Stream的聚集方法。
5、HashSet具有以下特点。①不能保证元素的排列顺序,顺序可能和添加顺序不同,顺序也有可能发生改变。②HashSet不是同步的,如果多个线程同时访问一个HashSet,则必须通过代码保证其同步。③集合元素值可以使null.
6、HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且对象的HashCode()方法返回值也相等。
7、如果需要把某个类的对象保存到HashSet集合中,重写这个类的equals()方法和hashCode()方法时,应该尽量保证两个对象通过equals()方法比较返回true时,它们的hashCode()方法返回值也相等。
8、hashCode()方法的基本规则:①在程序运行过程中,同一个对象多次调用hashCode()方法应该返回相同的值。②当两个对象通过equals()方法比较返回true时,这两个对象的hashCode()方法应返回相同的值。③对象中用作equals()方法比较标准的实例变量,都应该用于计算hashCode值。hashCode值可以乘以任意一个质数后再相加。
9、虽然LinkedHashSet使用了链表记录集合元素的添加顺序,但它依然是HashSet,因此依然不允许集合元素重复。
10、向TreeSet集合中添加元素时,只有第一个元素无需实现Comparable接口,后面添加的所有元素都必须实现Comparable接口。
11、EnumSet在内部以位向量的形式存储,这种存储形式非常的紧凑、高效,因此EnumSet对象占用内存很小,而且运行效率很好。
12、当试图复制一个Collection集合里的元素来创建EnumSet集合时,必须保证Collection集合里的所有元素都是同一个枚举类的枚举值。
13、List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。
14、当调用List的set方法;来改变指定索引处的元素时,指定的索引必须是List集合的有效索引。set方法不会概念List集合的长度。
15、ArrayList和Vector的显著区别是:ArrayList是线程不安全的,当多个线程访问同一个ArrayList集合时,如果有超过一个线程修改了集合,则程序必须手动保证集合的同步性;但Vector是线程安全的,无须程序保证该集合的同步性。
16、ArrayList和ArrayDeque两个集合类的实现机制基本类似,它们的底层都采用一个动态的、可分配的Object[]数组来储存元素,当集合元素超出了该数组容量时,系统会在底层重新分配一个Object[]数组来储存集合元素。
17、对于所有的内部基于数组的集合实现,使用随机访问的性能比使用Iterator迭代访问的性能要好,因为随机访问会被映射成对数组元素的访问。
18、关于List集合的建议。①如果需要遍历List集合元素,应该使用随机访问方法来遍历集合元素,这样性能更好,对于LinkedList应该采用Iterator迭代器来遍历集合元素。②如果需要经常执行插入、删除操作来改变包含大量数据的List集合的大小,可使用LinkedList集合。③如果有多个线程同时访问List集合中的元素,开发者可考虑使用Collections将集合包装成线程安全的集合。
19、如果需要使用WeakHashMap的key来保留对象的弱引用,则不要让该key所引用的对象具有任何强引用,否则将失去使用WeakHashMap的意义。
20、EnumMap具有如下特征:①EnumMap在内部以数组形式保存,所以这种实现方式非常紧凑、高效。②EnumMap根据key的自然顺序来维护k-v对的顺序。③EnumMap不允许使用null作为key,但允许使用null作为value。如果试图使用null作为key时将会抛出异常。如果只是检查是否包含null的key,或者删除null的key,都不会抛出异常。
21、Collections类中提供了多个synchronizedXXX()方法,该方法可以将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。