包装类
包装类的分类
- 针对八种基本数据类型相应的引用类型一包装类
- 有了类的特点,就可以调用类中的方法
包装类和基本数据类型转换
课堂测试
下面的代码是否正确,为什么?
Double d = 100d;
Float f = 1.5f;
Object obj1 = true? new lnteger(1) : new Double(2.0);//三元运算符[是一个整体] 一真大师
System.out.println(obj1); //输出1.0而不是1
Object obj2;
if(true){
obj2 = new Integer(1):
}
else{
obj2 = new Double(2.0):
}
System.out.println(obj2); //输出1
面试题
看看下面代码,输出什么结果?为什么?
public class Homework04 {
public static void main(String[] args) {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i==j); //False
Integer m = 1; //底层Integer.valueOf(1);
Integer n = 1; //底层Integer.valueOf(1);
//所以这里主要看范围-128~127就是直接返回缓存里的Integer对象
//超出范围则new一个Integer对象
System.out.println(m==n); //True
Integer x = 128; //底层Integer.valueOf(128);
Integer y = 128; //底层Integer.valueOf(128);
System.out.println(x==y); //False
}
}
Integer i1 = new Integer(127):
Integer i2 = new Integer(127);
System.out.println(i1==i2);//F
Integer i3 = new Integer(128);
Integer i4 = new Integer(128);
System.out.println(i3==i4);//F
Integer i5 = 127;//底层Integer.value0f(127)
Integer i6 = 127;
System.out.println(i5==i6);//T
Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7==i8);//F
Integer i9 = 127;//底层Integer.value0f(127)
Integer i10 = new Integer(127);
System.out.println(i9==i10);//F
//只要有基本数据类型,判断的是值是否相同
Integer i11 = 127;
int i12 = 127;
System.out.println(i11==i12);// T
Integer i13 = 128;
int i14 = 128;
System.out.println(i13==i14);//T
String类
- String 对象用于保存字符串,也就是一组字符序列
- 字符串常量对象是用双引号括起的字符序列。例如:"你好"、"12.97"、"boy"等
- 字符串的字符使用Unicode字符编码,一个字符占两个字节(不区分英文和汉字)
- String类较常用构造方法(其它看手册)
- String s1 = new String0:
- String s2 = new String(String original)
- String s3 = new String(char[] a):
- String s4 = new String(char[] a,int startlndex,int count)
String类实现了Serializable接口(说明可以串行化,进行网络传输);实现了Comparable接口(说明String对象可以比较);实现了CharSequence接口;继承了Objecet类
String底层实际上是用final char value[] 来存放字符串的。final是指value[]的地址不能改变,但是数组内容可以改变。
两种创建String对象的区别
方式一: 直接赋值 String s ="hsp”;
方式二: 调用构造器 String s2 = new String("hsp”);
- 方式一: 先从常量池查看是否有”hsp”数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址
- 方式二: 先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有"hsp"则重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址
- 画出两种方式内存分布图
字符串的特性
- String是一个final类,代表不可变的字符序列
- 字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的
创建了2个字符串常量对象,s1指向常量池"hello",s1又指向常量池"haha".s1只是存放String对象的地址,可以被修改。String对象内容不能修改,"hello"不能改为"haha",而是s1从存放hello的地址改为了存放haha的地址。
创建了几个对象?
3个
总结:常量相加”ab“+”cd“看的是池、变量相加a+b,是在堆中
String类的常见方法
String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,因此java设计者还提供了StringBuilder 和 StringBuffer 来增强String的功能并提高效率。[后面我们还会详细介绍StringBuilder 和 StringBuffer]
StringBuffer类
String VS StringBuffer
- String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低 //private final char valuell;
- StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用更新地址,效率较高//char[] value; // 这个放在堆
String拼接
如果是常量之间的拼接:"happy"+"wei",结果就是池里的"happywei";如果是变量的拼接"happy"+s1(s1指向池里的"wei"),则结果不是常量池里的"happywei",而是堆中的对象,对象里的value成员指向池里的"happywei"。
标签:String,包装,System,new,println,Integer,out From: https://www.cnblogs.com/tigerWei/p/17962817