目录
二进制
1.int 4个字节,1字节是8位。
例如:int a=3; 则用二进制表示: 00000000 00000000 00000000 00000011
int b=-1;则用二进制表示: 10000000 00000000 00000000 00000001
2.最高位(第一位)是符号位,0表示正数,1表示负数。
3. 原码、反码、补码
对于有符号的而言:
a.正数的原码、反码、补码都一样
b. 负数的反码=它的原码符号位不变,其他位取反
c. 负数的补码=它的反码+1
b.0的反码、补码都是0
e.Java没有无符号数(Java中的数都是有符号的)
f.在计算机运算的时候,都是以补码的方式来运算的。
4. 位运算符和移位运算符
a.按位与&、按位或|、按位异或^、按位取反~(符号位也取反)
b. 移位运算符
i. >>算术右移:低位溢出,符号位不变,并用符号位补溢出的高位
ii.<<算数左移:符号位不变,低位补0(每移动一位相当于乘以一个2)
iii.>>> 逻辑右移:低位溢出,高位补0
——————————————————————————————————————————
集合框架
1. Java主要的集合类
a. List结构的集合类:ArrayList类,LInkedList类,Vector类,Stack类
b. Map结构的集合类:HashMap类,Hashtable类
c. Set结构的集合类: HashSet类,TreeSet类
d. Queue结构的集合:Queue接口
2. HashMap和Hashtable的区别
a. 历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是java 1.2引进的Map接口的一个实现。
b. 同步性:Hashtable是线程同步的。这个类中的一些方法保证了Hashtable中的对象是线程安全的。而HashMap则是线程异步的,因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率。
c. 值: HashMap可以让你将空值作为一个表的条目的key或value但是Hashtable是不能放入空值的(null)
3. ArrayList和Vector的区别
a. 同步性:Vector是线程同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是线程异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。
b. 数据增长: 从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
4. 如何选用集合类?
a. 要求线程安全,使用Vector、Hashtable
b. 不要求线程安全,使用ArrayList,LinkedList,HashMap
c. 要求key和value键值,则使用HashMap,Hashtable
d. 数据量很大,又要线程安全,则使用Vector
——————————————————————————————————————————
泛型
问题:
public class Test {
public static void main(String[] args) {
ArrayList al=new ArrayList();
Dog d=new Dog();
al.add(d);
//存入一个对象,自动向上转型为Object,但是取对象时,可能并不知道,其具体是什么对象,向下转型出现错误。
Dog dd=(Dog)al.get(0);
Cat c=(Cat)al.get(0);
}
}
class Dog{}
class Cat{}
出现异常:Exception in thread "main" java.lang.ClassCastException: test.Dog cannot be cast to test.Cat at test.Test.main(Test.java:16)
1. 泛型是java se1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
2 .java语言引入泛型的好处是安全简单。在java se1.5之前,没有泛型的情况下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的,对于强制类型转换错误的情况,编译器不提示错误,在运行的时候才出现异常,这是一个安全隐患。
3. 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
4. Java反射机制。。。
public class Test {
public static void main(String[] args) {
Gen<Integer> g=new Gen();
g.t=new Integer(11);
g.p();
}
}
class Gen<T>{
public T t;
public void p(){
System.out.println(t.getClass().getName());
}
}
我的理解,就是写一个类时需要使用某个类型一个变量(对象),对不同对象可能有不同的响应(个人理解),所以<T>相当把类也当成一个变量,声明该变量已经存在。
5. 泛型的优点
使用泛型有下面几个优点:
a. 类型安全
b. 向后兼容
c. 层次清晰
d. 性能较高,用GJ(泛型JAVA)编写的代码可以为java编译器和虚拟机带来更多的类型信息,这些信息对java程序做进一步优化提供条件。
——————————————————————————————————————————
异常
1. Java中处理异常的两种方法:
a. 在发生异常的地方直接处理
b. 将异常抛给调用者,让调用者处理
2.异常分类
a. 检查性异常:java.lang.Exception.程序正确,但因为外在的环境条件不满足引发。例如:用户错误及I/O问题--程序试图打开一个并不存在的远程Socket端口,或者是打开不存在的文件时。这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误),对商用软件系统,程序开发者必须考虑并处理这个问题。java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。
b. 运行期异常:java.lang.RuntimeException.这意味着程序存在bug,如数组越界、0被除、入参不满足规范...这类异常需要更改程序来避免,java编译器强制要求处理这类异常。
c. 错误:java.lang.Error.一般很少见,也很难通过程序解决,它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无需处理,而由运行环境处理。
顶层是java.lang.Throwable类,检查性异常、运行期异常、错误都是这个类的子孙类,java.lang.Exception和java.lang.Error继承自java.lang.Throwable,而java.lang.RuntimeException继承自java.lang.Exception
3. 异常处理
a. try...catch:程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。
b. finally:如果把finally块置try...catch...语句后,finally块一般都会得到执行,它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行。就算catch中有return,finally也是要执行的(Java虚拟机会在return位置设置断点,然后跳转执行finally,再回来执行return)。
以下情形,finally块将不会被执行:
①、finally块中发生了异常;
②、程序所在的线程死亡;
③、在前面的代码中用了System.exit();
④、关闭CPU
try...catch...finally中可以没有catch
c.将异常抛给调用者,让调用者处理异常thorws