Java拾遗

原创 2015年11月19日 15:45:38

遍历map对象

for (Entry<String, String> entry : map.entrySet()){
  System.out.println(entry.getKey() + "/" + entry.getValue());
}

需要 import java.util.Map.Entry;

如何将String转化为Int

Integer i = Integer.valueOf(str);
int i = int.parseInt(str);

JavaBean

JavaBean 只是一个标准

  • 所有的属性是私有的(通过getters/setters处理属性)
  • 一个公有的无参数的构造器
  • 实现了序列化(Serializable)

wait()和sleep()的区别

线程 在wait 后,可以被另一个拥有相同 synchronized 对象的线程,通过调用 notify 唤醒,而 sleep 不行。wait 和 notify 能正常执行的条件是(否则会抛异常):多个线程的代码,都包在synchronized块中,并且 synchronized 锁的对象需要是同一个。如下所示:

Object mon = ...;
synchronized (mon) {
    mon.wait();
} 

上面这个线程调用了 wait后,会进入等待状态。这时另外一个线程可以这样做:

synchronized (mon) { mon.notify(); }

可以看到,synchronized锁对象,都是mon。因此,当第二个线程调用了 notify() 方法,第一个线程就会唤醒(假设有且仅有一个线程是被包在 synchronized (mon) 中且处于等待状态)。

如果有多个线程在等待(且synchronized 锁对象是同一个,如上例中的mon),则可以调用 notifyAll 来唤醒。但是,只有其中一个线程能抢到锁并继续执行(因为 wait 的线程都是在 synchronized 块内,需要争夺 synchronized 锁)。其他的线程会被锁住,直到他们依次获得锁。

再补充几点:

wait 方法由 Object 对象调用(例如:你可以让 synchronized 锁对象调用 wait ,如上面例子的mon.wait()),而 sleep 则由线程调用。

wait 之后,可能会伪唤醒(spurious wakeups)(正在waiting的线程,无故就被唤醒了,如遇到interrupted, timing out等情况)。因此,你需要多设置一些检查,如果不满足实际的运行条件,则继续等待,如下:

synchronized {
    while (!condition) { mon.wait(); }
}

当线程调用 sleep 时,并没有释放对象锁,而 wait 则释放了对象锁:

synchronized(LOCK) {
    Thread.sleep(1000); // LOCK is held
}
synchronized(LOCK) {
    LOCK.wait(); // LOCK is not held
}

最后,再小结一下:

sleep():“我已经完成了一个时间片,在n微秒前,请不要再给我一个时间片”。这时操作系统不会让这个线程做任何事情,直到sleep时间结束。
wait():”我已经完成了一个时间片,在其他线程调用notify()前,请不要再给我一个时间片)。这时操作系统不会安排这个线程继续运行,直到有人调用了notify()

LinkedList、ArrayList各自的使用场景,如何确认应该用哪一个呢?

一言以蔽之,在大部分情况下,使用ArrayList会好一些。

耗时上各有优缺点。ArrayList稍有优势

List只是一个接口,而LinkedList、ArrayList是List的不同实现。LinkedList的模型是双向链表,而ArrayList则是动态数组

首先对比下常用操作的算法复杂度

LinkedList

  • get(int index) : O(n)
  • add(E element) : O(1)
  • add(int index, E element) : O(n)
  • remove(int index) : O(n)
  • Iterator.remove() : O(1) <— LinkedList的主要优点
  • ListIterator.add(E element) is O(1) <— LinkedList的主要优点

ArrayList

  • get(int index) : O(1) <— ArrayList的主要优点
  • add(E element) : 基本是O(1) , 因为动态扩容的关系,最差时是 O(n)
  • add(int index, E element) : 基本是O( n - index) , 因为动态扩容的关系,最差时是 O(n)
  • remove(int index) : O(n - index) (例如,移除最后一个元素,是 O(1))
  • Iterator.remove() : O(n - index)
  • ListIterator.add(E element) : O(n - index)
  • LinkedList,因为本质是个链表,所以通过Iterator来插入和移除操作的耗时,都是个恒量,但如果要获取某个位置的元素,则要做指针遍历。因此,get操作的耗时会跟List长度有关

对于ArrayList来说,得益于快速随机访问的特性,获取任意位置元素的耗时,是常量的。但是,如果是add或者remove操作,要分两种情况,如果是在尾部做add,也就是执行add方法(没有index参数),此时不需要移动其他元素,耗时是O(1),但如果不是在尾部做add,也就是执行add(int index, E element),这时候在插入新元素的同时,也要移动该位置后面的所有元素,以为新元素腾出位置,此时耗时是O(n-index)。另外,当List长度超过初始化容量时,会自动生成一个新的array(长度是之前的1.5倍),此时会将旧的array移动到新的array上,这种情况下的耗时是O(n)。

总之,get操作,ArrayList快一些。而add操作,两者差不多。(除非是你希望在List中间插入节点,且维护了一个Iterator指向指定位置,这时候linkedList能快一些,但是,我们更多时候是直接在尾部插入节点,这种特例的情况并不多)

空间占用上,ArrayList完胜

看下两者的内存占用图
性能
这三个图,横轴是list长度,纵轴是内存占用值。两条蓝线是LinkedList,两条红线是ArrayList

可以看到,LinkedList的空间占用,要远超ArrayList。LinkedList的线更陡,随着List长度的扩大,所占用的空间要比同长度的ArrayList大得多。 注:从mid JDK6之后,默认启用了CompressedOops ,因此64位及32位下的结果没有差异,LinkedList x64和LinkedList x32的线是一样的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

数学拾遗

布尔运算 与非(NAND)或非(NOR)不同于异或或者异或 与非门真值表: A B Y 0 0 1 0 1 1 1 0 1 1 1 0 逻辑表...
  • lanchunhui
  • lanchunhui
  • 2015年11月23日 23:11
  • 598

Python拾遗

#简单的来看帮助文档input(...)和raw_input(...)有如下区别 >>> help(input) Help on built-in function input in module _...
  • xmnathan
  • xmnathan
  • 2014年07月25日 09:14
  • 1069

Google MapReduce - 阅读拾遗

MapReduce 之前用的和学的都比较多了,这里简单记一下论文中的一些小收获和感受 本文参考:Google MapReduce 中文版 1.0 版 译者 alex,原文地址 http:/...
  • u010557442
  • u010557442
  • 2017年09月28日 21:26
  • 111

基础拾遗------特性详解【含常用过滤器实例】

基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾...
  • qcq8208
  • qcq8208
  • 2017年01月20日 18:07
  • 273

python语法基础拾遗

原文来自http://www.jianshu.com/p/d5bc50d8e0a2,摘录自己不熟悉的部分记下来以便日后查阅。因为是为了自己看而写的,故基本是提纲性质,非常简略,大家有疑惑的话请在评论区...
  • qq_35539645
  • qq_35539645
  • 2017年09月29日 16:45
  • 42

python拾遗(一)前言

从大三到现在,学习python也有两年了,也许python不是我学习的第一门语言,也不是我的主要工作语言,但却是我最喜欢的语言,喜欢它带给我的成就感,并且不断激励我学习下去。知乎上有篇文章介绍了pyt...
  • iloster
  • iloster
  • 2015年12月09日 21:08
  • 471

java拾遗

java拾遗        最近在工作中,经常发现java中一些 小细节,自己以前都没注意,发现之后还是有点新鲜的,不过都是很基础的东西(也许是自己java基础太过薄弱,嘿嘿),就记录在这里,以予自乐...
  • hbcui1984
  • hbcui1984
  • 2007年04月19日 12:06
  • 1980

计算机底层知识拾遗(八)理解物理内存管理

内存管理是Linux内核最复杂的组件。内存管理包括虚拟内存机制和物理内存管理。这篇说说物理内存管理的一些要点。 说到虚拟内存的时候我们知道虚拟内存地址空间分为两部分:内核地址空间和用户进程地址空间。这...
  • ITer_ZC
  • ITer_ZC
  • 2015年03月12日 15:18
  • 3163

Java 拾遗

最近在工作中,经常发现java中的一些小细节,自己以前都没有注意,发现之后还是有点新鲜的,不过都是很基础的东西(也许是自己java基础太过薄弱,嘿嘿),就记录在这里,以予自乐。 1、  方法重载的问题...
  • IamHades
  • IamHades
  • 2007年09月24日 18:55
  • 977

Java拾遗

问题一:子类何时调用父类的构造方法 问题二:静态成员可以被this引用吗 问题三:静态成员会被默认初始化吗 问题四:接口中的方法能动态绑定吗...
  • guodongxiaren
  • guodongxiaren
  • 2014年11月03日 17:46
  • 1435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java拾遗
举报原因:
原因补充:

(最多只允许输入30个字)