谈谈Integer和String

1.Integer

Integer是int的包装类,为什么要提供包装类呢?是为了各种类型之间的转换,先看一下Integer的源码

public final class Integer extends Number implements Comparable<Integer> {
    /**
     * A constant holding the minimum value an {@code int} can
     * have, -2<sup>31</sup>.
     */
    @Native public static final int   MIN_VALUE = 0x80000000;

    /**
     * A constant holding the maximum value an {@code int} can
     * have, 2<sup>31</sup>-1.
     */
    @Native public static final int   MAX_VALUE = 0x7fffffff;
......
  }  

 

最大值是正2亿多,最小值是负2亿多

Integer有一个IntegerCache的内部类,它提供了一个Integer的缓存,会把-128到127暂时存储在一个数组中,需要用到就直接从

数组中拿

看下面一段代码

Integer a1 = new Integer(12);
Integer a2 = new Integer(12);
Integer b1 = -129;
Integer b2 = -129;
Integer c1 = 123;
Integer c2 = 123;
System.out.println(a1.equals(a2));   //false
System.out.println(b1==b2);     //false
System.out.println(c1 == c2);   //true

等号比较内存地址,equals比较值,所以在-128到127之间的Integer对象指向的内存地址是一样的,不在返回内的地址是不一样的

我们也可以在VM args中改了一下

-Djava.lang.Integer.IntegerCache.high=1250

 

2.String

stirng并非一个基本数据类型,它是线程不安全的,并且是不可变的.StirngBuffer是线程安全的,StringBuilder也是线程不安全的,但它两都是长度可变的.

今天看一下创建一个String需要创建几个对象

@Test
public void test1(){
    String s1 = "Hello";
    String s2 = "Hello";
    String s3 = new String("Hello");
    System.out.println("s1和时s2引用地址是否相等:"+(s1 == s2));
    System.out.println("s1和时s3引用地址是否相等:"+(s1 == s3));
}

通过上面代码可以看到new的String和直接赋值的String指向的地址不一样

通过new String("Hello")对象时,会先先去字符串常量池找"Hello"字符串,如果没有创建字符串常量就先创建,如果已经有,就在堆中创建一个新的String对象,存储"Hello",而s3指向堆中的"Hello"对象地址 

那么给一个思考题new String("4"+"3")创建了几个对象呢?

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面试题目: 1-10题: 1、java中==和equals和hashCode的区别 2、int与integer的区别 3、StringStringBuffer、StringBuilder区别 4、什么是内部类?内部类的作用 5、进程和线程的区别 6、final,finally,finalize的区别 7、Serializable 和Parcelable 的区别 8、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因? 9、成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用 10、string 转换成 integer的方式及原理 11-20题: 11、哪些情况下的对象会被垃圾回收机制处理掉? 12、静态代理和动态代理的区别,什么场景使用? 14、Java中实现多态的机制是什么? 16、说说你对Java反射的理解 17、说说你对Java注解的理解 18、Java中String的了解 19、String为什么要设计成不可变的? 20、Object类的equal和hashCode方法重写,为什么? 21-40题 21、List,Set,Map的区别 26、ArrayMap和HashMap的对比 29、HashMap和HashTable的区别 30、HashMap与HashSet的区别 31-40题 31、HashSet与HashMap怎么判断集合元素重复? 33、ArrayList和LinkedList的区别,以及应用场景 34、数组和链表的区别 35、开启线程的三种方式? 36、线程和进程的区别? 38、run()和start()方法区别 39、如何控制某个方法允许并发访问线程的个数? 40、在Java中wait和seelp方法的不同 41-50题 41、谈谈wait/notify关键字的理解 42、什么导致线程阻塞?线程如何关闭? 43、如何保证线程安全? 44、如何实现线程同步? 45、线程间操作List 46、谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解 49、synchronized 和volatile 关键字的区别 51-58题 51、ReentrantLock 、synchronized和volatile比较 53、死锁的四个必要条件? 56、什么是线程池,如何使用? 56、什么是线程池,如何使用? 58、有三个线程T1,T2,T3,怎么确保它们按顺序执行?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值