java知識點歸集

將工做中,或者看書的過程當中碰到的本身以前沒有掌握的知識點進行概括,暫時就碰到什麼寫什麼,後續有必定量的話進行整理;java

1.  list實現程序員

相關文章:https://zhuanlan.zhihu.com/p/24730576?refer=dreawer編程

 1 LinkedList<String> list = new LinkedList<String>();
 2 list.addFirst("aaa");   //將元素添加到鏈表集合最前面
 3 list.pollFirst() ;  //獲取並移除此列表的第一個元素;若是此列表爲空,則返回 null。
 4 list.pollLast() ;  //獲取並移除此列表的最後一個元素;若是此列表爲空,則返回 null。
 5 list.remove(int index) ; //移除此列表中指定位置處的元素。
 6 list.remove(Object o) ;  //今後列表中移除首次出現的指定元素(若是存在)。
 7 list.add("bbb");          //在鏈表末尾增長元素
 8 list.add(int index, E element) ;  //在此列表中指定的位置插入指定的元素。
 9 list.set(int index, E element) ;  // 將此列表中指定位置的元素替換爲指定的元素。
10 
11 
12 
13 重點:LinkedList  和List 是兩個類,等號前面須要注意是LinkedList 不能是List

 

2. native關鍵字 以及在java中調用其餘語言代碼安全

native關鍵字說明其修飾的方法是一個原生態方法,方法對應的實現不是在當前文件,而是在用其餘語言(如C和C++)實現的文件中。Java語言自己不能對操做系統底層進行訪問和操做,可是能夠經過JNI接口調用其餘語言來實現對底層的訪問。

JNI是Java本機接口(Java Native Interface),是一個本機編程接口,它是Java軟件開發工具箱(Java Software Development Kit,SDK)的一部分。JNI容許Java代碼使用以其餘語言編寫的代碼和代碼庫。Invocation API(JNI的一部分)能夠用來將Java虛擬機(JVM)嵌入到本機應用程序中,從而容許程序員從本機代碼內部調用Java代碼。

不過,對Java外部的調用一般不能移植到其餘平臺,在applet中還可能引起安全異常。實現本地代碼將使您的Java應用程序沒法經過100%純Java測試。可是,若是必須執行本地調用,則要考慮幾個準則:

1.將您的全部本地方法都封裝到一個類中,這個類調用單個的DLL。對每一種目標操做系統平臺,均可以用特定於適當平臺的版本的DLL。這樣能夠將本地代碼的影響減小到最小,並有助於將之後所須要的移植問題考慮在內。

2.本地方法儘可能簡單。儘可能使您的本地方法對第三方(包括Microsoft)運行時DLL的依賴減小到最小。使您的本地方法儘可能獨立,以將加載您的DLL和應用程序所需的開銷減小到最小。若是須要運行時DLL,必須隨應用程序一塊兒提供。

JNI的書寫步驟以下:

a.編寫帶有native聲明的方法的Java類

b.使用javac命令編譯編寫的Java類

c.使用java -jni ****來生成後綴名爲.h的頭文件

d.使用其餘語言(C、C++)實現本地方法

e.將本地方法編寫的文件生成動態連接庫

如下是一個在Java中調用本地C程序的簡單的例子:

a.編寫HelloWorld.java類

class HelloWorld{

public native void hello();

static{
System.loadLibrary("hello");
}

public static void main(String[] args){

new HelloWorld().hello();
}

}

b.編譯

javac HelloWorld.java

c.生成.h文件

javah -jni HelloWorld

生成內容以下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_hello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

第一個參數是調用JNI方法時使用的JNI Environment指針。第二個參數是指向在此Java代碼中實例化的Java對象HelloWorld的一個句柄。其餘參數是方法自己的參數

d.c實現

#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
printf("Hello World!\n");
return;
}

其中,第一行是將jni.h文件引入(在%JAVA_HOME%\include目錄下),裏邊有JNIEnv和jobject的定義。

e.編譯c實現

這裏以在Windows中爲例,須要生成dll文件。在保存HelloWorldImpl.c文件夾下面,使用VC的編譯器cl成。

cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll

注意:生成的dll文件名在選項-Fe後面配置,這裏是hello,由於在HelloWorld.java文件中咱們loadLibary的時候使用的名字是hello。固然這裏修改以後那裏也須要修改。另外須要將-I%java_home%\include -I%java_home%\include\win32參數加上,由於在第四步裏面編寫本地方法的時候引入了jni.h文件。

6) 運行程序

java HelloWorld就ok了!

3.查看JVM可優化參數 《LINUX下使用》app

 

java -server -Xmx1024m -Xms1024m -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -version| grep ParallelGCThreads
結果:

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannot allocate memory' (errno=12)工具

 4.研究【阿里巴巴開發手冊】以後看到的開發工具

 

對於 Integer var=?在-128 至 127 之間的賦值,Integer 對象是在 IntegerCache.cache
產生,會複用已有對象,這個區間內的 Integer 值能夠直接使用==進行判斷,可是這個區間之
外的全部數據,都會在堆上產生,並不會複用已有對象,這是一個大坑,推薦使用 equals 方
法進行判斷。
相關文章
相關標籤/搜索