Java中的知识总结

1.集合

1.链表

linkedList:基于双向链表,插入和删除方便,但是随机访问较慢。
arrayList:基于数组,在中间插入和删除较慢,但是随机访问较快。

2.映射

HashMap:根据键的HashCode 值存储数据,根据键可以直接获取它的值、具有很快的访问速度、遍历时、取得数据的顺序是完全随机的
LinkedHashMap:保存了记录的插入顺序、在用Iterator遍历LinkedHashMap时、先得到的记录肯定是先插入的。即是按照插入顺序排序
TreeMap:保存的记录根据键排序,默认是按键值的升序排序。即是根据进行排序。

3.Set

Set要区别于redis中的Set,这里是不需要key的,是将元素放入set中,这个元素可以是基本类型,也可以是
Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。只要两个对象用equals方法比较返回true,Set就不会接受这两个对象。
HashSet:当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。
TreeSet:树集是一个有序集合,可以以任意顺序将元素插入到集合,对集合进行遍历时,每个值将自动按照顺序输出。
HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。
TreeSet是由一个红黑树的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。

2.AQS(抽象队列共享)

构造:由一个FIFO和一个volatile int state的共享状态量组成,类似于go中的sync.wait()
当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。例如:ReentrantLock、信号量、CountDownLatch
通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。

2.1 volatitle

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

2)禁止进行指令重排序。
  何为指令重排序:
  JVM编译器会对指令进行重排序以提升并发性能.会让指令按照非程序语义的顺序执行.有编译重排序,处理器指令重排序、内存重排序而指令重排序在多线程情况下可能存在问题,比如单例模式,多线程下可能获取未初始化的对象.创建对象的过程:
1.申请内存地址.
2.在内存地址上初始化对象:
3.将引用指向内存地址:
假设按照1->3->2的顺序执行.就会存在问题.
若添加volatile,就可以防止重排序

3.对象的组成部分

1对象头:Mark word(对象自身运行时的数据),类型指针,数组

运行时的数据:HashCode、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳、GC分代年龄等
类型指针:也就是指向此对象的类元数据的指针,也就是通过这个指针来知道这个对象是哪个类的实例,但是不是所有的虚拟机实现都是通过这个来查找类的元数据的。
数组:只有数组对象保存了这部分的数据

2.实例数据

对象真正存储的数据区,各种类型的字段内容

3.对齐填充

这部分内容没什么别的意义,就是起着占位符的作用,主要是因为HotSpot虚拟机的内存管理要求对象的大小必须是8字节的整数倍,而对象头正好是8个字节的整数倍,但是实例数据不一定,所以需要对齐填充补全。

4.Wait和sleep的区别

sleep是让出CPU的时间片,但是并不释放他所持有的对象锁.
wait是放弃对象锁,进入ObjetMonitor的waitSet中,notify后重现尝试去竞争锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值