黑马程序员技术交流社区

标题: 【分享】java易错知识点归纳总结二 [打印本页]

作者: 狼王    时间: 2013-10-30 15:00
标题: 【分享】java易错知识点归纳总结二
九。 按位运算和逻辑运算
    按位运算操作符(& ,| )两边的都要计算
    逻辑运算如果操作符(&&, || )左边成立则就不在计算右边了
    实例:
  1. <p>public class test {
  2.        private static int j = 0;
  3.        private static boolean methodB(int k) {
  4.                 j += k;
  5.                 return true;
  6.       }
  7.       public static void methodA(int i) {
  8.                 boolean b;
  9.                 b = i < 10 | methodB(4);
  10.                 b = i < 10 || methodB(8);
  11.        }
  12.       public static void main(String args[]) {
  13.             methodA(0);
  14.            System.out.println(j);
  15.        }</p><p> }</p>
复制代码
What is the result?
    A.The program prints "0"
    B.The program prints "4"
    C.The program prints "8"
    D.The program prints "12"
    E.The code does not complete

十。 for(;;)意义
    相当于while(true), 不知道java为什么要搞出这个古怪让人费解的东西?

十一。 equals, = =
    1、equals比较两个对象的内容是否相等
    = = 比较的是两个引用是否指向同一对象
    String的存储特性会对以上的判定规则产生影响(实质上规则不变,表面上改变):
    String 通过""方式生成的对象会存储在常量池中,常量池有一个重要的特点就是共享,比如String s = "X"; 在把"X"放常量池之前jvm会检测常量池中是否存在和"X"相同的对象,如果已经存在则直接把引用指向已存在的对象,不再为"X"分配空间,好处是节约了空间
    何时需要重写equals()

    当一个类有自己特有的"逻辑相等"概念(不同于对象身份的概念)。
    2、设计equals()
    [1]使用instanceof操作符检查"实参是否为正确的类型".
    [2]对于类中的每一个"关键域",检查实参中的域与当前对象中对应的域值。
    [2.1]对于非float和double类型的原语类型域,使用==比较;
    [2.2]对于对象引用域,递归调用equals方法;
    [2.3]对于float域,使用Float.floatToIntBits(afloat)转换为int,再使用==比较;
    [2.4]对于double域,使用Double.doubleToLongBits(adouble) 转换为int,再使用==比较;
    [2.5]对于数组域,调用Arrays.equals方法。

3.当改写equals()的时候,总是要改写hashCode()
    根据一个类的equals方法(改写后),两个截然不同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode方法,它们仅仅是两个对象。因此,违反了"相等的对象必须具有相等的散列码".

4.设计hashCode()
    [1]把某个非零常数值,例如17,保存在int变量result中;
    [2]对于对象中每一个关键域f(指equals方法中考虑的每一个域):
    [2.1]boolean型,计算(f ? 0 : 1);
    [2.2]byte,char,short型,计算(int);
    [2.3]long型,计算(int) (f ^ (f>>>32));
    [2.4]float型,计算Float.floatToIntBits(afloat);
    [2.5]double型,计算Double.doubleToLongBits(adouble)得到一个long,再执行[2.3];
    [2.6]对象引用,递归调用它的hashCode方法;
    [2.7]数组域,对其中每个元素调用它的hashCode方法。
    [3]将上面计算得到的散列码保存到int变量c,然后执行 result=37*result+c;
    [4]返回result.

十二。 基本类型的变量赋初始値
    Byte的范围为-128~127
    当我们给出一个整数,且该整数后不带l标示,则编译器自动把它视为int类型,如
    Int i = 1 ; 是成立的
    当我们给出一个小数,且该小数后不带f标示,则编译器自动把它视为double类型,如
    Double d = 1.0; 是成立的

十三。 基本类型的转化
    规则: 小的可以自动转化为大的, 大的要强制性才能转为小的,比如以下
    Double d = 1.0f; //正确, 小转大,自动
    Float f = 1.0d(或1.0); //错误,大转小,需强制 float f = (float)1.0d;
   
十四。 servlet运行机理
    Servlet是java引入的在B/S架构中用来处理动态网页的一种技术,其实质是一个继承了HttpServlet的java类,由web容器负责解释运行,其机理如下:
    (第一次被请求)
    客户提出请求 -> web容器解析请求,找出请求的url,根据web.xml配置找到对应的servlet -> 加载servlet -> 实例化 -> 调用init初始化 -> 调用service方法 -> 由service方法自动匹配doXXX方法-> web容器关闭/servlet长时间没有被请求则调用其destroy方法销毁servlet实例
    不确定的地方: servlet多长时间没有被调用才会销毁,可以设置吗? 不同的web服务器应该是不同的吧
   
十五。 servlet 和 jsp 的区别
    都是用来处理动态网页的技术,jsp被编译后转化为servlet, 一个jsp页面本质上也是一个servlet;jsp在第一次被请求后,先转化为servlet,再编译,所以第一次要比servlet慢
    Servlet是在java代码中嵌入HTML, 擅长逻辑控制
    Jsp是在HTML中嵌入java代码, 擅长页面处理
   
十六。 forward(请求转发)与redirect(重定向)的区别
    ( Forward是服务器端请求,是servlet提供的一种技术,服务器根据请求的url找到请求的页面,对浏览器而言,这一过程是不透明的,好像什么也没发生一样,浏览器的地址栏不会显示被请求的url页面地址(显示的仍是上次请求的服务器端的url地址),从HTTP协议的角度,只发生一次的请求响应过程
    Redirect是客户端的请求,客户端根据服务器传回的地址,重新向服务器发出请求,浏览器的地址栏显示的是新请求的url地址, 从http协议的角度,发生了两次请求响应的过程 )
    -------------------
    1. 重定向是HTTP协议定义的功能,要经过两次HTTP通信过程,第一次用于获取资源的实际地址,第二次用之前得到的地址发出请求, 这个过程对浏览器是可见的;
    请求转发是servlet技术本身的特点,转发的过程是在服务器内部进行,对浏览器是不透明的,它认为它所发送的地址实际上得到的就是这些内容; 从HTTP角度看,只有一次通讯过程
    2. 重定向只能转向新的资源,功能较单一; 请求转发不但可以转向新的资源,也可将其它资源和本身的生成的内容结合起来,功能很丰富
   
   





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2