/**
*详细内容参见更多网络资源,欢迎大家交流探讨!
*/
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 集合的几种类型
①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来进行遍历。
第一种:
第二种:
以下是一个实例:
——《Java中关于HashMap的元素遍历的顺序问题》 作者:孤傲苍狼
3.6 其他
在ArrayList中可以重复增加同一个对象,ArrayList中在两个位置存放了这个对象的地址。在集合类中类如果没有给定具体要放置的数据类型,那么通过get(int Index)等方法操作的其中的数据类型是Object类。可以通过强制转换改变数据类型,也可以在声明集合类时就给定其中要放置的数据类型,例如:ArrayList<String> al=new ArrayList<String>();在给定数据类型时我们可以给定一个超类,这样这个集合可以放置的对象就会多一些,这一点和给定方法参数数据类型一样。但是给定的超类离我们具体使用的类层次较大时,可能还是需要强制转换,所以这也是一个值得权衡的问题。
LinkedList提供了从List前端添加数据的方法,addFirst(Object o);
/**
*站在巨人的肩上才能看得更远,一步一个脚印才能走得更远。分享成长,交流进步,转载请注明出处!
*/
*详细内容参见更多网络资源,欢迎大家交流探讨!
*/
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
——《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的元素遍历的顺序问题》 作者:孤傲苍狼
/**
*站在巨人的肩上才能看得更远,一步一个脚印才能走得更远。分享成长,交流进步,转载请注明出处!
*/