java学习(六)
文章目录
java基础类库(部分)
String、StringBuffer、StringBuilder类
String类是不可变类,即一旦创建,这个对象中的字符串无法更改StringBuffer类代表字符串可变的对象。StringBuilder和StringBuffer基本相似,但后者是线程安全的,前者性能略高。
补充:char和byte的区别
byte是字节数据类型 ,是有符号型的,占1 个字节;大小范围为-128—127 。char是字符数据类型 ,是无符号型的,占2字节(Unicode码 ),大小范围 是0—65535 ,char是一个16位二进制的Unicode字符,JAVA用char来表示一个字符 ,char可以表示中文字符。char、byte、int对于英文字符,可以相互转化
BigDecimal类
创建BigDecimal类对象时,一定要使用String类对象作为构造器参数,如果用浮点数类型则会出现不精确的值。
Java日期、时间
java.util包下的Date、Calender类,存在设计缺陷且难用,官方已不建议使用,因此Java8新增了java.time包。
java集合
-
主要由两个接口派生而出:
Collection和MapCollection主要派生的接口有:Set(数学概念上的集合)、Queue、List(类似数组)。Map主要派生的有:xxxMap(键值对)。内部存储的对象均是对象的引用,如果用外部引用变量修改对象的值,那么集合中的值也会改变。
-
lambda表达式遍历的原理
Java8 的
Iterable接口(Collection接口的父接口)增加了一个foreach(Consumer action)默认方法,这个方法的参数是个Consumer类对象,而Consumer类实际上是个函数式接口,因此可以通过Collection类对象直接调用foreach方法,并传入一个lambda表达式来遍历集合中的对象。 -
Iterator接口注意:和
Iterable接口完全不同四种方法:
boolean hasNext();Object next();void remove();删除集合中上一次next返回的元素,这是在迭代时修改集合元素的唯一可用的办法,使用Iterator访问Collection集合的元素时,不能用其他任何方法改变其中的元素,否则会引发异常。void forEachRemaining(Consumer action);用于遍历集合元素,但在遍历过程中并没有生成集合元素的副本,而是直接操作集合内的元素,可以传入lambda表达式;和Java5提供的foreach循环不同,foreach循环只能读取迭代的值,不能够去修改值。 -
Predicate操作Predicate是函数式接口,但其接收的对象是谓词,即为true或者false,故返回值只能是这两个之一。 -
Stream编程语法糖,减少代码量,有写脚本的感觉。
-
==、equals()与hashCode()
==仅当两个变量的内存地址完全相同返回true;equals()仅当两个变量的内容相同,返回true;hashCode():以 java.lang.Object来理解,JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做Object的比较或者取这个对象的时候,它会依据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。对哈希冲突的处理类似于数据库对溢出桶的处理,会放在同一个hash链表中,但此时只能依据equals方法来比较了。Object.hashCode不能够代表内存地址当使用hash容器的时候,若使用自定义的类,则必须同时改写
equals()方法和hashCode()方法,因为像HashSet类这样的类,比较两个对象是否相同是基于equals和hashCode的。 -
Set
-
HashSet
- 元素无序
- 多线程同步需要开发人员自主实现
- 集合元素值可以是
null - 基于equals和hashCode方法来判断对象是否相同,当hashCode相同时,会调用equals方法,此时查询效率降低
- 效率高
-
TreeSet
-
实现了SortedSet接口,内部元素有序
-
自定义排序
可以自己重写传入对象的
compareTo(Object obj)方法,从而达到自定义排序的目的可以自己实现
TreeSet的Comparator接口,自定义TreeSet的排序方式
-
-
EnumSet
主要是针对
enum枚举类型的操作
-
-
List
-
List判断对象是否相等仅仅基于equals方法; -
List提供了listIterator()方法,该方法返回ListIterator对象,这个对象继承了Iterator接口,额外增加了反向迭代和在指定位置插入元素的功能。 -
ArrayList和Vector类这两个类是基于
Object[]数组实现的List类,使用initialCapacity参数设置数组长度,增加元素时,该参数会自动增加,当批量添加时,使用ensureCapacity(int minCapacity)方法(使Object[]长度增加大于等于minCapacity的值)可以指定initialCapacity大小,提高效率;也可以用trimToSize()将容器大小减小到当前元素个数以节省存储空间。Vector类有很多缺点,也比较古老和混乱,完全可以用ArrayList类替代它。(ArrayList是线程不安全的,但可以用Collections类解决这个问题)此外,
Stack作为Vector的子类,也可以用ArrayDeque替代。 -
Arrays工具类提供的asList方法能够将数组或指定个数的对象转换成Arrays.ArrayList内部类对象,不支持任何要更改该集合长度的操作,只能遍历访问。
-
-
Queue
除了FIFO的原始类型以外,还提供
Deque接口,通过这个接口可以实现栈式LIFO,典型代表是ArrayDeque类;还有PriorityQueue类,可用于实现大根堆和小根堆,其自定义排序方式和TreeSet基本相同。LinkedList也实现了Deque接口,既能当成双端队列使用,也能当作栈来使用,但他是基于链表实现的,随机访问的性能较差。
-
Map
HashMap是Hashtable的替代品,前者线程不安全,后者线程安全,但后者过时了。HashMap只允许一个key为null,因为他的key不可重复,value则无限制。HashMap和Hashtable都是基于equals方法来判断value是否相等的;但判断key是否相等则是同时要看元素的equals和hashCode()Properties相当于一个key、value都是String类型的Map,专门用于文件读写TreeMap,类似于TreeSet,基于红黑树实现WeakHashMap,主要区别是其内部保留的是对实际对象的弱引用,如果其key的引用对象没有任何强引用,则可能会被垃圾回收,并被容器自动删除IdentityHashMap和普通HashMap的区别在于,其比较两个key是否相等时,它不采用equals和hashCode,而是直接采用==严格相等来判断。EnumMap,根据enum枚举类来创建对象(以enum类的值作为keySet),但不允许key是null
-
有关Hash容器中的可变元素的修改
如果修改Hash容器中的可变元素的值(key),会导致索引错乱,而且只能对没有被修改过的键值对进行操作。
原因如下:
HashMap底层是使用
Entry对象数组存储的,而Entry是一个单项的链表。当调用一个put()方法将一个键值对添加进来时,先使用hash()函数获取该对象的hash值,然后调用indexFor方法查找到该对象在数组中应该存储的下标,假如该位置为空,就将value值插入,如果该下标出不为空,则要遍历该下标上面的对象,使用equals()方法进行判断,如果遇到equals()方法返回真的则进行替换,否则将其插入。查找时只需要查询通过key值获取获取hash值,然后找到其下标,遍历该下标下面的Entry对象即可查找到value。可见,当向hash容器中添加元素的时候就会先计算好不变的hash索引了,所以再修改已有的元素一定会导致找不到。
-
HashSet和HashMap的性能考虑
负载因子=size/capacity,负载极限(0~1),负载因子到达负载极限(默认值是0.75)时,hash表会自动程碑增长,重新分配对象,进行再哈希,应该避免这种情况的发生,负载极限0.75的取值是查询性能和内存开销的折中。
-
Collections工具类
-
实现多线程安全
public class SynchronizedTest { public static void main(String[] args) { Collection c = Collections.synchronizedCollection(new ArrayList()); List list = Collections.synchronizedCollection(new ArrayList()); Set s = Collections.synchronizedCollection(new HashSet()); Map m = Collections.synchronizedCollection(new HashMap()); } } -
生成只读集合
emptyXxx()返回空对象(List、SortedSet、Set、Map、SortedMap等)singletonXxx(p)返回仅含一个元素的对象(List或Map)unmodifiableXxx(p)返回指定集合对象的不可变视图(List、SortedSet、Set、Map、SortedMap等)
-
Java核心类库精讲

被折叠的 条评论
为什么被折叠?



