java 包装类及类型转换

时间:2021-08-08 17:52:44

java基本类型和包装器类

  java是一种面向对象语言,java中的类把方法与数据连接在一起,并构成了自包含式的处理单元.但在java中不能定义基本类型(primitive type),为了能将基本类型视为对象来处理,并能连接相关的方法,java为每个基本类型都提供了包装类,这样,我们便可以把这些基本类型转化为对象来处理了.这些包装类有:Boolean,Byte,Short,Character,Integer,Long,Float,Double,Void共9个(注意:Date不是,无其基本类型).

int 是基本类型,直接存数值 
Integer是类,产生对象时用一个引用指向这个对象
Java把内存划分成两种:一种是栈内存,另一种是堆内存 
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配 

而实际的对象是在存储堆内存中 

即 

int i = 5;//直接在栈中分配空间 

Integer i = new Integr(5);//对象是在堆内存中,而i(引用变量)是在栈内存中 

在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理.
因为在堆中分配空间所需的时间远大于从栈中分配存储空间,所以JAVA速度比C 慢
当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的外覆类了。Java中每种基本类型都有相应的外覆类。

一、 包装类(Wrapper Class)共同的方法

值得说明的是,java是可以直接处理基本类型的,但是在有些情况下我们需要将其作为对象来处理,这时就需要将其转化为包装类了.所有的包装类(Wrapper Class)都有共同的方法,他们是:

(1)带有基本值参数并创建包装类对象的构造函数.如可以利用Integer包装类创建对象,Integer obj=new Integer(145);

(2)带有字符串参数并创建包装类对象的构造函数.如new Integer("-45.36");

(3)可生成对象基本值的typeValue方法,如obj.intValue();

(4)将字符串转换为基本值的 parseType方法,如Integer.parseInt(args[0]),该方法的作用是将数字字符串转换为int数值。如果字符串都包含的不是都是数字字符,则程序执行将出现异常;

(5)生成哈稀表代码的hashCode方法,如obj.hasCode();

(6)对同一个类的两个对象进行比较的equals()方法,如obj1.eauqls(obj2);

(7)生成字符串表示法的toString()方法,如obj.toString().

另外一个toString方法则实现将int值转换为特定进制的字符串:

 public static int parseInt(String s, int radix)

使用示例代码如下:

int m = 20;

String s = Integer.toString(m);

 则字符串s的值是”14”。

 public static void main(String[] args) {
// (1)带有基本值参数并创建包装类对象的构造函数.如可以利用Integer包装类创建对象,
Integer tInteger=new Integer(145);
Float tFloat=new Float(145);
System.out.println(tInteger.intValue());
System.out.println(tFloat.floatValue());
System.out.println(tFloat.intValue());
// 145
// 145.0
// 145

// (2)带有字符串参数并创建包装类对象的构造函数.如new Integer("-45.36");
Integer tInteger2= new Integer("36");
System.out.println(tInteger2.intValue());
System.out.println(tInteger2.floatValue());
// 36
// 36.0

// (4)将字符串转换为基本值的 parseType方法,如Integer.parseInt(args[0]),
// 该方法的作用是将数字字符串转换为int数值。如果字符串都包含的不是都是数字字符,则程序执行将出现异常;
Integer tInteger3= Integer.parseInt("36");
System.out.println(tInteger3.intValue());
String xString="38";
Integer tInteger4= Integer.parseInt(xString);
System.out.println(tInteger4.intValue());

// 36
// 38
// (6)对同一个类的两个对象进行比较的equals()方法,如obj1.eauqls(obj2);
Integer tInteger6= Integer.parseInt("36");
Integer tInteger5= Integer.parseInt("36");
System.out.println(tInteger6.equals(tInteger5));
System.out.println(tInteger6==tInteger5);

// ==”比较的是值【变量(栈)内存中存放的对象的(堆)内存地址】
// equal用于比较两个对象的值是否相同【不是比地址】
// 【特别注意】Object类中的equals方法和“==”是一样的,没有区别,而String类,
// Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,
// 自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。
Integer tInteger8= new Integer("36");
Integer tInteger9= new Integer("36");
System.out.println(tInteger8.equals(tInteger9));
System.out.println(tInteger8==tInteger9);
// true
// true
// true
// false

// (7)生成字符串表示法的toString()方法,如obj.toString().
String str=tInteger9.toString();
System.out.println(str);
// 36

// 基本类型------>字符串
int f=9;
String str2=String.valueOf(f);
System.out.println(str2);
// 9

// 字符串------>Integer
Integer tInteger10=Integer.parseInt(str2);
System.out.println(tInteger10);
// 9
// Integer---->字符串
Integer tInteger11=new Integer(11);
System.out.println(tInteger11.toString());
// 11
// 字符串--->int
String str3=tInteger11.toString();
int d=Integer.parseInt(str3);
System.out.println(d);
// 11
}


转换关系:

基本类型------>包装器类
Integer obj=new Integer(145);

包装器类------>基本类型
int num=obj.intValue();

字符串------>包装器类
Integer obj=new Integer("-45.36");

包装器类------>字符串包装器类

String str=obj.toString();

字符串------>基本类型
int num=Integer.parseInt("-45.36");

基本类型------>字符串包装器类

String str=String.valueOf(5);


在一定的场合,运用java包装类来解决问题,能大大提高编程效率.

 

二、JDK1.5的新特性:自动装包/拆包(Autoboxing/unboxing)

  自动装包/拆包大大方便了基本类型数据和它们包装类地使用。

  自动装包:基本类型自动转为包装类.(int >> Integer)

  自动拆包:包装类自动转为基本类型.(Integer >> int)

  在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制
解决了我们的问题。

int a = 3;
Collection c = new ArrayList();
c.add(a);//自动转换成Integer.

Integer b = new Integer(2);
c.add(b + 2);

这里Integer先自动转换为int进行加法运算,然后int再次转换为Integer.