GVKun编程网logo

int []和Integer []数组-有什么区别?(int数组和integer数组的区别)

23

对于int[]和Integer[]数组-有什么区别?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解int数组和integer数组的区别,并且为您提供关于c#–使用int[][]和int[,

对于int []和Integer []数组-有什么区别?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解int数组和integer数组的区别,并且为您提供关于c# – 使用int [] []和int [,]有什么区别?、Hashtable,HashMap,TreeMap有什么区别?Vector,ArrayList,LinkedList有什么区别?int和Integer有什么区别?、Int 和 Integer 有什么区别?、Integer 和 int 有什么区别的宝贵知识。

本文目录一览:

int []和Integer []数组-有什么区别?(int数组和integer数组的区别)

int []和Integer []数组-有什么区别?(int数组和integer数组的区别)

考虑以下基础:

  1. 任何Object人只能活在堆里
  2. 阵列IS-A Object
  3. Integer IS-A Object

我发现自己很难回答这样一个简单的问题: JVMint[]Integer[] JVM内部 有什么区别吗?还是仅在“编译时”才有意义?

答案1

小编典典

运行时有所不同。

int[]是原始int值的数组。Integer[]是一个“对象”数组,其中包含对Integer对象的引用。

最重要的实际差异:int[]无法持有null价值观。

但是我仍然很困惑:是否int[]仅存储原始值?如果是这样,这是否意味着原始类型可以不封装就可以存在于堆中?

int[]确实存储原始类型。数组本身位于堆中。但是,这些原语被分配为数组的一部分。它们不会单独存储在堆中的其他位置。这与原始字段是对象实例的一部分的方式非常相似:该对象在堆上,并且其字段是该对象的组成部分(而对于非原始字段,只有引用存储在该对象内部引用所指向的目标实例分别存储在堆中)。

您可以说int数组中的“包裹”了。

c# – 使用int [] []和int [,]有什么区别?

c# – 使用int [] []和int [,]有什么区别?

参见英文答案 > What are the differences between a multidimensional array and an array of arrays in C#?7个
来自一个perl背景,我一直使用int [] []定义一个2D数组.我知道你可以使用int [,]而不是有什么区别?

解决方法

这里的区别是,第一个样本int [] []创建一个 jagged array,而第二个样本创建一个 multidimensional array(维数为2).在锯齿状阵列中,每个“列”可以具有不同的大小.在一个真正的多维数组中,每个“列”(在维度上)的大小相同.有关更完整的信息,请参阅 C# Programming Guide Array section.

Hashtable,HashMap,TreeMap有什么区别?Vector,ArrayList,LinkedList有什么区别?int和Integer有什么区别?

Hashtable,HashMap,TreeMap有什么区别?Vector,ArrayList,LinkedList有什么区别?int和Integer有什么区别?

接着上篇继续更新。

/*请尊重作者劳动成果,转载请标明原文链接:*/

/* https://www.cnblogs.com/jpcflyer/p/10759447.html* /

题目一:Hashtable,HashMap,TreeMap有什么区别?

一般回答:
Hashtable 是早期 Java 类库提供的一个哈希表实现,本身是同步的,不支持 null 键和值,由于同步导致的性能开销,所以已经很少被推荐使用。
HashMap 是应用更加广泛的哈希表实现,行为上大致上与 HashTable 一致,主要区别在于 HashMap 不是同步的,支持 null 键和值等。通常情况下,HashMap 进行 put 或者 get 操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选,比如,实现一个用户 ID 和用户信息对应的运行时存储结构。
TreeMap 则是基于红黑树的一种提供顺序访问的 Map,和 HashMap 不同,它的 get、put、remove 之类操作都是 O(log(n))的时间复杂度,具体顺序可以由指定的 Comparator 来决定,或者根据键的自然顺序来判断。
 
扩展一下,看看JAVA集合的全集。
上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。
发现一个特点,上述所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到,通常无序集合实现的都是这个接口,比如HashSet,HashMap;而那些元素有序的集合,实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个元素,比如ArrayList。
还有一个特点就是抽象类的使用。如果要自己实现一个集合类,去实现那些抽象的接口会非常麻烦,工作量很大。这个时候就可以使用抽象类,这些抽象类中给我们提供了许多现成的实现,我们只需要根据自己的需求重写一些方法或者添加一些方法就可以实现自己需要的集合类,工作流昂大大降低。

题目二:Vector,ArrayList,LinkedList有什么区别?

一般回答:
Vector 是 Java 早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector 内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。
ArrayList 是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与 Vector 近似,ArrayList 也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector 在扩容时会提高 1 倍,而 ArrayList 则是增加 50%。
LinkedList 顾名思义是 Java 提供的双向链表,所以它不需要像上面两种那样调整容量,它也不是线程安全的。
 
继续扩展一下,还是先看上题中的集合框架图。
我们可以看到 Java 的集合框架,Collection 接口是所有集合的根,然后扩展开提供了三大类集合,分别是:
List,也就是我们前面介绍最多的有序集合,它提供了方便的访问、插入、删除等操作。
Set,Set 是不允许重复元素的,这是和 List 最明显的区别,也就是不存在两个对象 equals 返回 true。我们在日常开发中有很多需要保证元素唯一性的场合。
Queue/Deque,则是 Java 提供的标准队列结构的实现,除了集合的基本功能,它还支持类似先入先出(FIFO, First-in-First-Out)或者后入先出(LIFO,Last-In-First-Out)等特定行为。这里不包括 BlockingQueue,因为通常是并发编程场合,所以被放置在并发包里。
每种集合的通用逻辑,都被抽象到相应的抽象类之中,比如 AbstractList 就集中了各种 List 操作的通用部分。这些集合不是完全孤立的,比如,LinkedList 本身,既是 List,也是 Deque 哦。
如果阅读过更多源码,你会发现,其实,TreeSet 代码里实际默认是利用 TreeMap 实现的,Java 类库创建了一个 Dummy 对象“PRESENT”作为 value,然后所有插入的元素其实是以键的形式放入了 TreeMap 里面;同理,HashSet 其实也是以 HashMap 为基础实现的,原来他们只是 Map 类的马甲!

题目三:int和Integer有什么区别?

一般回答:
int 是我们常说的整形数字,是 Java 的 8 个原始数据类型(Primitive Types,boolean、byte 、short、char、int、float、double、long)之一。 Java 语言虽然号称一切都是对象,但原始数据类型是例外。
Integer 是 int 对应的包装类,它有一个 int 类型的字段存储数据,并且提供了基本操作,比如数学运算、int 和字符串之间转换等。在 Java 5 中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java 可以根据上下文,自动进行转换,极大地简化了相关编程。
 
扩展:
这里很容易就想到装箱和拆箱。 装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。
这个过程是自动执行的,那么我们需要看看它的执行过程:
public class Main {
public static void main(String[] args) {
//自动装箱
Integer total = 99;
//自定拆箱
int totalprim = total;
}
}

反编译class文件之后得到如下内容:

javap -c StringTest
Integer total = 99; 
执行上面那句代码的时候,系统为我们执行了: 
Integer total = Integer.valueOf(99);
int totalprim = total; 
执行上面那句代码的时候,系统为我们执行了: 
int totalprim = total.intValue();
那么什么时候会进行封箱拆箱呢?
当一个基础数据类型与封装类进行==、+、-、*、/运算时,会将封装类进行拆箱,对基础数据类型进行运算。
需要注意的是:
1. 装箱操作会创建对象,频繁的装箱操作会消耗许多内存,影响性能,所以可以避免装箱的时候应该尽量避免。
2.自动拆箱实际是jvm 调用了 intValue 方法,所以性能上不会有影响。
3.除double 和float 两种类型以外,其他基本类型入Integer值 在 -128 ~ 127之间时不会新建一个Integer 对象而是从缓存中获取。所以在做 == 判断时 要注意值得大小,如果超过范围,则两个值 虽然一样但  == 比较的结果会是FALSE。
4.Integer 类型的比较最好用 compare 。
5.比较两者(int 与 Integer变量) 时,可以用拆箱 (用intValue方法),没影响的。

原文出处:https://www.cnblogs.com/jpcflyer/p/10759447.html

Int 和 Integer 有什么区别?

Int 和 Integer 有什么区别?

Int在 Haskell 中, an和 an 有什么区别Integer?答案记录在哪里?

答案1

小编典典

“整数”是一种任意精度类型:它可以容纳任何数字,无论多大,直到机器内存的限制。这意味着你永远不会有算术溢出。另一方面,这也意味着您的算术相对较慢。Lisp
用户可能会在这里认出“bignum”类型。

“Int”是更常见的 32 位或 64 位整数。实现方式各不相同,但保证至少为 30 位。

资料来源:Haskell
Wikibook。此外,您可能会发现
A Gentle Introduction to Haskell的
Numbers部分很有用。 __

Integer 和 int 有什么区别

Integer 和 int 有什么区别

Integer 和 int 有什么区别

首先要明白 Integer 是包装类型, int 是基础类型。

拿 Integer 来说其实就是在 int 外面又包装了一下,继承自 Number 接口

public final class Integer extends Number implements Comparable<Integer>

包装类型和基础类型的区别

  • 基础类型直接用=号赋值,包装类型用new关键字创建。
  • 基本类型是直接将变量值存储在堆栈中,而包装类型是将对象放在堆中,然后通过引用来使用。
  • 基本类型的初始值如int为0,boolean为false,而包装类型的初始值为null。

自动装箱拆箱

Integer a1 = 1;
int a = a1;

上面第一行代码会触发装箱的动作,jvm会转换成
Integer a1 = Integer.valueOf(1);
第二行代码会触发拆箱的动作,jvm会转换成
int a = a1.intValue();

equals

那么看下面的例子

Integer a1 = 1;
int a = 1;
Integer b = 1;
Integer b1 = 4;
Long a2 = 3l;

System.out.println("b == a -> " + (b == a));
System.out.println("b.equals(a) -> " + (b.equals(a)));
System.out.println("b1 == (a + a1) -> " + (b1 == (a + a1)));
System.out.println("b1.equals(a + a1) -> " + (b1.equals(a + a1)));
System.out.println("b1.equals(a + a2) -> " + (b1.equals(a + a2)));

//输出
b == a -> true
b.equals(a) -> true
b1 == (a + a1) -> true
b1.equals(a + a1) -> true
b1.equals(a + a2) -> false

上面的前面4个结果都返回 true, 也就是说 当一个基础数据类型与封装类进行==、+、-、*、/运算时,会将封装类进行拆箱,对基础数据类型进行运算。
最后一个返回 false,看下 equals 源代码

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

通过源代码可以看到是类型不匹配,类型匹配的时候直接用的是 intValue 比较。

valueOf

Integer d1 = 200;
Integer d2 = 200;
Integer d3 = 100;
Integer d4 = 100;

System.out.println("d1 == d2 -> " + (d1 == d2));
System.out.println("d1.equals(d2) ->" + (d1.equals(d2)));
System.out.println("d3 == d4 -> " + (d3 == d4));
System.out.println("d3.equals(d4) -> " + (d3.equals(d4)));

//输出
d1 == d2 -> false
d1.equals(d2) ->true
d3 == d4 -> true
d3.equals(d4) -> true

d1 == d2 返回false,这是因为包装类常量池的存在

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

// IntegerCache 为 Integer 类中的静态内部类
private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }

    private IntegerCache() {}
}

当传入的int值在 IntegerCache.low 和 IntegerCache.high 之间,就在 IntegerCache.cache 数据里面取一个。在 IntegerCache 类中可以看到 IntegerCache.low 的值为 -128,IntegerCache.high 的值为 127,IntegerCache.cache 就是预先初始化的一个数组,当传入的值在 -128 到 127 之间的时候直接从数组取值,否则的话就要 new Integer()
所以,当 d3 == d4 的时候返回的都是同一个对象,结果相等, 当 d1 == d4 的时候,则是返回2个不同的对象(因为值大于128,创建了2个不同的对象),结果必然是不等的。

Double.valueOf

Double c1 = 100.0;
Double c2 = 100.0;
Double c3 = 200.0;
Double c4 = 200.0;

System.out.println("c1 == c2 -> " + (c1 == c2));
System.out.println("c1.equals(c2) ->" + (c1.equals(c2)));
System.out.println("c3 == c4 -> " + (c3 == c4));
System.out.println("c3.equals(c4) -> " + (c3.equals(c4)));

//输出
c1 == c2 -> false
c1.equals(c2) ->true
c3 == c4 -> false
c3.equals(c4) -> true

当类型是 Double 的时候就没有这个常量池了,因为没有一个确定数量的值。

Integer ==

Integer f = new Integer(100);
Integer g = new Integer(100);

System.out.println(f == g);


//输出
false

基本类型100通过包装类Integer包装后生产一个Integer对象的引用 f,而 == 使用来判断两个操作数是否有相等关系。如果是基本类型就直接判断其值是否相等。若是对象就判断是否是同一个对象的引用,显然我们new了两个不同的对象。

今天关于int []和Integer []数组-有什么区别?int数组和integer数组的区别的介绍到此结束,谢谢您的阅读,有关c# – 使用int [] []和int [,]有什么区别?、Hashtable,HashMap,TreeMap有什么区别?Vector,ArrayList,LinkedList有什么区别?int和Integer有什么区别?、Int 和 Integer 有什么区别?、Integer 和 int 有什么区别等更多相关知识的信息可以在本站进行查询。

本文标签: