導航:首頁 > 編程語言 > java對象長度

java對象長度

發布時間:2022-12-19 22:09:38

java的String對象的大小有限制嗎

String類型底層存儲是採用char[]數組的,所以說char[]數組的大小就決定了String對象的大小.由於數組的下標採用int類型,因此最大能存放的元素個數只有2147483648個,這個數也就是2G.所以說char[]數組能存儲2G大小的字元.因此在理想情況下也就是內存無限大,堆可以無限大的情況下,一個String類型的極限大小就是4G,長度為2147483648個字元

Ⅱ java的基本數據類型有幾種長度多少

Java語言提供了八種基本類型。六種數字類型(四個整數型,兩個浮點型),一種字元類型,還有一種布爾型。
1、整數:包括int,short,byte,long
2、浮點型:float,double
3、字元:char
4、布爾:boolean

擴展:

Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程

Ⅲ java 獲取int類型數據長度的方法

兩種方法,一種是樓上的,把int轉換成String然後取長度,另一種就是自己寫方法判斷數據的大小 例如<10就是一位數等等。個人建議用第一種方法,簡單而且效率相對高

Ⅳ 一個Java對象到底佔多大內存

第一問中,integer,Double是可以准確知道大小的 java中int double(包裝類分別是Integer和Double,實際是一樣的)分別佔用的大小是4B 和8B 這里說的B,就是我們通常說的KB中的那個B,全稱是Byte。 1B = 8bit。 所以我們通常會說int是32位,有時候又4位元組 而String他是有char數組組成,一個長度為10的String,佔用的char就是10個,一個char是2B。 所以看String佔多少內存,需要知道String的長度 二問中:答案是可以的 摘自ObjectOutPutStream的API說明 FileOutputStream fos = new FileOutputStream("t.tmp"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeInt(12345); oos.writeObject("Today"); oos.writeObject(new Date()); oos.close();

Ⅳ 怎麼確定Java對象的大小

首先,我們先寫一段大家可能不怎麼寫或者認為不可能的代碼:一個類中,幾個類型都是private類型,沒有public方法,如何對這些屬性進行讀寫操作,看似不可能哦,為什麼,這違背了面向對象的封裝,其實在必要的時候,留一道後門可以使得語言的生產力更加強大,對象的序列化不會因為沒有public方法就無法保存成功吧,OK,我們簡單寫段代碼開個頭,逐步引入到怎麼樣去測試對象的大小,一下代碼非常簡單,相信不用我解釋什麼:
import java.lang.reflect.Field;
class NodeTest1 {
private int a = 13;
private int b = 21;
}

public class Test001 {
public static void main(String []args) {
NodeTest1 node = new NodeTest1();
Field []fields = NodeTest1.class.getDeclaredFields();
for(Field field : fields) {
field.setAccessible(true);
try {
int i = field.getInt(node);
field.setInt(node, i * 2);
System.out.println(field.getInt(node));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}

代碼最基本的意思就是:實例化一個NodeTest1這個類的實例,然後取出兩個屬性,分別乘以2,然後再輸出,相信大家會認為這怎麼可能,NodeTest1根本沒有public方法,代碼就在這里,將代碼拷貝回去運行下就OK了,OK,現在不說這些了,運行結果為:
26
42
為什麼可以取到,是每個屬性都留了一道門,主要是為了自己或者外部接入的方便,相信看代碼自己仔細的朋友,應該知道門就在:field.setAccessible(true);代表這個域的訪問被打開,好比是一道後門打開了,呵呵,上面的方法如果不設置這個,就直接報錯。
看似和對象大小沒啥關系,不過這只是拋磚引玉,因為我們首先要拿到對象的屬性,才能知道對象的大小,對象如果沒有提供public方法我們也要知道它有哪些屬性,所以我們後面多半會用到這段類似的代碼哦!
對象測量大小的方法關鍵為java提供的(1.5過後才有):java.lang.instrument.Instrumentation,它提供了豐富的對結構的等各方面的跟蹤和對象大小的測量的API(本文只闡述對象大小的測量方法),於是乎我心喜了,不過比較惡心的是它是實例化類:sun.instrument.IntrumentationImpl是sun開頭的,這個鬼東西有點不好搞,翻開源碼構造方法是private類型,沒有任何getInstance的方法,寫這個類幹嘛?看來這個只能被JVM自己給初始化了,那麼怎麼將它自己初始化的東西取出來用呢,唯一能想到的就是agent代理,那麼我們先拋開代理,首先來寫一個簡單的對象測量方法:
步驟1:(先創建一個用於測試對象大小的處理類)
import java.lang.instrument.Instrumentation;
public class MySizeOf {
private static Instrumentation inst;
/**
*這個方法必須寫,在agent調用時會被啟用
*/
public static void premain(String agentArgs, Instrumentation instP) {
inst = instP;
}

/**
* 直接計算當前對象佔用空間大小,包括:當前類及超類的基本類型實例欄位大小
* 引用類型實例欄位引用大小、實例基本類型數組總佔用空間、實例引用類型數組引用本身佔用空間大小
* 但是不包括超類繼承下來的和當前類聲明的實例引用欄位的對象本身的大小、實例引用數組引用的對象本身的大小
* 用來測量java對象的大小(這里先理解這個大小是正確的,後面再深化)
*/
public static long sizeOf(Object o) {
if(inst == null) {
throw new IllegalStateException("Can not access instrumentation environment.\n" +
"Please check if jar file containing SizeOfAgent class is \n" +
"specified in the java's \"-javaagent\" command line argument.");
}
return inst.getObjectSize(o);
}
}

步驟2:上面我們寫好了agent的代碼,此時我們要將上面這個類編譯後打包為一個jar文件,並且在其包內部的META-INF/MANIFEST.MF文件中增加一行:Premain-Class: MySizeOf代表執行代理的全名,這里的類名稱是沒有package的,如果你有package,那麼就寫全名,我們這里假設打包完的jar包名稱為agent.jar(打包過程這里簡單闡述,就不細說了),OK,繼續向下走:
步驟3:編寫測試類,測試類中寫:
public class TestSize {
public static void main(String []args) {
System.out.println(MySizeOf.sizeOf(new Integer(1)));
System.out.println(MySizeOf.sizeOf(new String("a")));
System.out.println(MySizeOf.sizeOf(new char[1]));
}
}

下一步准備運行,運行前我們准備初步估算下結果是什麼,目前我是在32bit模式下運行jvm(注意,不同位數的JVM參數設置不一樣,對象大小也不一樣大)。
(1) 首先看Integer對象,在32bit模式下,class區域佔用4byte,mark區域佔用最少4byte,所以最少8byte頭部,Integer內部有一個int類型的數據,佔4個byte,所以此時為8+4=12,java默認要求按照8byte對象對其,所以對其到16byte,所以我們理論結果第一個應該是16;
(2) 再看String,長度為1,String對象內部本身有4個非靜態屬性(靜態屬性我們不計算空間,因為所有對象都是共享一塊空間的),4個非靜態屬性中,有offset、count、hash為int類型,分別佔用4個byte,char value[]為一個指針,指針的大小在bit模式下或64bit開啟指針壓縮下默認為4byte,所以屬性佔用了16byte,String本身有8byte頭部,所以佔用了24byte;其次,一個String包含了子對象char數組,數組對象和普通對象的區別是需要用一個欄位來保存數組的長度,所以頭部變成12byte,java中一個char採用UTF-16編碼,佔用2個byte,所以是14byte,對其到16byte,24+16=40byte;
(3) 第三個在第二個基礎上已經分析,就是16byte大小;
也就是理論結果是:16、40、16;
步驟4:現在開始運行代碼:運行代碼前需要保證classpath把剛才的agent.jar包含進去:
D:>javac TestSize.java
D:>java -javaagent:agent.jar TestSize
16
24
16
第一個和第三個結果一致了,不過奇怪了,第二個怎麼是24,不是40,怎麼和理論結果偏差這么大,再回到理論結果中,有一個24曾經出現過,24是指String而不包含char數組的空間大小,那麼這么算還真是對的,可見,java默認提供的方法只能測量對象當前的大小,如果要測量這個對象實際的大小(也就是包含了子對象,那麼就需要自己寫演算法來計算了,最簡單的方法就是遞歸,不過遞歸一項是我不喜歡用的,無意中在一個地方看到有人用棧寫了一個代碼寫得還不錯,自己稍微改了下,就是下面這種了)。
import java.lang.instrument.Instrumentation;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Stack;

public class MySizeOf {

static Instrumentation inst;

public static void premain(String agentArgs, Instrumentation instP) {
inst = instP;
}

public static long sizeOf(Object o) {
if(inst == null) {
throw new IllegalStateException("Can not access instrumentation environment.\n" +
"Please check if jar file containing SizeOfAgent class is \n" +
"specified in the java's \"-javaagent\" command line argument.");
}
return inst.getObjectSize(o);
}

/**
* 遞歸計算當前對象佔用空間總大小,包括當前類和超類的實例欄位大小以及實例欄位引用對象大小
*/
public static long fullSizeOf(Object obj) {//深入檢索對象,並計算大小
Map<Object, Object> visited = new IdentityHashMap<Object, Object>();
Stack<Object> stack = new Stack<Object>();
long result = internalSizeOf(obj, stack, visited);
while (!stack.isEmpty()) {//通過棧進行遍歷
result += internalSizeOf(stack.pop(), stack, visited);
}
visited.clear();
return result;
}
//判定哪些是需要跳過的
private static boolean skipObject(Object obj, Map<Object, Object> visited) {
if (obj instanceof String) {
if (obj == ((String) obj).intern()) {
return true;
}
}
return (obj == null) || visited.containsKey(obj);
}

private static long internalSizeOf(Object obj, Stack<Object> stack, Map<Object, Object> visited) {
if (skipObject(obj, visited)) {//跳過常量池對象、跳過已經訪問過的對象
return 0;
}
visited.put(obj, null);//將當前對象放入棧中
long result = 0;
result += sizeOf(obj);
Class <?>clazz = obj.getClass();
if (clazz.isArray()) {//如果數組
if(clazz.getName().length() != 2) {// skip primitive type array
int length = Array.getLength(obj);
for (int i = 0; i < length; i++) {
stack.add(Array.get(obj, i));
}
}
return result;
}
return getNodeSize(clazz , result , obj , stack);
}

//這個方法獲取非數組對象自身的大小,並且可以向父類進行向上搜索
private static long getNodeSize(Class <?>clazz , long result , Object obj , Stack<Object> stack) {
while (clazz != null) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers())) {//這里拋開靜態屬性
if (field.getType().isPrimitive()) {//這里拋開基本關鍵字(因為基本關鍵字在調用java默認提供的方法就已經計算過了)
continue;
}else {
field.setAccessible(true);
try {
Object objectToAdd = field.get(obj);
if (objectToAdd != null) {
stack.add(objectToAdd);//將對象放入棧中,一遍彈出後繼續檢索
}
} catch (IllegalAccessException ex) {
assert false;
}
}
}
}
clazz = clazz.getSuperclass();//找父類class,直到沒有父類
}
return result;
}
}

Ⅵ java中怎麼通過File對象得到文件的長度

File類有一個方法public long length(),用於獲取文件的長度,但在調用之前需確認該文件所指向的是「文件」,而不是「目錄」(使用isDirectory()方法)。

Ⅶ 怎麼確定Java對象的大小

普通對象的結構如下,按64位機器的長度計算
1. 對象頭(_mark), 8個位元組

2. Oop指針,如果是32G內存以下的,默認開啟對象指針壓縮,4個位元組
3. 數據區
4.Padding(內存對齊),按照8的倍數對齊

數組對象結構是
1. 對象頭(_mark), 8個位元組

2. Oop指針,如果是32G內存以下的,默認開啟對象指針壓縮,4個位元組
3. 數組長度,4個位元組
4. 數據區

5. Padding(內存對齊),按照8的倍數對齊

清楚了對象在內存的基本布局後,咱們說兩種計算Java對象大小的方法
1. 通過java.lang.instrument.Instrumentation的getObjectSize(obj)直接獲取對象的大小

2. 通過sun.misc.Unsafe對象的objectFieldOffset(field)等方法結合反射來計算對象的大小

java.lang.instrument.Instrumentation.getObjectSize()的方式

先講講java.lang.instrument.Instrumentation.getObjectSize()的方式,這種方法得到的是Shallow Size,即遇到引用時,只計算引用的長度,不計算所引用的對象的實際大小。如果要計算所引用對象的實際大小,可以通過遞歸的方式去計算。
java.lang.instrument.Instrumentation的實例必須通過指定javaagent的方式才能獲得,具體的步驟如下:
1. 定義一個類,提供一個premain方法: public static void premain(String agentArgs, Instrumentation instP)
2. 創建META-INF/MANIFEST.MF文件,內容是指定PreMain的類是哪個: Premain-Class: sizeof.ObjectShallowSize
3. 把這個類打成jar,然後用java -javaagent XXXX.jar XXX.main的方式執行

有興趣可以看下博主的:http://blog.csdn.net/iter_zc/article/details/41822719

閱讀全文

與java對象長度相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:485
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:382
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163