九。 按位运算和逻辑运算
按位运算操作符(& ,| )两边的都要计算
逻辑运算如果操作符(&&, || )左边成立则就不在计算右边了
实例:- <p>public class test {
- private static int j = 0;
- private static boolean methodB(int k) {
- j += k;
- return true;
- }
- public static void methodA(int i) {
- boolean b;
- b = i < 10 | methodB(4);
- b = i < 10 || methodB(8);
- }
- public static void main(String args[]) {
- methodA(0);
- System.out.println(j);
- }</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. 重定向只能转向新的资源,功能较单一; 请求转发不但可以转向新的资源,也可将其它资源和本身的生成的内容结合起来,功能很丰富
|
|