昨天跟朋友一起吃饭,他说到两个Integer类型值比较是否相等的问题。经理也在这里把java的Integer值比较的问题拿出来说一说。因为在面试的时候这个是经常遇到的问题。
首先给大家看一个例子:
1public class Test {
2
3 /** *//**
4 * 关于Integer大小比较问题
5 * @author 经理
6 */
7 public static void main(String[] args) {
8 Integer a = 10;
9 Integer b = 10;
10 System.out.println("a==b : " + String.valueOf(a==b));
11 System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
12 }
13}
14
运行一下,在控制台得到的结果是这样的
a==b : true
a.equals(b) : true
当是当我们变换一下值
1public class Test {
2
3 /** *//**
4 * 关于Integer大小比较问题
5 * @author 经理
6 */
7 public static void main(String[] args) {
8 Integer a = 1000;
9 Integer b = 1000;
10 System.out.println("a==b : " + String.valueOf(a==b));
11 System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
12 }
13}
运行一下,控制台的结果又是
a==b : false
a.equals(b) : true
这是什么原因呢?我当时也有点犯糊涂。有点冲动就直接开源码看了。
实际上在我们用Integer a = 数字;来赋值的时候Integer这个类是调用的public static Integer valueOf(int i)这个方法。
1public static Integer valueOf(int i) {
2 if(i >= -128 && i <= IntegerCache.high)
3 return IntegerCache.cache[i + 128];
4 else
5 return new Integer(i);
6 }
我们来看看ValueOf(int i)的代码,可以发现他对传入参数i做了一个if判断。在-128<=i<=127的时候是直接用的int原始数据类型,而超出了这个范围则是new了一个对象。我们知道"=="符号在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。那么这个问题就解决了。
至于为什么用int型的时候值会在-128<=i<=127范围呢呢?我们知道八位二进制的表示的范围正好就是-128到127。大概就是因为这吧。
把平时出现的问题记录下来,自己就可以一点一点进步了。
posted @
2010-07-24 16:03 张元Won 阅读(24782) |
评论 (12) |
编辑 收藏
JAVA经常会有取properties文件的需求,因为一些host、port客户应该能自行修改。所以这些东东应该放在一个配置文件中,而不是编译成class文件。当然,这样的配置文件可以是xml文件也可以是property文件,取的方法也不一样。经理在这里介绍一个经常用的方法。
这里写了一个例子,先给大家看看目录结构
经理是用properties文件来做的,因为这个非常简单,而且读取properties文件的速度比读xml要快的多。
这里的主要文件有两个:config.properties是配置文件,Test是测试java类
config文件的内容就是一个ip一个port
原理很简单就是首先取得config.properties的二进制流,然后用JAVA封装好的Properties类把这个流load进来,最后只需要用Properties对象中的getProperty(String key)方法就可以取值了。是不是很简单。
给大家看看代码:
我们来运行下结果:
成功了~
posted @
2010-07-12 11:48 张元Won 阅读(2558) |
评论 (4) |
编辑 收藏
看了很多Cognos建模概念性的东西,一直被‘维度’这个概念困扰。Cognos把数据看成一个立方体,例如:我们把产品、地区、时间组成一个立方体,那么维度就相当于这个立方体的坐标轴,各个维度的每个交点上面的值就是量度(即数据)
这是对模型设计一个非常重要的概念,因为平面取值的搜索条件是2个,而三围取值的搜索条件是3个,这样一来搜索速度会很大程度的提升。
最重要的还不仅仅如此,因为维度还可以分层的,就是说如上图的例子,时间是可以分为,年、月、日,而产品可以分为产品系列、类型、和品牌产品,地区也可以分为地域、国家和部门。这样一来就是一个多维多层级的数据模型。
再一个概念就是类别。类别其实是维度多面性的一个体现。他相当于是在每一层上又多加了一个拓展,以地区为例。
那么有了这些概念,我们在建模,不应该说是在建立数据库平面模型的时候就应该按照这样的概念去设计数据库。毕竟两个平面表就可以组成一个立方体的多维数据表,而表中的字段、数据可以用层和类的关系来模拟。真是受益匪浅啊~
posted @
2010-05-26 11:03 张元Won 阅读(1130) |
评论 (0) |
编辑 收藏
最近进了新公司的数据挖掘与分析组,因公司需求开始学习Cognos,前几个星期看了下Cognos的主要设计器,没想到经理马上就要我搞Cognos的sdk,这个东西国内用的人很少,网上的资料也相当少,只能硬着头皮自己看官方的文档和例子。
这里就把东西都记录下来。
首先,根据看的一些资料,所谓sdk其实是Cognos公布了一些自己在设计产品时候留下的接口,可以让客户从程序端灵活的调用。但是Cognos本身具有的设计功能已经灰常强大了,一般会用到sdk的公司基本上都是遇到很J8的甲方。不过这次也给了我很大的学习机会。
那么我这里写了一个用java访问Cognos建立的维度和量度,来生成报表。
一、准备工作
1.建立一个叫
zj_cognos_inter的javaweb项目,
我这里比较熟悉用struts于是自己把struts的框架也导进来了
2.找到Cognos自带的例子,
示例位置在cognos安装目录"c8"webapps"samples"WEB-INF"src"com"cognos"jspSample.
在这里可以看到一些工具类
我们把这些类考到项目中来
这些类是非常重要的,很多类如API.JAVA,LogonException等都是封装的方法类,一般不需要用,不过里面有很多的方法,可供我们学习。
在这里我们用的比较多的是CognosConnection和ReportBuilder这两个类。
这里我用了一个配置文件来保存一些静态参数
<?xml version="1.0" encoding="gb2312"?>
<cognos version="8.3">
<url_home>
<![CDATA[
http://localhost/cognos8
]]>
</url_home>
<url_report_prefix>
<![CDATA[
/cgi-bin/cognos.cgi?b_action=cognosViewer&ui.action=run&ui.object=
]]>
</url_report_prefix>
<url_report_suffix>
<![CDATA[
&run.outputFormat=&run.prompt=true&cv.header=false&cv.toolbar=false
]]>
</url_report_suffix>
<url_logoff>
<![CDATA[
/cgi-bin/cognos.cgi?b_action=xts.run&m=portal/logoff.xts&h_CAM_action=logoff
]]>
</url_logoff>
<url_cm>http://localhost:9300/p2pd/servlet/dispatch</url_cm>
<namespace>my cognos</namespace>
</cognos>
ServletContext application = getServlet().getServletContext();
HttpSession session = request.getSession();
String cfgPath = application.getRealPath("/WEB-INF/cfg.xml");
String cmUrl = ConfigUtil.parseXml(cfgPath,"url_cm");
//连接cognos服务
CognosConnection conn = new CognosConnection(cmUrl,application,session);
//-----如果是用匿名认证登陆就不需要这句话,如果是用的自己的认证就需要登陆一下
//bb是我的表空间,zhangyuan是我本机用户名,123是我本机的密码
conn.logon("bb", "zhangyuan", "123");
//创建一个报表生成器的实力类
ReportBuilder rb = new ReportBuilder(conn);
//指定生成报表的包
String packageSp = "/content/package[@defaultName='mbase']";
rb.createReport(packageSp);
//用Cognos sql来指定生成的列
String[] colRef = {"[business layer].[date].[mdate].[year]","[business layer].[date].[mdate].[day]","[business layer].[measures].[psend]"};
String[] titles = {"year","day","psend"};
rb.addColumns(titles, colRef);
//指定生成的报表名
String name = "ReportWizardReport ";
//增加报表
rb.saveReport(name);
posted @
2010-05-25 12:02 张元Won 阅读(4993) |
评论 (8) |
编辑 收藏