Java深究1

此篇文章仅代表作者个人所学所悟,并不构成指导指引作用。

在这篇博客之前,已经读过相当数量的Java书籍,但一直都没有去总结。如今将自己所学所悟分享出来。

《Java特种兵 上册》

这本书的毕竟是作者的处女座,书中有太多地方感觉很肤浅,也很冗余,内容组织不够清晰,不过还是有很多值得去学习的地方。当然只能说书内容是这样,并不能说人家作者本身是这样。

1.对于前三章我都兴趣不大,因为我主要想了解下,作者作为一个淘宝大数据量处理专家,对于Java编码过程中优化问题的建树。其中提到在比较数据时,我们使用原始的Java运算符,与或非,异或,左移(乘以2的阶乘),右移(除以2的阶乘)来完成,效率更高。

A,B两者交换:

A=A^B;
B=A^B;
A=A^B;
判断A与B是否相等:

A=0x00000001;
return A&B!=0; 

 
2.先看以下代码: 

int a=1;
a=a++;
这段代码如果要打印a的值,会是1,为什么呢?作者从javap编译指令角度来阐述为什么会是1,而不是2。可以这么去理解:

int tmp=a;
a++;
a=tmp;
从编译后指令可以看出,在进行a=a++;先进行的是a=a,那么就会先将a=1本地变量弹到栈顶,然后是本地变量自增,接着因为是本行指令执行完毕,那么出栈并将当前栈顶的a=1写入本地变量.此时a只能是1,而不是2。那如果是a=++a;也自然好理解肯定不是先赋值而去弹到栈顶,而是先本地变量自增,然后弹栈顶出栈赋值。

3.关于集合类:集合类包含List,Map,Set几大接口。以下逐一来说明常用集合类的特点及所适用场合(非书本,自我查找学习)

ArrayList:基于数组来实现,常用于基于下标访问的地方,如果有明确的长度,也适用ArrayList。

LinkedList:基于链表实现的List,多用于插入,删除操作频繁的列表。List list = Collections.synchronizedList(new LinkedList(...));来完成同步操作,它的遍历需要视图来完成,当然Iterator是快速失败的。

Vector:这是一种可以动态增长的数组,当然它也是同步的。它的遍历是需要用到iterator的,它的视图是快速失败的。

HashMap:当然是我们需要使用k,v方式来存储的时候,也经常用于cache。

TreeMap:基于红黑树实现的Map,存入的k,v会根据key的自然顺序或者指定的顺序进行内部排序。非同步。

HashTable:这是一个JDK1.4版本提供的一个用于同步的collection类。

LinkedHashMap:无需增加与 TreeMap 相关的成本。使用它可以生成一个与原来顺序相同的映射副本,而与原映射的实现无关。此实现不是同步的。当然可以使用Collection的工具类:Map m = Collections.synchronizedMap(new LinkedHashMap(...));

ConcurrentHashMap:与HashTable类似,但是更为先进,它是JDK1.5诞生的,相比于HashTable它的优势用如下图来表示更为直观:

后者更为先进的地方就是内部多了一个segment的划分,原本我们使用HashTable进行多线程并发操作时,同一时间只能有有一个线程对Map进行操作,其他的只能Blocked,而ConcurrentHashMap它就将原本一个Map分成了多个segment,而它是在每一个segment级别上进行的synchronized,所以同一时间ConcurrentHashMap可以多个线程并发操作,所以也称之为非阻塞式并发操作。

Java还提供了一些非常用的数据结构,或者称之为集合类:

Stack:这从JDK1.0开始就有的,是扩展版本的Vector,后进先出(LIFO)的对象堆栈。

Queue:在Java中这是一个接口,它是符合先进先出的队列原则的,它有很多子类和子接口。

Deque:它是Queue的子接口,当然它本身也是接口,它是一双端队列,首尾两端都可进行插入和删除操作。

4.volatile与synchronized区别

volatile这个只能用来修饰基本简单变量,同时它只是保证了在main memory中保存的变量的值能够与各个线程自己的memory(寄存器)能同步,它并没有锁的机制和概念,只是在每个线程要对这个被修饰的变量的值操作时,它会从main memory从重新获取一次,而不是直接从自己线程的寄存器中直接获取。这个修饰符当然也不能保证原子性的操作,[原子性操作是指例如A转账给B,这个操作背后实际包含了两步操作,A账户扣款,B账户入账,那么原子性就是指这两步都必须成功,其中一步有可能失败都不能称之为具有原子性]因为诸如i++这样的操作,它看似只是一个操作,但是对于虚拟机的指令中会执行三步:read i; inc; write i.所以它并不能保证一个线程在读的时候,另外一个线程去进行写操作。

而synchronized这个修饰符是用来修饰块和方法的,它的加锁机制可以保证一个事务的原子性操作。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值