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
和Map
Collection
主要派生的接口有: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
等)
-