導航:首頁 > 編程語言 > java全兼容性代碼

java全兼容性代碼

發布時間:2023-06-11 07:04:49

㈠ 如何使這段java代碼兼容firefox與IE

試了半天,終於可以啦。你測試一下吧
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<script language="javascript" type="text/javascript">
function expandIt(el) {
var obj = eval("sub" + el);
var ocj = eval("main" + el);
if (obj.style.display == "none") {
obj.style.display = "block";//顯示子菜單
ocj.style.backgroundImage = "url(/user/skin/fold_2.gif)";//替換樣式
}else {
obj.style.display = "none";
ocj.style.backgroundImage = "url(/user/skin/fold_1.gif)";//替換樣式
}
}
</script>
<BODY>
<img src="1.gif">

<div class="main1" id="main1" onclick="expandIt(1)">menu1</div>
<ul class="sub" id="sub1" style="display:none">
<li><a href="1" target="Main">sub1</a></li>
<li><a href="1" target="Main">sub2</a></li>
<li><a href="1" target="Main">sub3</a></li>
</ul>
<div class="main2" id="main2" onclick="expandIt(2)">menu1</div>
<ul class="sub" id="sub2" style="display:none">
<li><a href="1" target="Main">sub1</a></li>
<li><a href="1" target="Main">sub2</a></li>
<li><a href="1" target="Main">sub3</a></li>
</ul>
</BODY>
</HTML>

㈡ JavaSript代碼的瀏覽器兼容問題

window.onload=function(){

}

㈢ JAVA 8可以兼容JAVA 6么

Java 8的6個問題

1. 並行Streams實際上可能會降低你的性能

Java8帶來了最讓人期待的新特性之–並行。parallelStream() 方法在集合和流上實現了並行。它將它們分解成子問題,然後分配給不同的線程進行處理,這些任務可以分給不同的CPU核心處理,完成後再合並到一起。實現原理主要是使用了fork/join框架。好吧,聽起來很酷對吧!那一定可以在多核環境下使得操作大數據集合速度加快咯,對嗎?

不,如果使用不正確的話實際上會使得你的代碼運行的更慢。我們進行了一些基準測試,發現要慢15%,甚至可能更糟糕。假設我們已經運行了多個線程,然後使用.parallelStream() 來增加更多的線程到線程池中,這很容易就超過多核心CPU處理的上限,從而增加了上下文切換次數,使得整體都變慢了。

基準測試將一個集合分成不同的組(主要/非主要的):

1
2

Map<Boolean, List<Integer>> groupByPrimary = numbers

.parallelStream().collect(Collectors.groupingBy(s -> Utility.isPrime(s)));

使得性能降低也有可能是其他的原因。假如我們分成多個任務來處理,其中一個任務可能因為某些原因使得處理時間比其他的任務長很多。.parallelStream() 將任務分解處理,可能要比作為一個完整的任務處理要慢。來看看這篇文章, Lukas Krecan給出的一些例子和代碼 。

提醒:並行帶來了很多好處,但是同樣也會有一些其他的問題需要考慮到。當你已經在多線程環境中運行了,記住這點,自己要熟悉背後的運行機制。

2. Lambda 表達式的缺點

lambda表達式。哦,lambda表達式。沒有lambda表達式我們也能做到幾乎一切事情,但是lambda是那麼的優雅,擺脫了煩人的代碼,所以很容易就愛上lambda。比如說早上起來我想遍歷世界盃的球員名單並且知道具體的人數(有趣的事實:加起來有254個)。

1
2
3
4

List lengths = new ArrayList();

for (String countries : Arrays.asList(args)) {

lengths.add(check(country));

}

現在我們用一個漂亮的lambda表達式來實現同樣的功能:

1

Stream lengths = countries.stream().map(countries -< check(country));

哇塞!這真是超級厲害。增加一些像lambda表達式這樣的新元素到Java當中,盡管看起來更像是一件好事,但是實際上卻是偏離了Java原本的規范。位元組碼是完全面向對象的,伴隨著lambda的加入 ,這使得實際的代碼與運行時的位元組碼結構上差異變大。閱讀更多關於lambda表達式的負面影響可以看Tal Weiss這篇文章。

從更深層次來看,你寫什麼代碼和調試什麼代碼是兩碼事。堆棧跟蹤越來越大,使得難以調試代碼。一些很簡單的事情譬如添加一個空字元串到list中,本來是這樣一個很短的堆棧跟蹤

1
2

at LmbdaMain.check(LmbdaMain.java:19)

at LmbdaMain.main(LmbdaMain.java:34)

變成這樣:

1
2
3
4
5
6
7
8
9
10
11
12
13

at LmbdaMain.check(LmbdaMain.java:19)

at LmbdaMain.lambda$0(LmbdaMain.java:37)

at LmbdaMain$$Lambda$1/821270929.apply(Unknown Source)

at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)

at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)

at java.util.stream.AbstractPipeline.Into(AbstractPipeline.java:512)

at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)

at java.util.stream.ReceOps$ReceOp.evaluateSequential(ReceOps.java:708)

at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)

at java.util.stream.LongPipeline.rece(LongPipeline.java:438)

at java.util.stream.LongPipeline.sum(LongPipeline.java:396)

at java.util.stream.ReferencePipeline.count(ReferencePipeline.java:526)

at LmbdaMain.main(LmbdaMain.java:39

lambda表達式帶來的另一個問題是關於重載:使用他們調用一個方法時會有一些傳參,這些參數可能是多種類型的,這樣會使得在某些情況下導致一些引起歧義的調用。Lukas Eder 用示例代碼進行了說明。

提醒:要意識到這一點,跟蹤有時候可能會很痛苦,但是這不足以讓我們遠離寶貴的lambda表達式。

3. Default方法令人分心

Default方法允許一個功能介面中有一個默認實現,這無疑是Java8新特性中最酷的一個,但是它與我們之前使用的方式有些沖突。那麼既然如此,為什麼要引入default方法呢?如果不引入呢?

Defalut方法背後的主要動機是,如果我們要給現有的介面增加一個方法,我們可以不用重寫實現來達到這個目的,並且使它與舊版本兼容。例如,拿這段來自Oracle Java教程中 添加指定一個時區功能的代碼來說:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

public interface TimeClient {

// ...

static public ZoneId getZoneId (String zoneString) {

try {

return ZoneId.of(zoneString);

} catch (DateTimeException e) {

System.err.println("Invalid time zone: " + zoneString +

"; using default time zone instead.");

return ZoneId.systemDefault();

}

}

default public ZonedDateTime getZonedDateTime(String zoneString) {

return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));

}

}

就是這樣,問題迎刃而解了。是這樣么?Default方法將介面和實現分離混合了。似乎我們不用再糾結他們本身的分層結構了,現在我們需要解決新的問題了。想要了解更多,閱讀Oleg Shelajev在RebelLabs上發表的文章吧。

提醒:當你手上有一把錘子的時候,看什麼都像是釘子。記住它們原本的用法,保持原來的介面而重構引入新的抽象類是沒有意義的。

4. 該如何拯救你,Jagsaw?

Jigsaw項目的目標是使Java模塊化,將JRE分拆成可以相互操作的組件。這背後最主要的動機是渴望有一個更好、更快、更強大的Java嵌入式。我試圖避免提及「物聯網」,但我還是說了。減少JAR的體積,改進性能,增強安全性等等是這個雄心勃勃的項目所承諾的。

但是,它在哪呢?Oracle的首席Java架構師, Mark Reinhold說: Jigsaw,通過了探索階段 ,最近才進入第二階段,現在開始進行產品的設計與實現。該項目原本計劃在Java8完成。現在推遲到Java9,有可能成為其最主要的新特性。

提醒:如果這正是你在等待的, Java9應該在2016年間發布。同時,想要密切關注甚至參與其中的話,你可以加入到這個郵件列表。

5. 那些仍然存在的問題

受檢異常

沒有人喜歡繁瑣的代碼,那也是為什麼lambdas表達式那麼受歡迎的的原因。想想討厭的異常,無論你是否需要在邏輯上catch或者要處理受檢異常,你都需要catch它們。即使有些永遠也不會發生,像下面這個異常就是永遠也不會發生的:

1
2
3

try {

httpConn.setRequestMethod("GET");

} catch (ProtocolException pe) { /* Why don』t you call me anymore? */ }

原始類型

它們依然還在,想要正確使用它們是一件很痛苦的事情。原始類型導致Java沒能夠成為一種純面向對象語言,而移除它們對性能也沒有顯著的影響。順便提一句,新的JVM語言都沒有包含原始類型。

運算符重載

James Gosling,Java之父,曾經在接受采訪時說:「我拋棄運算符重載是因為我個人主觀的原因,因為在C++中我見過太多的人在濫用它。」有道理,但是很多人持不同的觀點。其他的JVM語言也提供這一功能,但是另一方面,它導致有些代碼像下面這樣:

1
2
3

javascriptEntryPoints <<= (sourceDirectory in Compile)(base =>

((base / "assets" ** "*.js") --- (base / "assets" ** "_*")).get

)

事實上這行代碼來自Scala Play框架,我現在都有點暈了。

提醒:這些是真正的問題么?我們都有自己的怪癖,而這些就是Java的怪癖。在未來的版本中可能有會發生一些意外,它將會改變,但向後兼容性等等使得它們現在還在使用。

6. 函數式編程–為時尚早

函數式編程出現在java之前,但是它相當的尷尬。Java8在這方面有所改善例如lambdas等等。這是讓人受歡迎的,但卻不如早期所描繪的那樣變化巨大。肯定比Java7更優雅,但是仍需要努力增加一些真正需要的功能。

其中一個在這個問題上最激烈的評論來自Pierre-yves Saumont,他寫了一系列的文章詳細的講述了函數式編程規范和其在Java中實現的差異。

所以,選擇Java還是Scala呢?Java採用現代函數範式是對使用多年Lambda的Scala的一種肯定。Lambdas讓我們覺得很迷惑,但是也有許多像traits,lazy evaluation和immutables等一些特性,使得它們相當的不同。

提醒:不要為lambdas分心,在Java8中使用函數式編程仍然是比較麻煩的。

㈣ java 中文亂碼問題 utf-8和gbk的區別

字元均使用雙位元組來表示,只不過為區分中文,將其最高位都定成1。

至於UTF-版8編碼則是用以解決國際上字元權的一種多位元組編碼,它對英文使用8位(即一個位元組),中文使用24位(三個位元組)來編碼。對於英文字元較多的論壇則用UTF-8節省空間。

GBK包含全部中文字元;UTF-8則包含全世界所有國家需要用到的字元。

GBK是在國家標准GB2312基礎上擴容後兼容GB2312的標准(好像還不是國家標准)
UTF-8編碼的文字可以在各國各種支持UTF8字元集的瀏覽器上顯示。
比如,如果是UTF8編碼,則在外國人的英文IE上也能顯示中文,而無需他們下載IE的中文語言支持包。 所以,對於英文比較多的論壇 ,使用GBK則每個字元佔用2個位元組,而使用UTF-8英文卻只佔一個位元組。

UTF8是國際編碼,它的通用性比較好,外國人也可以瀏覽論壇,GBK是國家編碼,通用性比UTF8差,不過UTF8佔用的資料庫比GBK大

㈤ 為什麼Java兼容性好

因外Java是虛擬機運行機制,編譯生成的程序都是在虛擬機環境下運行的,所以在所有的系統下都能運行

閱讀全文

與java全兼容性代碼相關的資料

熱點內容
dede工具 瀏覽:507
5g網盟app怎麼下載 瀏覽:486
微信備份老是連接中斷 瀏覽:886
出台多少份文件 瀏覽:380
鞋子怎麼搭配衣服的app 瀏覽:755
文件名使用的通配符的符號是什麼 瀏覽:916
lol分卷文件損壞怎麼辦 瀏覽:276
6分管車螺紋怎麼編程 瀏覽:732
海口農商銀行信用卡app是什麼 瀏覽:770
win10任務欄文件夾我的電腦 瀏覽:14
安卓nba2k18 瀏覽:776
文件夾密碼怎麼修改密碼 瀏覽:271
蘋果數據中心用什麼伺服器 瀏覽:769
省內圓通快遞寄文件夾需要多少錢 瀏覽:740
iphone程序加密 瀏覽:884
win10文件夾調整文件行高 瀏覽:681
創意手繪教程 瀏覽:754
微信刪除帳號信息 瀏覽:596
mysql操作類文件 瀏覽:649
繞過xp密碼 瀏覽:158

友情鏈接