首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 数据库 第二书店 程序员

puppylove123/ 


共23个网摘 [ 1 ]   |  访问puppylove123的个人空间

Java编程那些事儿28—运算符优先级

puppylove123收录,使用标签:Java,时间:2008-6-9 3:22:05 | 相关网摘我也收藏

4.7 运算符优先级
在实际的开发中,可能在一个运算符中出现多个运算符,那么计算时,就按照优先级级别的高低进行计算,级别高的运算符先运算,级别低的运算符后计算,具体运算符的优先级见下表:
运算符优先级表
优先级 运算符 结合性
1 () [] . 从左到右
2 ! +(正) -(负) ~ ++ -- 从右向左
3 * / % 从左向右
4 +(加) -(减) 从左向右
5 << >> >>> 从左向右
6 < <= > >= instanceof 从左向右
7 == != 从左向右
8 &(按位与) 从左向右
9 ^ 从左向右
10 | 从左向右
11 && 从左向右
12 || 从左向右
13 ?: 从右向左
14 = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= 从右向左

说明:
1、 该表中优先级按照从高到低的顺序书写,也就是优先级为1的优先级最高,优先级14的优先级最低。
2、 结合性是指运算符结合的顺序,通常都是从左到右。从右向左的运算符最典型的就是负号,例如3+-4,则意义为3加-4,符号首先和运算符右侧的内容结合。
3、 instanceof作用是判断对象是否为某个类或接口类型,后续有详细介绍。
4、 注意区分正负号和加减号,以及按位与和逻辑与的区别
其实在实际的开发中,不需要去记忆运算符的优先级别,也不要刻意的使用运算符的优先级别,对于不清楚优先级的地方使用小括号去进行替代,示例代码:
int m = 12;
int n = m << 1 + 2;
int n = m << (1 + 2); //这样更直观
这样书写代码,更方便编写代码,也便于代码的阅读和维护。


Java编程那些事儿29—表达式

puppylove123收录,使用标签:Java,时间:2008-6-9 3:21:59 | 相关网摘我也收藏

4.8 表达式
由运算符和变量、常数或常量组成的式子称为表达式。例如2+3,a*b等。表达式是组成程序的基本单位,也是程序运算时的基本单位。
在程序代码内部,每个表达式都有自己对应的数据类型,具体参看下表:
表达式结果类型
序号 运算符 结果类型
1 算术运算符 数字型
位运算符
移位运算符
递增、递减运算符
2 比较运算符 布尔型
逻辑运算符
3 赋值运算符 和变量类型一致
4 条件运算符 和两个值中类型高的一致

对于序号1和2的运算符组成的表达式,由于比较直观,就不再单独举例了,对于3和4说明如下:
int n = 10;
int m = 10;
n =( m = 10); //则表达式m=10的类型是变量m的类型,也是m的值
boolean b = false;
boolean b1 = true;
b = (b1 = true); //则表达式b1 = true的类型是布尔型,值是true
double d;
d = 10 > 0 ? 1.0 : 2; //由于1.0是double型,2是整数型,则表达式的类型是double
对于由多个运算符组成的表达式,其最终的类型由最后一个运算符决定。
在实际的程序代码中,大部分的表达式不能单独成为代码中的一行,否则程序会提示语法错误,例如:
int a = 10;
int b = 20;
a + b; //不能单独成行
在表达式中,能够单独成行的运算符包括赋值运算符和递增、递减运算符。
4.9 总结
本部分系统的讲解了Java语言中运算符的知识,并且介绍了实际使用过程中需要注意的问题,在学习时需要熟记每种运算符的作用,然后在实际项目中根据需要使用对应的运算符来实现程序的功能。


Java编程那些事儿27—其它运算符

puppylove123收录,使用标签:Java,时间:2008-6-9 3:21:34 | 相关网摘我也收藏

Java编程那些事儿27—其它运算符
郑州游戏学院 陈跃峰
出自:http://blog.csdn.net/mailbomb
4.6 其它运算符
对于无法归类,或者单独占一类的运算符,将在下面进行介绍。
l ++、--
这两个运算符是程序中的递增和递减运算符。其意义参照以下示例代码:
int n = 0;
n++; // n = n + 1
System.out.println(n);
n++的意义就是对原来变量n的值加1以后再赋值给自身,因为原来变量n的值是0,加1以后则变成1。
同理,递减运算符的意义也是这样,示例代码:
int m = 0;
m--;
System.out.println(m);
m—的意义就是对原来变量m的值减1以后再赋值给自身,则m的值变成-1。
需要注意的是++和—只能操作变量,而不能操作其他的内容,以下使用都是错误的:
int a = 0;
int b = 0;
(a + b)++; //错误
final int M = 1;
M++; //错误
5++; //错误
在实际书写时,++和—既可以写在变量的前面,也可以写在变量的后面,例如:
int k = 0;
k++;
++k;
同理,--也可以这样,那么这些在实际使用中有什么区别呢?其实对于变量的值来说,没有区别,也就是++无论写后面还是写前面,变量的值肯定增加1,--无论写在后面还是前面,变量的值都减1。其最大的区别在于整个式子的值,如n++,规则如下:
1)++或—写在变量前面,则该式子的值等于变量变化以前的值。
2)++或—写在变量后面,则该式子的值等于变量变化以后的值。
示例代码如下:
int n = 1;
int m= 1;
n++; //n的值变为2
++m; //m的值变为2
int k = n++; //n的初始值是2,则n++的值是2,结果n的值为3,k的值为2
int j = ++m; //m的初始值是2,则++m的值是3,结果m的值是3,j的值为3
同理,--也是这样。
下面是一个稍微综合点的示例:
int a = 0;
int b = 0;
a = b++; //a为0,b为1
a = ++b; //a为2,b为2
b = a++; //a为3,b为2
a = ++b; //a为3,b为3
说明:注释部分为对应行代码运行以后,a和b的值。
在程序开发中,可以使用该区别简化代码的书写,但是不推荐这样做,因为这样将增加阅读代码的难度。
l +、-
前面介绍过加减运算符,其实+、-还有另外一个意义,也就是代表正负,通常情况下正号可以省略,而负号可以和数值、变量以及运算式进行结合,示例代码如下:
int a = 0;
int b = 1;
int c = -5;
c = -a;
c = -(a + b);
l ? :
这个运算符称为条件运算符,其作用是根据判断的结果获得对应的值,语法格式如下:
条件式 ? 值1 : 值2
语法要求条件式部分必须是boolean类型,可以是boolean值,也可以是boolean变量,或者是关系运算符或逻辑运算符形成的式子,值1和值2必须能够转换成相同的类型。
功能说明:如果条件式的结果是true,则整个式子的值取值1的值,否则取值2的值。示例代码如下:
int x = 10;
int y = 20;
int max = x > y ? x : y; //因为x大于y,则取变量x的值,然后赋值给max
int a = -10;
int abs = a > 0 ? a : -a; //实现求绝对值得功能
l ()
括号,也是运算符的一种,作用是可以让括号内部的计算首先进行,这个和数学上一致,只是程序代码中可以使用这个组合任意的合法运算式。示例代码为:
int a = 1 + 2 * 3;
int a = (1 + 2) * 3; //和以上代码的运行结果不一致
其实每个运算符都有自己的优先级,使用括号可以提升对应式子的优先级。关于运算符优先级的概念,后续将进行介绍。


实现Java Web程序的自动登录

puppylove123收录,使用标签:Java,时间:2008-6-9 3:17:52 | 相关网摘我也收藏

有很多Web程序中第一次登录后,在一定时间内(如2个小时)再次访问同一个Web程序时就无需再次登录,而是直接进入程序的主界面(仅限于本机)。实现这个功能关键就是服务端要识别客户的身份。而用Cookie是最简单的身从验证。

如果用户第一次登录,可以将用户名作为Cookie写到本地,代码如下:


Cookie cookie = new Cookie("user", user);
cookie.setMaxAge(365 * 24 * 3600);
cookie.setPath("/");
response.addCookie(cookie);

当用户再次访问程序时,服务端程序应该检测这个Cookie是否存在,代码如下:

Cookie[] cookies=request.getCookies();
for(Cookie cookie: cookies)
{
if(cookie.getName().equals(user))
{
// 如果user Cookie存在,进行处理
break;
}
}

尽管从客户端可以获得User Cookie,但这上Cookie可能存在很长时间,而且仅凭这个Cookie就自动登录并不安全,因此,可以在服务端使用一个Session来管理用户。也就是当第一次登录成功后,就创建一个Session,并将用户的某些信息保存在Session顺。代码如下:

HttpSession session =request.getSession();
session.setAttribute(user, user);
session.setMaxInactiveInterval(2 * 3600); // Session保存两小时

当再次访问程序时,确定了cookie存在后,就会继续验证User Session的存在,代码如下:

Cookie[] cookies=request.getCookies();
for(Cookie cookie: cookies)
{
if(cookie.getName().equals(user))
{
if(session.getAttribute(user) != null)
{
// 直接forward到主界面
break;
}
else
{
// forward到登录界面
}
}
}

虽然上面的代码可以很好地实现自动登录功能,但是当浏览器关闭,再次启动后,由于Servlet用于保存Session ID的JSESSIONID Cookie是临时的(也就是说不是持久Cookie,当浏览器关闭后,这个Cookie就会被删除),因此,需要将JSESSIONID进行持久化。代码如下:

HttpSession session = request.getSession();
session.setAttribute(user, user);
session.setMaxInactiveInterval(2 * 3600); // Session保存两小时
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(2 * 3600); // 客户端的JSESSIONID也保存两小时
session.setMaxInactiveInterval(interval)
cookie.setPath("/");
response.addCookie(cookie);


如果使用上面的代码,即使浏览器关闭,在两小时之内,Web程序仍然可以自动登录。

如果我们自已加一个JSESSIONID Cookie,在第一次访问Web程序时,HTTP响应头有两个JSESSIONID,但由于这两个JSESSIONID的值完全一样,因此,并没有任何影响。如果在响应头的Set-Cookie字段中有多个相同的Cookie,则按着path和name进行比较,如果这两个值相同,则认为是同一个Cookie,最后一个出现的Cookie将覆盖前面相同的Cookie,如下面的两个Cookie,最后一个将覆盖前一个:

Set-Cookie: JSESSIONID=DDB2274CAC6739E1D6747B0043D5D90E; Path=/web

Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2008 05:02:50 GMT; Path=/web

由于下面两个Cookie的path不同,因此,它们是完全不同的两个Cookie:

Set-Cookie: JSESSIONID=DDB2274CAC6739E1D6747B0043D5D90E; Path=/web1

Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2008 05:02:50 GMT; Path=/web2


谁有其他的方法实现自动登录,请跟贴!



共23个网摘 [ 1 ] 

puppylove123/相关标签



网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
Copyright © 2000-2008, CSDN.NET, All Rights Reserved