Java学习(六)

java学习(六)

java基础类库(部分)

String、StringBuffer、StringBuilder类

  1. String类是不可变类,即一旦创建,这个对象中的字符串无法更改
  2. StringBuffer类代表字符串可变的对象。
  3. StringBuilderStringBuffer基本相似,但后者是线程安全的,前者性能略高。

补充:char和byte的区别

  1. byte 是字节数据类型 ,是有符号型的,占1 个字节;大小范围为-128—127 。
  2. char 是字符数据类型 ,是无符号型的,占2字节(Unicode码 ),大小范围 是0—65535 ,char是一个16位二进制的Unicode字符,JAVA用char来表示一个字符 ,char可以表示中文字符。
  3. charbyteint对于英文字符,可以相互转化

BigDecimal类

创建BigDecimal类对象时,一定要使用String类对象作为构造器参数,如果用浮点数类型则会出现不精确的值。

Java日期、时间

java.util包下的DateCalender类,存在设计缺陷且难用,官方已不建议使用,因此Java8新增了java.time包。

java集合

  1. 主要由两个接口派生而出:CollectionMap

    Collection主要派生的接口有:Set(数学概念上的集合)、QueueList(类似数组)。

    Map主要派生的有:xxxMap(键值对)。

    内部存储的对象均是对象的引用,如果用外部引用变量修改对象的值,那么集合中的值也会改变。

  2. lambda表达式遍历的原理

    Java8 的Iterable接口(Collection接口的父接口)增加了一个foreach(Consumer action)默认方法,这个方法的参数是个Consumer类对象,而Consumer类实际上是个函数式接口,因此可以通过Collection类对象直接调用foreach方法,并传入一个lambda表达式来遍历集合中的对象。

  3. Iterator接口

    注意:和Iterable接口完全不同

    四种方法:

    boolean hasNext();

    Object next();

    void remove();删除集合中上一次next返回的元素,这是在迭代时修改集合元素的唯一可用的办法,使用Iterator访问Collection集合的元素时,不能用其他任何方法改变其中的元素,否则会引发异常。

    void forEachRemaining(Consumer action);用于遍历集合元素,但在遍历过程中并没有生成集合元素的副本,而是直接操作集合内的元素,可以传入lambda表达式;和Java5提供的foreach循环不同,foreach循环只能读取迭代的值,不能够去修改值。

  4. Predicate 操作

    Predicate是函数式接口,但其接收的对象是谓词,即为true或者false,故返回值只能是这两个之一。

  5. Stream编程

    语法糖,减少代码量,有写脚本的感觉。

  6. ==、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类这样的类,比较两个对象是否相同是基于equalshashCode的。

  7. Set

    1. HashSet

      1. 元素无序
      2. 多线程同步需要开发人员自主实现
      3. 集合元素值可以是null
      4. 基于equals和hashCode方法来判断对象是否相同,当hashCode相同时,会调用equals方法,此时查询效率降低
      5. 效率高
    2. TreeSet

      1. 实现了SortedSet接口,内部元素有序

      2. 自定义排序

        可以自己重写传入对象的compareTo(Object obj)方法,从而达到自定义排序的目的

        可以自己实现TreeSetComparator接口,自定义TreeSet的排序方式

    3. EnumSet

      主要是针对enum枚举类型的操作

  8. List

    1. List判断对象是否相等仅仅基于equals方法;

    2. List提供了listIterator()方法,该方法返回ListIterator对象,这个对象继承了Iterator接口,额外增加了反向迭代和在指定位置插入元素的功能。

    3. ArrayListVector

      这两个类是基于Object[]数组实现的List类,使用initialCapacity参数设置数组长度,增加元素时,该参数会自动增加,当批量添加时,使用ensureCapacity(int minCapacity)方法(使Object[]长度增加大于等于minCapacity的值)可以指定initialCapacity大小,提高效率;也可以用trimToSize()将容器大小减小到当前元素个数以节省存储空间。Vector类有很多缺点,也比较古老和混乱,完全可以用ArrayList类替代它。(ArrayList是线程不安全的,但可以用Collections类解决这个问题)

      此外,Stack作为Vector的子类,也可以用ArrayDeque替代。

    4. Arrays工具类提供的asList方法能够将数组或指定个数的对象转换成Arrays.ArrayList内部类对象,不支持任何要更改该集合长度的操作,只能遍历访问。

  9. Queue

    除了FIFO的原始类型以外,还提供Deque接口,通过这个接口可以实现栈式LIFO,典型代表是ArrayDeque类;还有PriorityQueue类,可用于实现大根堆和小根堆,其自定义排序方式和TreeSet基本相同。

    LinkedList也实现了Deque接口,既能当成双端队列使用,也能当作栈来使用,但他是基于链表实现的,随机访问的性能较差。

  10. Map

    1. HashMapHashtable的替代品,前者线程不安全,后者线程安全,但后者过时了。
    2. HashMap只允许一个keynull,因为他的key不可重复,value则无限制。
    3. HashMapHashtable都是基于equals方法来判断value是否相等的;但判断key是否相等则是同时要看元素的equalshashCode()
    4. Properties相当于一个keyvalue都是String类型的Map,专门用于文件读写
    5. TreeMap,类似于TreeSet,基于红黑树实现
    6. WeakHashMap,主要区别是其内部保留的是对实际对象的弱引用,如果其key的引用对象没有任何强引用,则可能会被垃圾回收,并被容器自动删除
    7. IdentityHashMap和普通HashMap的区别在于,其比较两个key是否相等时,它不采用equalshashCode,而是直接采用==严格相等来判断。
    8. EnumMap,根据enum枚举类来创建对象(以enum类的值作为keySet),但不允许keynull
  11. 有关Hash容器中的可变元素的修改

    如果修改Hash容器中的可变元素的值(key),会导致索引错乱,而且只能对没有被修改过的键值对进行操作。

    原因如下:

    HashMap底层是使用Entry对象数组存储的,而Entry是一个单项的链表。当调用一个put()方法将一个键值对添加进来时,先使用hash()函数获取该对象的hash值,然后调用indexFor方法查找到该对象在数组中应该存储的下标,假如该位置为空,就将value值插入,如果该下标出不为空,则要遍历该下标上面的对象,使用equals()方法进行判断,如果遇到equals()方法返回真的则进行替换,否则将其插入。查找时只需要查询通过key值获取获取hash值,然后找到其下标,遍历该下标下面的Entry对象即可查找到value

    可见,当向hash容器中添加元素的时候就会先计算好不变的hash索引了,所以再修改已有的元素一定会导致找不到。

  12. HashSet和HashMap的性能考虑

    负载因子=size/capacity,负载极限(0~1),负载因子到达负载极限(默认值是0.75)时,hash表会自动程碑增长,重新分配对象,进行再哈希,应该避免这种情况的发生,负载极限0.75的取值是查询性能和内存开销的折中。

  13. Collections工具类

    1. 实现多线程安全

      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());
          }
      }
      
    2. 生成只读集合

      emptyXxx()返回空对象(ListSortedSetSetMapSortedMap等)

      singletonXxx(p)返回仅含一个元素的对象(ListMap)

      unmodifiableXxx(p)返回指定集合对象的不可变视图(ListSortedSetSetMapSortedMap等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值