#
以前在使用 js 日歷時,沒有使用過 jQuery Datepicker,今天第一次使用發現非常的好用。使用時需要將日歷文字顯示為中文,打開前邊的鏈接在文章底部就可以看到將 jQuery Datepicker 文字顯示為中文的方法,在http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/可以看到各種版本的語言,中文文件內容如下:
jQuery(function($){
$.datepicker.regional['zh-CN'] = {
closeText: '關閉',
prevText: '<上月',
nextText: '下月>',
currentText: '今天',
monthNames: ['一月','二月','三月','四月','五月','六月',
'七月','八月','九月','十月','十一月','十二月'],
monthNamesShort: ['一','二','三','四','五','六',
'七','八','九','十','十一','十二'],
dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
dayNamesMin: ['日','一','二','三','四','五','六'],
weekHeader: '周',
dateFormat: 'yy-mm-dd',
firstDay: 1,
isRTL: false,
showMonthAfterYear: true,
yearSuffix: '年'};
$.datepicker.setDefaults($.datepicker.regional['zh-CN']);
});
使用時引入該文件, jQuery Datepicker 就會顯示簡體中文,但為了tb網站性能,最好將它整合到一個 js 文件中。
$(document).ready(function() {
$("#sdate,#edate").datepicker();
});
使用時也可以添加其他的選項,如下所示,具體的可以參考 jQuery Datepicker 官方文檔。
$(document).ready(function () {
$("#sdate,#edate").datepicker({
numberOfMonths: 2, //顯示兩個月
minDate: 0 //從當前日期起可選
});
});
本篇簡單介紹了下 jQuery UI Datepicker 顯示中文的方法,希望能對遇到這個問題又不太熟悉英文的朋友帶來一點幫助
addinput.js
//======================
//功能:在表單中input file控件
//參數:parentID---要插入input file控件的父元素ID
// inputID----input file控件的ID,這個一定要和name保持一致的,否則會出問題
// maxNum --- 最大數量 0為不限制
//======================
function createInput(parentID,inputFileID, maxNum){
if (maxNum > 0) {
x=document.getElementsByName(inputFileID);
y=x.length;
if (y >= maxNum) {
alert('最多只允許添加' + maxNum + '個');
return false;
}
}
var parent=$G(parentID);//獲取父元素
var div=document.createElement("div");//創建一個div容器tb用于包含input file
var x=parseInt(Math.random()*(80-1))+1;
var divName=inputFileID+x.toString();//隨機div容器的名稱
div.name=divName;
div.id=divName;
var aElement=document.createElement("input"); //創建input
aElement.name=inputFileID;
aElement.id=inputFileID;
aElement.type="text";//設置類型為file
aElement.className = "dynInputLen";
var delBtn=document.createElement("input");//再創建一個用于刪除input file的Button
delBtn.type="button";
delBtn.value=" ";
delBtn.className = "btn_del";
delBtn.onclick=function(){ removeInput(parentID,divName)};//為button設置tbonclick方法
div.appendChild(aElement);//將input file加入div容器
div.appendChild(delBtn);//將刪除按鈕加入div容器
parent.appendChild(div);//將div容器加入父元素
}
//============================
//功能:刪除一個包含input file的div 容器
//參數:parentID---input file控件的父元素ID
// DelDivID----個包含input file的div 容器ID
//============================
function removeInput(parentID,DelDivID){
var parent=$G(parentID);
parent.removeChild($G(DelDivID));
}
//通過元素ID獲取文檔中的元素
function $G(v){return document.getElementById(v);}
在html里引入addinput.js文件.html代碼如下:
<div id="div_zc" class="dynInput"> |
|
<input name="zhuancheng[]" type="text" id="zhuancheng" value="" maxlength="50" /> |
|
</div> |
|
<div style="clear:both;margin-top:10px; padding-left:5px;"> |
|
<input type="button" onClick="createInput('div_zc','zhuancheng[]', 3)" name="button" id="button" value="+ 添加(限3條)" class="btn_add"> |
可以設定最多可以添加多少個input,如果設置為0的話,則表示不限制數量。
在網上,看到一個問題 “什么是全局變量?”說實話,這個問題我想了一會兒。覺得有二義性,可能大部分人會說,只要是在堆棧外面定義的 就是全局。 我覺得,全局這個概念,我想反問提問者,是線程全局?進程全局? 好吧,我今天想說說后者的。其實,在寫hook的時候,大家都知道,進程需要共享dll中的全局變量。沒錯,就是它,我覺得被進程共享的 才叫全局。
- #pragma comment (linker, "/SECTION:GlobalValue,RWS")
-
- #include <iostream>
-
- #pragma data_seg("GlobalValue")
- int g_iCnt = 1000;
- #pragma data_seg()
-
- int PlusShow()
- {
- return printf("PlusShow %d",++g_iCnt);
- }
-
- int Show()
- {
- return printf("Show %d",g_iCnt);
- }
-
- int main(int argc)
- {
- if(argc < 2)
- {
- return Show();
- }
-
- PlusShow();
- getchar();
- return 0;
- }
#pragma comment (linker, "/SECTION:GlobalValue,TBRWS")
#include <iostream>
#pragma data_seg("GlobalValue")
int g_iCnt = 1000;
#pragma data_seg()
int PlusShow()
{
return printf("PlusShow %d",++g_iCnt);
}
int Show()
{
return printf("Show %d",g_iCnt);
}
int main(int argc)
{
if(argc < 2)
{
return Show();
}
PlusShow();
getchar();
return 0;
}
其實 不同段放的 不僅僅是變量。可以是函數 或者對象,非常靈活。看你自己怎么用了:)
- @charset "utf-8";
-
- /* =Reset default browser CSS. Based on work by Eric Meyer:http://meyerweb.com/eric/tools/css/reset/index.html
- -------------------------------------------------------------- */
- html, body, div, span, applet, object, iframe,
- h1, h2, h3, h4, h5, h6, p, blockquote, pre,
- a, abbr, acronym, address, big, cite, code,
- del, dfn, em, font, ins, kbd, q, s, samp,
- small, strike, strong, sub, sup, tt, var,
- dl, dt, dd, ol, ul, li,
- fieldset, form, label, legend,
- table, caption, tbody, tfoot, thead, tr, th, td { margin:0; padding:0;}
- :focus { outline:0;}
- ol, ul { list-style:none;}
- h1, h2, h3, h4, h5, h6 { font-size:100%; font-weight:normal;}
- /* tables still need 'cellspacing="0"' in the markup */
- table { border-collapse:separate; border-spacing:0;}
- caption, th, td { font-weight:normal; text-align:left;}
- blockquote:before, blockquote:after,
- q:before, q:after { content:'';}
- blockquote, q { quotes:'' '';}
- a img { border:0;}
- article, aside, details, figcaption, figure,
- footer, header, hgroup, menu, nav, section { display:block;}
-
- /* =Structure
- ----------------------------------------------- */
- body { font:12px/1.5 'Microsoft yahei', Tahoma, Geneva, sans-serif; color:#666; background:#d5d8dd;}
- a { text-decoration:none; color:#4a5566;}
- a:hover { text-decoration:underline; color:#3061b0;}
- .area { width:960px; margin:auto;}
- .pt { padding-top:20px; !important;}
- .mb { margin-bottom:20px !important;}
- .clearfix:after { content:'.'; display:block; height:0; clear:both; visibility:hidden; font-size:0;}
- .clearfix { min-height:1%;}
- .red { color:#c33;}
- .tright { text-align:right;}
- .dis { display:none !importantb;}
-
- /* = Layout
- ----------------------------------------------- */
- /* header */
-
-
- /* body */
-
-
- /* footer */
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
-
- public class A {
- public static void main(String[] args) throws ParseException{
- Date d1 = Calendar.getInstance().getTime();
- String s1 = new SimpleDateFormat("yyyy"+"-"+"MM"+"-"+"dd HH" + ":" + "mm" + ":" + "ss").format(d1);
- System.out.println("s1==="+stb1);
-
- String time = "2011-08-13 14:42:43";
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- Date dd= sdf.parse(time.toString());
- String ss = new SimpleDateFormat("yyyy"+"-"+"MM"+"-"+"dd HH" + ":" + "mm" + ":" + "ss").format(dd);
- System.out.println("ss==="+ss);
-
- int i = d1.compareTo(dd);
- if(i<0){
- System.out.println("d1更早");
- }else if(i==0){
- System.out.println("d1一樣");
- }else{
- System.out.println("dd更早");
- }
-
- }
- }
1.將jdbc操作改成批處理 addBatch(); //添加批處理
2.使用PreparedStatement
代碼:
eg:
- Connection conn = DBUtils.getInstance().getConnetion();
-
- conn.setAutoCommit(false );
-
- PreparedStatement pstmt = null;
-
- try
-
- pstmt = conn.preparedStatement("insert into test1(a,b) vlaues (?,?)");
-
- pstmt.clearBatch();
-
- for(int i = 0; i<100000;i++){
-
- pstmt.setInt(1,i);
-
- pstmt.setString(2,"value"+i);
-
- pstmt.addBatch();
-
- if(i % 10000){
-
- pstmt.executbeBatch();
-
- }
-
-
-
- }
-
-
-
-
-
- pstmt.executeBatch();
-
-
-
- conn.commit();
-
- } catch(Exception e) {
-
- conn.rollback();
-
- } finally {
-
- conn.setAutocommit(true);
-
- }
數組有四種定義的方式
使用構造函數:
var a = new Array();
var b = new Array(8);
var c = new Array("first", "second", "third");
或者數組直接量:
var d = ["first", "second", "third"];
屬性
Array只有一個屬性,就是length,length表示的是數組所占內存空間的數目,而不僅僅是數組中元素的個數,在剛才定義的數組中,b.length的值為8
<script>
var a = new Array("first", "second", "third")
a[48] = "12"
document.write(a.length)
//顯示的結果是49
</script>
數組的length屬性是可寫的,這是一個非常有意思的屬性,我們可以通過這種方法來截取數組
<script>
var a = new Array("first", "second", "third")
delete a[1]
document.write(a.length)
//顯示的結果是3,說明即使刪除也無法改變數組的長度
var a = new Array("first", "second", "third")
a.length = 1
document.write(a.length)
//顯示的結果是1,說明只剩下一個元素了
</script>
方法
這里并沒有包括IE和FF并不兼容的一些方法:
toString():把數組轉換成一個字符串
toLocaleString():把數組轉換成一個字符串
join():把數組轉換成一個用符號連接的字符串
shift():將數組頭部的一個元素移出
unshift():在數組的頭部插入一個元素
pop():從數組尾部刪除一個元素
push():把一個元素添加到數組的尾部
concat():給數組添加元素
slice():返回數組的部分
reverse():將數組反向排序
sort():對數組進行排序操作
splice():插入、刪除或者替換一個數組元素
toString()方法,toLocaleString()方法的作用類似,FF下的作用是完全相同的,IE的話如果元素是字符串,會在“,”后面加上一個空格,如果元素是數字,會擴展到兩位小數,兩者都會改變字符串的length屬性,所以考慮到兼容性,盡量不要使用toLocaleString()方法。
<script>
var a = new Array(1, 2, 3, [4, 5, [6, 7]])
var b = a.toString() //b為字符串形式的 "1, 2, 3, 4, 5, 6, 7"
var c = new Array(1, 2, 3, [4, 5, [6, 7]])
var d = c.toLocaleString() //d為字符串形式的 "1, 2, 3, 4, 5, 6, 7"
//toString()方法和toLocaleString()方法都可以拆解多維數組
</script>
join()方法將數組中的所有元素轉換成字符串,然后連接起來,這剛好和String的split()方法是一個相反的操作。join()默認是使用“,”作為分隔符,當然你也可以在方法中指定分隔符
<script>
var a = new Array("first", "second", "third")
var s = a.join("...")
document.write(s)
//顯示的結果是“first...second...third”
</script>
pop()方法可以從數組尾部刪除若干個元素,push()方法把一個元素添加到數組的尾部,這兩個方法剛好是兩個相反的操作。兩個都是對原來的數組進行操作,但是要注意push()方法返回的是新的數組的長度,而pop()方法則返回被刪去的那個元素。
<script>
var a = new Array(1, 2, 3)
var b = a.push(4,5,[6,7]) //a為[1, 2, 3, 4, 5, [6, 7]] b為6 注意tbpush()方法不會幫你打開一個數組
var c = new Array(1, 2, 3, 4, "first")
var d = c.pop() //c為[1, 2, 3, 4] d為字符串形式的"first"
</script>
shift()方法可以從數組頭部刪除一個元素,unshift()方法把若干元素添加到數組的頭部,這兩個方法剛好是兩個相反的操作。兩個都是對原來的數組進行操作,但是要注意unshift()方法返回的是新的數組的長度,而shift()方法則返回被刪去的那個元素。
<script>
var a = new Array(1, 2, 3)
var b = a.unshift(4,5,[6,7]) //a為[4, 5, [6, 7], 1, 2, 3] b為6 注意unshift()方法不會幫你打開一個數組,還有就是被插入數值的順序
var c = new Array("first", 1, 2, 3, 4)
var d = c.shift() //c為[1, 2, 3, 4] d為字符串形式的"first"
</script>
concat()方法可以返回一個在原有數組上增添了元素的數組,元素用“,”分隔,元素中如果有數組,將被展開并繼續添加,但不支持多維數組形式的展開添加
<script>
var a = new Array("first", "second", "third")
s = a.concat("fourth",["fifth", "sixth"],["seventh", ["eighth", "ninth"]])
document.write(s[7])
//顯示的結果是“eighth, ninth”,說明“eighth, ninth”是以數組的形式被添加了進去,此是s的值為["first", "second", "third", "fourth", "fifth", "sixth", "seventh", ["eighth", "ninth"]]
</script>
slice()方法返回數組的一個片斷,或者說是子數組。slice()的參數表示字數組的始末位置,如果只有一個參數,就表示從該處開始一直取到最后,如果參數出現負數,則表示倒數的某個位置。slice(start,end) //表示數組從從下標為start(包含這個)的地方開始到end(不包含這個)
<script>
var a = new Array(1, 2, 3, 4, 5)
var b = a.slice(3) //b為[4, 5]
var c = a.slice(-3) //c為[3, 4, 5]
var d = a.slice(1,-1) //d為[2, 3, 4]
var e = a.slice(-3,-1) //e為[3, 4]
</script>
reverse()方法將數組反向排序,他并不創建和返回一個新的數組,而是在原有的數組上進行操作
<script>
var a = new Array("first", "second", "third")
a.reverse()
document.write(a)
//顯示的結果是“third,second,first”,這時候數組的順序已經顛倒了
</script>
sort()方法的作用是對數組進行排序,這是一個非常奇特的方法,我不知道當初創作他的人是出于懶惰還是聰明,這是一個讓我印象深刻的方法。
sort()方法的參數是一個有兩個參數,并且有返回值的函數,如果返回的值大于零,則說明前一個參數比后一個參數大,等于零則相等,小于零說明前一個參數比后一個小,而相對小的那個參數將出現在排序的前列。
sort()方法直接在數組上進行操作,同時也返回值,但是兩者似乎是等價的。sort()方法默認是用字母的順序進行排序
<script>
var a = new Array(33, 4, 111, 543)
a.sort(way)
function way(x, y){
if (x % 2 ==0)
return 1;
if (x % 2 !=0)
return -1;
}
//排序的結果是使奇數在前偶數在后
</script>
splice()方法的作用是插入、刪除或者替換一個數組元素,他tb不光會在原有的數組上進行修改,還會返回被處理掉的內容,因此這是一個功能強大,但是不容易使用的方法,splice()方法用前兩個參數進行定位,余下的參數表示插入部分。
<script>
var a = new Array(1, 2, 3, 4, 5)
var b = a.splice(2) //a為[1, 2] b為[3, 4, 5]
var c = new Array(1, 2, 3, 4, 5)
var d = c.splice(2,2) //c為[1, 2, 5] d為[3, 4]
var e = new Array(1, 2, 3, 4, 5)
var f = f.splice(-4,2) //e為[1, 4, 5] f為[2, 3]
var g = new Array(1, 2, 3, 4, 5)
var h = g.splice(-2,-2) //第二個參數表示長度,因此負數在此無效
var i = new Array(1, 2, 3, 4, 5)
var j = i.splice(2,2,"first","second","third") //i為[1, 2, "first", "second", "third", 5] j為[3, 4] 后面部分會自動前后移動,以保持數組的連續性
var k = new Array(1, 2, 3, 4, 5)
var l = k.splice(2,2,["first","second"],"third") //k為[1, 2, ["first", "second"], "third", 5] l為[3, 4] splice()方法不會展開數組,只直接寫入
</script>
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
/***
* @author xuechong
* 6/11/2010 16:58
* DomXMLString.java
* 概述:純java方式訪問遠程WebService接口返回的xml格式的數據保存在本地
*/
public class DomXMLString{
private static String SERVICES_HOST = "www.webxml.com.cn";
//遠程WebService接口url
private static String NETDATA_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getRegionProvince";
//訪問遠程WebService接口返回的xml格式的數據保存在本地的絕對路徑
private static String LOCAL_PC_SAVEFILE_URL = "E:dataTest/netDataToLocalFile.xml";
private DomXMLString(){}
public static void main(String[] args) throws Exception{
Document document = getProvinceCode(NETDATA_URL);
helloOK(document, LOCAL_PC_SAVEFILE_URL);
}
/*返回一個Document對象*/
public static Document getProvinceCode(String netXMLDataURL){
Document document = null;
DocumentBuilderFactory documentBF = DocumentBuilderFactory.newInstance();
documentBF.setNamespaceAware(true);
try{
DocumentBuilder documentB = documentBF.newDocumentBuilder();
InputStream inputStream = getSoapInputStream(netXMLDataURL); //具體webService相關
document = documentB.parse(inputStream);
inputStream.close();
}catch(DOMException e){
e.printStackTrace();
return null;
}catch(ParserConfigurationException e){
e.printStackTrace();
return null;
}catch (SAXException e){
e.printStackTrace();
return null;
}catch(IOException e){
e.printStackTrace();
return null;
}
return document;
}
/*返回InputStream對象*/
public static InputStream getSoapInputStream(String url){
InputStream inputStream = null;
try{
URL urlObj = new URL(url);
URLConnection urlConn = urlObj.openConnection();
urlConn.setRequestProperty("Host", SERVICES_HOST); //具體webService相關
urlConn.connect();
inputStream = urlConn.getInputStream();
}catch(MalformedURLException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
return inputStream;
}
/*訪問遠程(WebService)xml數據后返回的xml格式字符串并生成為tb本地文件*/
public static void helloOK(Document document, String savaFileURL){
TransformerFactory transF = TransformerFactory.newInstance();
try{
Transformer transformer = transF.newTransformer();
DOMSource source = new DOMSource(document);
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "YES");
PrintWriter pw = new PrintWriter(new FileOutputStream(savaFileURL));
StreamResult result = new StreamResult(pw);
transformer.transform(source, result);
System.out.println("生成xml文件成功!");
}catch(TransformerConfigurationException e){
System.out.println(e.getMessage());
}catch(IllegalArgumentException e){
System.out.println(e.getMessage());
}catch(FileNotFoundException e){
System.out.println(e.getMessage());
}catch(TransformerException e){
System.out.println(e.getMessage());
}
}
}
在應用程序開發過程中,使用的最多的數據類型就是字符串 。在Java語言平臺中也是如此。為此掌握字符串的處理技巧,無疑是一位數據庫管理員必須要掌握的技能。筆者這里就給大家介紹如何利用字符串連接來解決一些實際的問題。
一、 字符串連接概述。
在編寫應用程序的時候,我們往往需要將多個字符串連接起來,來完成特定的功能。如現在有兩個字符串變量,分別為名字(變量名為name)和年齡(變量名為age)。現在需要在屏幕上輸出“我的名字是某某,年齡多少”這個字符串。這個語句該如何寫呢?可以寫為“我的名字是”+name+“,年齡為”+age。也就是說,在Java語言中,可以通過+號將多個字符串(包括變量)連接成一個字符串。在屏幕上打印出來或者將其賦值給一個新的字符串變量。在進行這個字符串連接的時候,大家需要注意一點。也許有些程序員以前學過其他的開發語言,如SQL語言等等。不同的語言采用的字符串連接字符是不同的。如在SQL中采用的就是||符號。有時候,在開發應用程序的時候,開發人員可能會混淆。如在利用JAVA語言開發應用程序,在代碼中需要加入SQL語句從數據庫中查詢數據。此時就有可能在JAVA代碼中和SQL代碼中都要用到字符串連接的情況(SQL代碼中要將多個字段的內容連接為一個字段)。由于兩個代碼所采用的連接符號不同,所以可能會搞錯。
二、 利用字符串連接解決分行問題。
在JAVA開發平臺中,可以利用+號將多個字符串合并為一個字符串。不過在實際工作中,這個合并功能往往還可以幫助系統開發人員解決一些棘手的問題。如根據語法規定,JAVA代碼中一句相連的字符串不能夠分開在兩行中書寫。這是什么意思呢?如現在有一個字串比較長,為“我的名字叫蘿卜,今年29歲,在寧波工作”。如果將這個字符串寫在同一行的話,那么這一行會很長,從而影響代碼的閱讀。但是,筆者希望其在屏幕上輸出或者保存在文件中時,則是在同一行。在這種情況下,該如何處理呢?
確實,這是應用程序開發人員在程序開發過程中經常遇到的一個問題。因為在書寫代碼時,一個好的程序開發人員應該兼顧到其代碼的美觀,這有助于程序開發人員閱讀代碼。畢竟有時候需要多個程序開發人員一同完成某個任務。而不能夠只完成某個特定的功能就可以了。此時,為了代碼的美觀與更好的閱讀性,有經驗的程序開發人員往往會利用這個+號連接字符來處理這個分行的問題。
由于對于長的字符串,JAVA代碼不能夠分為兩行來寫。否則的話,系統就會提示語法錯誤。遇到這種情況時,為了提高閱讀性,我們往往要求程序開發人員把他們分為兩行,同時利用加號將他們連接起來。如下所示:
“我的名字叫蘿卜,今年29歲,”+
“在寧波工作”
也就是說,應用程序開發人員可以使用+號將兩個字符串連接起來,然后在+號處換行,從而將兩個字符串連接起來。此時,JAVA編譯器會認為這是合法的,允許程序開發人員采用這個技巧來對字符串進行合理的分行。所以說,利用字符串連接可以有效的解決分行問題。
三、 利用字符串連接來實現數據類型的自動轉換。
在各種開發語言中,都有各種各樣的數據類型。有時候為了滿足特定的需要,要對他們進行數據類型的轉換。如需要將數字類型的數據轉換為字符串類型的數據;再如將某個字符串“2432”轉換為數值類型的數據。在JAVA語言的開發平臺中,數據類型的轉換有兩種方式,分別為隱式轉換與顯示轉換。一般情況下,從低級數據類型向高級類型的轉換,系統會自動進行轉換,而不需要程序員進行任何的手工操作或者指定。這個從低級數據類型向高級數據類型的轉換,就叫做隱式轉換。在對數據類型進行轉換的時候,程序開發人員需要遵守嚴格的規則,否則的話容易出現錯誤。如從低精度數據類型向高精度數據類型轉換的時候,則永遠不會發生溢出,通常情況下都會成功。而如果把高精度數據類型轉換為低精度數據類型的話,則就會發生溢出錯誤,從而導致部分信息丟失,甚至無法正常轉換。
不過在JAVA開發平臺中,除了以上這兩種轉換方式外,還有一種數據類型的轉換方法。就是如果某個字符串和某個變量一起(這個變量可能是數值型的數據或者是日期型的數據)利用+號連接起來時,系統會自動對這個變量進行轉換,會將其轉換為字符串數據類型,然后再與原先的字符串連接起來。
也就是說,字符串也可同其他基本數據類型進行連接。如果將字符串同這些數據類型進行連接時(如數值型的數據),會將這些數據直接轉換成字符串。如上面那個例子中“我的名字是”+name+“,年齡為”+age這個字符串,age這個變量為數值型的數據,而其他為字符串的數據。現在程序開發人員就可以利用這個+號將不同數據類型的字符串連接起來。不過最后的數據類型都會字符串的數據類型。即系統會先將變量age轉換為字符型數據,然后再跟其他字符串數據類型進行連接。那么在后臺中,這到底是如何實現呢?如果在利用+號來進行連接的時候,如果某個變量不是字符串的數據類型,則系統回自動調用一個toSring方法,將非字符串的數據類型轉換成字符串的數據類型,再進行合并。由于這個過程是系統自動完成的,所以程序開發人員需要特別的注意。一般來說,只要將+號運算符的一個操作數是字符串,編譯器就會將另一個操作數轉換成字符串形式。所以程序開發人員應謹慎地將其他數據類型與字符串相連,以免得到意想不到的結果。如將這tb個利用+號連接起來的內容,如果其中有個操作數是字符型數據的話,那么將其賦值給數值型的變量時,就會導致莫名其妙的問題。這種問題很可能存在。因為這個+號,除了可以連接字符串,還可以用來對數值型的數據進行四則運法運算。所以,在進行四則運法運算時,要確保各個操作數都是數值型的。否則的話,這個后果就可想而知了。
另外需要再提一句的是,如果在進行加法運算時,需要注意其數據類型的隱式轉換。如現在有三個操作數,其中兩個操作數其小數點保留兩位;另外一個操作數其小數點保留為1位。而最后賦值給一個變量,其保留小數位數3位。這就是一個涉及到不同精度的數據類型的數值型數據轉換問題。那么最終的結果是什么呢?筆者這里賣個關,大家若想知道結果的話,可以回去編個程序測試一下。有時候,筆者告訴你們答案,讀者并不一定記得住。所以,筆者在這里就點倒為止。
總之一句話,+號這個連接符號,不僅可以連接各個字符串,而且還用來完成分行與數據類型的隱式轉換。為此筆者建議,各個程序開發人員需要注意這方面細節,一定能夠獲得不少的收獲。
對于J2EE,我們知道當開發應用時,在架構設計階段的決定將對應用的性能和可擴展性產生深遠的影響。現在當開發一個應用項目時,我們越來越多地注意到了性能和可擴展性的問題。應用性能的問題比應用功能的不豐富問題往往更為嚴重,前者會影響到所有用戶,而后者只會影響到碰巧使用該功能的那些用戶。
作為應用系統的負責人,一直被要求"要少花錢多辦事"----用更少的硬件,更少的網絡帶寬,以及更短的時間完成更多的任務。J2EE通過提供組件方式和通用的中間件服務是目前首選的最優方式。而要能夠構建一個具有高性能和可擴展性的J2EE應用,需要遵循一些基本的架構策略。
緩存(Caching)
簡單地說,緩存中存放著頻繁訪問的數據,在應用的整個生命周期中,這些數據存放在持久性存儲器或存放在內存中。在實際環境中,典型的現象是在分布式系統中每個JVM中有一個緩存的實例或者在多個JVM中有一個緩存的實例。
緩存數據是通過避免訪問持久性存儲器來提高性能的,否則會導致過多的磁盤訪問和過于頻繁網絡數據傳輸。
復制
復制是通過在多臺物理機器上創建指定應用服務的多個拷貝來獲得整體更大吞吐效率。理論上看,如果一個服務被復制成兩個服務,那么系統將可處理兩倍的請求。復制是通過單一服務的多個實例的方式從而減少每個服務的負載來提高性能的。
并行處理
并行處理將一個任務分解為更為簡單的子任務,并能夠同時在不同的線程中執行。
并行處理是通過利用J2EE層執行模式的多線程和多CPU特點來提高性能。
tb與使用一個線程或CPU處理任務相比,以并行方式處理多個子任務可以使操作系統在多個線程或處理器中進行分配這些子任務。
異步處理
應用功能通常被設計為同步或串行方式。異步處理只處理那些非常重要的任務部分,然后將控制立即返回給調用者,其他任務部分將在稍后執行。
異步處理是通過縮短那些在將控制返回給用戶之前必須處理的時間來提高性能的。雖然都做同樣多的事情,但是用戶不必等到整個過程完成就可以繼續發出請求了。
資源池
資源池技術使用的是一套準備好的資源。與在請求和資源之間維持1:1的關系的不同,這些資源可被所有請求所共享。資源池的使用是有條件的,需要衡量下面兩種方式的代價:
A、維持一套可被所有請求共享資源的代價
B、為每個請求都重新創建一個資源的代價
當前者小于后者時,使用資源池才是有效率的。
希望通過本文介紹的是J2EE中的五個核心策略,對你有幫助。