Java学习_06_二进制、位运算&移位运算、集合框架

/**
 *详细内容参见更多网络资源,欢迎大家交流探讨!
 */

1 二进制
1.1 二进制
        逢2进位的进位制,0、1是基本算符。由18世纪德国数理哲学大师莱布尼茨发现,数据在计算机中主要以补码形式存储。易于计算机硬件实现,是叫稳定的表示方式,从右至左,表示的十进制数以二倍递增。

1.2 原码、反码、补码
对于有符号数:
①二进制的最高位是符号位:0表示正数,1表示负数;
②正数的原码、反码、补码都一样;
③负数的反码=它的原码符号位不变,其他位取反(0→1,1→0);
④负数的补码=它的反码+1;
⑤0的反码、补码都是0;
⑥Java中没有无符号数,换言之,Java中的数都是有符号的;
⑦在计算机运算时,都是以补码的方式来运算的(important)。

2 位运算 and 移位运算
2.1 位运算符

①按位与&:两位全为1,结果为1;
②按位或|:两位有一个为1,结果为1;
③按位异或^:两位中一个为0,一个为1,结果为1;
④按位取反~:0→1,1→0。

2.2 移位运算符
①算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位;
②算术左移<<:符号位不变,低位补0;
③逻辑右移>>>:低位溢出,高位补0。(无符号右移)

3 集合框架
3.1 集合的几种类型

        JDK中提供的集合,亦叫作容器。“容器”一词源自较早出现的抽象Windows工具包(AWT),其便于实现内存的动态分配,方便完成“增删改查”操作。

——Eckel Bruce,陈吴鹏译 Thinking in Java. 4th ed. 2007: 机械工业出版社.

        根据特定的问题选择特定的集合类型。集合类型:
①List(列表)结构:ArrayList类,LinkedList类,Vector类,Stack类
②Map(图/映射)结构:HashMap类,Hashtable类
③Set(集)结构:HashSet类,TreeSet类
④Queue(队列)结构:Queue接口

3.2 ArrayList和Vector的区别
①同步性
        Vector是同步的,这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以在不需要线程安全的集合时,选择ArrayList效率较高,避免了由于同步带来不必要的性能开销。
②数据增长
        从内部实现的机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当向这两种类型中增加元素时,若元素的数目超过了内部数组目前的长度,需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。需要在集合中保存大量数据时,使用Vector较有优势。

3.3 HashMap和Hashtable的区别
①历史原因
        Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现。
②同步性
        Hashtable是同步的,其中的对象是线程安全的,在服务器应用中常用,而HashMap是异步的,其中对象的不是线程安全的。
③值
        Hashtable中不允许放入空值(Null);HashMap中允许将空值(Null)作为一个表的条目的key或value.

3.4 关于集合使用的建议
①要求线程安全:Vector类,Hashtable类;
②不要求线程安全:ArrayList类,LinkedList类,HashMap类;
③要求键值对形式:HashMap类,Hashtable类;
④数据量巨大,要求线程安全:Vector类。

3.5 HashMap中数据顺序
        Map结构的集合,以键值对形式组织数据。
        HashMap中的键不重复,按键(key)修改值(value)。
        HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历。
第一种:
  Map map = new HashMap();
  Iterator iter = map.entrySet().iterator();
  while (iter.hasNext()) {
  Map.Entry entry = (Map.Entry) iter.next();
  Object key = entry.getKey();
  Object val = entry.getValue();
  }
  效率较高!
第二种:
  Map map = new HashMap();
  Iterator iter = map.keySet().iterator();
  while (iter.hasNext()) {
  Object key = iter.next();
  Object val = map.get(key);
  }
  效率较低!

        以下是一个实例:
/*
 * Function:test two sorting methods for HashMap
 * Author:BonJean
 * Date:20140820
 */

import java.util.*;
import java.util.Map.Entry;


public class HashMapTest {
	public static void main(String[] args){
	HashMap<Integer,String> hashmap = new HashMap<Integer,String>();
	for (int i = 0; i < 100; i++ ){
		hashmap.put(i, "HelloWorld!");
	}
	
	int count=0;//记录数据个数
	
	long t1 = Calendar.getInstance().getTimeInMillis();
	Iterator<Integer> iter1 = hashmap.keySet().iterator();
	while (iter1.hasNext()) {
		int temp=iter1.next();//返回键
		System.out.print(temp);//返回值
		System.out.print(hashmap.get(temp)+"\t");
		count++;
	}
	System.out.println();
	System.out.println(count);
	System.out.println(Calendar.getInstance().getTimeInMillis() - t1);


	long t2 = Calendar.getInstance().getTimeInMillis();
	Iterator<Entry<Integer,String>> iter2 = hashmap.entrySet().iterator();
	while (iter2.hasNext()){
		Map.Entry<Integer,String> entry = (Map.Entry<Integer,String>) iter2.next();
		System.out.print(entry.getKey());//entry.getKey() 返回与此项对应的键
		System.out.print(entry.getValue()+"\t");//entry.getValue() 返回与此项对应的值
		count++;
	}
	System.out.println();
	System.out.println(count);
	System.out.println(Calendar.getInstance().getTimeInMillis() - t2);
	}
}

——原文:《Java中HashMap遍历的两种方式》  作者:meieiem


        HashMap散列图、Hashtable散列表中的数据是按“有利于随机查找的散列(Hash)的顺序”。Hashtable中可以调用它的protected方法rehash()重新散列,以获取更有利于随机存取的内部顺序。我们在遍历时,与加入时的顺序是不相同。同样的加入顺序,HashMap和Hashtable遍历结果也是不同。按加入时的顺序遍历,可以使用java.util.LinkedHashMap,java.util.LinkedHashSet。
——《Java中关于HashMap的元素遍历的顺序问题》  作者:孤傲苍狼

3.6 其他
        在ArrayList中可以重复增加同一个对象,ArrayList中在两个位置存放了这个对象的地址。在集合类中类如果没有给定具体要放置的数据类型,那么通过get(int Index)等方法操作的其中的数据类型是Object类。可以通过强制转换改变数据类型,也可以在声明集合类时就给定其中要放置的数据类型,例如:ArrayList<String> al=new ArrayList<String>();在给定数据类型时我们可以给定一个超类,这样这个集合可以放置的对象就会多一些,这一点和给定方法参数数据类型一样。但是给定的超类离我们具体使用的类层次较大时,可能还是需要强制转换,所以这也是一个值得权衡的问题。
LinkedList提供了从List前端添加数据的方法,addFirst(Object o);


参考:

[1] Eckel Bruce,陈吴鹏译 Thinking in Java. 4th ed. 2007: 机械工业出版社.

[2] 原文:《Java中HashMap遍历的两种方式》  作者:meieiem

[3] 原文:《Java中关于HashMap的元素遍历的顺序问题》  作者:孤傲苍狼


/**
 *站在巨人的肩上才能看得更远,一步一个脚印才能走得更远。分享成长,交流进步,转载请注明出处!
 */
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值