首页 > 代码库 > 大四Java复习笔记之Java基础

大四Java复习笔记之Java基础

一、static和final

    学习Java那么久,好像自己就没有怎么用过final,所以对fianl的理解不够。final不但出现在变量的修饰里面,还可以出现在方法和类的修饰。final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。final方法锁定方法,子类不能覆盖修改方法,同时方法会高效。final变量final修饰的成员变量表示常量,只能被赋值一次,赋值后值无法改变,final是指引用的变量不能不能变,但是引用所指向的对象中的内容可以变,同时如果是null的final变量可以赋值一次。

二、一个“.java”文件可以包含多个类

    可以有多个类,不过只能有一个“public”的类,而且名字跟文件名一致。

三、&和&&

    &和&&都可以作为逻辑运算的与的运算符。但是&&会出现短路功能,也就是说如果前面的条件不成立的时候,后面的条件不会执行,例如:(1==2&&j++>1)。

    &还可以作为位运算,&表示按位与运算(相同位的两个数字都为1,则为1;若有一个不为1,则为0)。

四、integer和int

    int是Java的8种原始数据类型之一。Java为每个原始数据提供封装类,integer是Java为int提供的封装类。int的默认值是0,而integer的默认值是null。

五、Java中string的创建

    Java中String是一个特殊的包装类数据有两种创建形式:

    1、String s = "abc";

    2、String s = new String("abc");    

    第一种先在栈中创建一个对String类的对象引用变量s,然后去查找"abc"是否被保存在字符串常量池中,如果没有则在栈中创建三个char型的值‘a‘、‘b‘、‘c‘,然后在堆中创建一个String对象object,它的值是刚才在栈中创建的三个char型值组成的数组{‘a‘、‘b‘、‘c‘},接着这个String对象object被存放进字符串常量池,最后将s指向这个对象的地址,如果"abc"已经被保存在字符串常量池中,则在字符串常量池中找到值为"abc"的对象object,然后将s指向这个对象的地址。

第一种特点:JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。

    第二种可以分解成两步1、String object = "abc"; 2、String s = new String(object); 第一步参考第一种创建方式,而第二步由于"abc"已经被创建并保存到字符串常量池中,因此jvm只会在堆中新创建一个String对象,它的值共享栈中已有的三个char型值。

    第二种特点:一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象。

六、error和exception

    error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

七、sleep() 和 wait() 

    sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。

八、run()和start()

    在java里start()是启动线程,run()是启动线程后执行的方法。

九、arraylist和vector

    1、同步性

    vector线程安全,arraylist非线程安全。

    备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。所以,我们讲课时先讲老的。

    2、数据增长

    arraylist和vector都会用一个初始的容量大小,当存储超出大小的时候,vector增长原来的一倍,arraylist增长原来的0.5倍。

十、list和map

    一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合。list是有顺序的,并且允许有重复;map中存储的数据没有顺序,其键值不允许存在重复,但是值是允许重复的。

十一、arraylist、vector和linklist

    arraylist和vector都是使用数组方式存储数据。此数组元素数大于实际存储的数据以便增加和插入元素。它们允许按序号索引元素,但是插入元素也涉及数组元素移动等内存操作,所以索引快和插入慢。vector由于使用线程安全,所以效率相对arraylist差,其实在新的jvm上它们的效率相差不大。linklist采用双向链表实现存储,按序号索引数据需要按前向遍历或者后向遍历,但是插入数据时,只要记录前后项数据既可,所以插入速度快。linklist是非线程安全。

十二、head和stack

    Java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量。当这个方法结束时,分配给这个方法的栈也会释放,这个栈里面的变量也会随之释放。

    堆与栈作用不同的内存,一般用于存放不放在当前方法栈中的数据,例如使用new创建的对象都放在堆里,所以它不会随这方法的结束也消失。方法中的局部变量使用final修饰后,放在堆中而不是栈中。


大四Java复习笔记之Java基础