昨天跟朋友一起吃飯,他說到兩個Integer類型值比較是否相等的問題。經理也在這里把java的Integer值比較的問題拿出來說一說。因為在面試的時候這個是經常遇到的問題。
首先給大家看一個例子:
1
public 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
當是當我們變換一下值
1
public 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)這個方法。
1
public 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 閱讀(24800) |
評論 (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 閱讀(2585) |
評論 (4) |
編輯 收藏
看了很多Cognos建模概念性的東西,一直被‘維度’這個概念困擾。Cognos把數據看成一個立方體,例如:我們把產品、地區、時間組成一個立方體,那么維度就相當于這個立方體的坐標軸,各個維度的每個交點上面的值就是量度(即數據)

這是對模型設計一個非常重要的概念,因為平面取值的搜索條件是2個,而三圍取值的搜索條件是3個,這樣一來搜索速度會很大程度的提升。
最重要的還不僅僅如此,因為維度還可以分層的,就是說如上圖的例子,時間是可以分為,年、月、日,而產品可以分為產品系列、類型、和品牌產品,地區也可以分為地域、國家和部門。這樣一來就是一個多維多層級的數據模型。

再一個概念就是類別。類別其實是維度多面性的一個體現。他相當于是在每一層上又多加了一個拓展,以地區為例。

那么有了這些概念,我們在建模,不應該說是在建立數據庫平面模型的時候就應該按照這樣的概念去設計數據庫。畢竟兩個平面表就可以組成一個立方體的多維數據表,而表中的字段、數據可以用層和類的關系來模擬。真是受益匪淺啊~
posted @
2010-05-26 11:03 張元Won 閱讀(1151) |
評論 (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 閱讀(5012) |
評論 (8) |
編輯 收藏