包装类、字符串

包装类
包装类就是基本数据类型对应的引用类型
集合 --> 集合只能存储对象,存储不了基本数据类型
ps:就算是包装类在作为参数的时候,同样是无法完成地址传递还是值传递

---------------------------------------------------------------------
基本数据类型 默认值 包装类类型 默认值
byte               0                  Byte            null
short              0                 Short           null
int                  0          Integer       null
long         0        Long          null
char             ' '                  Character    null
float             0.0               Flo               null
double        0.0                Double         null
boolean      false              Boolean       null


数据如何进行拆箱和装箱
自动装箱:将基本数据类型封装为对应的包装类类型
必须是Jdk1.5以上
包装类类型 对象名 = 对应的基本数据类型 
jdk1.5以下 
手动装箱:将基本数据类型封装为对应的包装类类型
包装类类型 对象名 = new 包装类类型(对应的基本数据类型)

必须是Jdk1.5以上
自动拆箱:将包装类转换为原有的基本数据类型
基本数据类型 变量 = 对应包装类对象

jdk1.5以下 
手动拆箱:将包装类转换为原有的基本数据类型 
基本数据类型 变量 = 包装对象.XXXValue();
XXX --> 对应的基本数据类型
栗子:
int a = integer.intValue();

ps:基本数据类型中 整数型 小数型 char 可以互相兼容
基本数据类型的包装之间没有任何关系 
一点点关系整数型 和 小数型 都是Number的子类 

String和基本类型/包装类之间的转换操作 
看NumberfomatString

包装类的缓存模式(享元原则)
Byte Short Integer Long 缓存[-128 ~ 127] 
Character 缓存[0 ~ 127]
若需要比较两个引用类型是否相等,应该使用equals
不要使用 == 来进行比较,因为比较的是 地址
看 NumberDemo2

问题 Integer 和 int 之间的区别吗?
1.默认值:
int是值类型 --> 0
Integer是引用类型 --> null
2.包装类提供了一些操作方法,便于对数字进行操作而int没有这些
3.在集合框架中只能存储对象(引用)类型,不能存储基本数据类型
4.int是开辟在栈空间 Integer是在堆和常量池中[-128 ~ 127]


字符串
String类
如何看待字符串:
字符串就是一个字符序列:把多个字符按照一定的循序排列起来
字符串分类
不可变字符串String:
在创建了String对象之后,这个字符串会存在在字符串池中,会的到其引用
若给当前String对象重新赋值,原有字符串不会消失,在次新建一个新的字符串,从而得到一个全新的引用

可变字符串 StringBuffer和StringBuilder
就是在同一个字符串的基础之上进行操作,所有的修改都会映射到这个字符串上

String中常用的方法看StringDemo


Stringbuffer和StringBuilder
都是可变字符串,经过对API中的方法对比发现,API中的方法时相同
也就是说,只要一动一个可变字符串会使用,另外一个也可以同使用

在多线程并发访问的前提
StringBuffer是线程安全
StringBuilder是线程不安全

在效率StringBuilder效率是高于StringBuffer,建议大家使用StringBuilder(单线程)

以StringBuilder为例介绍方法 StringBuilderDemo

测试:String和StringBuffer和StringBuilder分别拼接1000000次字符串的时间

/**
 * 
 */
package com.qfedu.Day12.Number;


public class NumberDemo {

    public static void main(String[] args) {
         //基本数据类型
        int  age = 12;
        //自动装箱
        //反编译原码看到    Integer ageObj = Integer.valueOf(age);
        //valueof 的返回值是使用 new Integer(i);
        //自动装箱底层就是手动装箱
        Integer ageObj = age;
        //手动装箱
        Integer ageObj2 = new Integer(age);
        //自动拆箱
        //底层调用还是手动拆箱  ageObj.intValue() 
        int age2 = ageObj;
        //手动拆箱
        int age3 = ageObj2.intValue();
        
    }

}


/**
 * 
 */
package com.qfedu.Day12.Number;

public class NumberDemo2 {
      public static void main(String[] args) {
        Integer i1 = new Integer(123);
        Integer i2 = new Integer(123);
        System.out.println(i1 == i2);//false 比较是i1和i2对象的堆中地址
        //Object中equals 比较的是地址
        //Integer中的equals一定是重写
        System.out.println(i1.equals(i2));//true
        
        //享元原则:-->很久很久以前内存是很宝贵 64M
        //如果无节制的创建Integer对象,内存终究会慢
        //缓存机制Byte,Short Long Integer [-128 ~ 127]
        //在这个范围之间若,已经创建了对象,那么就 不会重新创建新的对象
        //两个对象会引用同一个空间
        Integer i3 = Integer.valueOf(123);
        Integer i4 = Integer.valueOf(123);
        System.out.println(i3 == i4);//true
        
        
        Integer i5 = 123;
        Integer i6 = 123;
        System.out.println(i5 == i6);//true
        
        Integer i7 = new Integer(250);
        Integer i8 = new Integer(250);
        System.out.println(i7 == i8);
        
        Integer i9 = Integer.valueOf(250);
        Integer i10 = Integer.valueOf(250);
        System.out.println(i3 == i4);//true
        
        
        Integer i11 = 250;
        Integer i12 = 250;
        System.out.println(i11 == i12);//false
        System.out.println(i11.equals(i12));//true
        
                    }
}
/**
 * 
 */
package com.qfedu.Day12.Number.NumberFomatString;

public class NumberFormatString {
    public static void main(String[] args) {
        //将某个字符串转换为包装类类型
        //转换可以但是必须是数字并且在数据存储范围之内
        //若掺杂其他字符就会出现
        /*
         * NumberFormatException: For input string: "123a"
         * 数字转换异常
         * 
         */
        Integer i1 = Integer.valueOf("123");
        Integer i2 = 123;
        System.out.println(i1+i2);
        //同样要准守上面的原则
        Integer i3 = new Integer("123");
        
        //将包装类转换为字符串
        String str1 = i1.toString();
        
        //将基本数据类型转换为字符串
        String str2 = 17 + "";
        
        //将String转换为基本数据类型
        String str3 = "12345";
        int num = Integer.parseInt(str3);
        
        //ps:true / false 包装了同样如此
        //之人true和false除了这两个无论参数是什么 都返回默认值 false
        Boolean b = new Boolean("小黑猫");
        System.out.println(b);
                    }

}
/**
 * 
 */
package com.qfedu.Day12.String;

import java.util.Arrays;

public class StringDemo {

    public static void main(String[] args) {
        //String在底层是如何存储
        //字符串底层就是一个字符数组 private final char value[];
        //String str = "abcd";//等价于 char[] cs = {'a','b','c','d'};
        
        //1.如何创建字符串
        //直接赋值创建字符串
        //"abc"存储在字符串池(常量池)
        String str1 = "abc";
        //通过new关键字创建字符串
        /*
         * 当前创建方式会创建几个对象
         * 至少一个
         * 若"abc"在常量池中没有被创建,那么就会在常量池中创建字符串
         * 在通过new关键字在堆空间创建出一个对象
         * 就会两个对象
         * 
         * 若"abc"已经在常量池存在,在通过new关键字在堆空间创建出一个对象并且会将"abc"拷贝一份
         * 存储到堆空间 
         * 只会创建一个对象堆空间的对象
         */
        String str2 = new String("abc");
        
     
        //常用方法:
        //1.获取字符串中的指定字符
        /*
         * 字符串底层存储是字符数组
         * 这个传入的参数值是从0开始 到字符串长度-1
         * 不是这个范围就会出现异常StringIndexOutOfBoundsException
         */
        char ch = str1.charAt(0);
        System.out.println(ch);
        
        //2.字符串比较大小 (ASCII码值 )
        //只要有一个不一样就能得到结果,若全一样也能得到结果
        //int类型的数值
        /*
         * >0    当前字符串大于传入字符串 
         * ==0  当前字符串等于传入字符串
         * <0    当前字符串小于传入字符串
         * ps:C# 字符串中的字符串比较不是遵守ASCII值,本地字符编码
         * 当前字符串: 调用方法的字符串
         * 传入字符串: 方法传入的参数       
         */
          String str3 = "abc";
          String str3_1 = "ABC";
          int result = str3.compareTo(str3_1);
          if(result > 0) {
              System.out.println("str3字符串大");
          }else if(result < 0) {
              System.out.println("str3_1字符串大");
          }else {
              System.out.println("两个字符串相等");
          }
        
          //3.字符串的拼接
          //3.1 +拼接
          String str4 = "hello";
          String str4_1 = "world";
          String str4_2 = str4 + str4_1;
          System.out.println(str4_2);
          //3.2方法拼接
          String str4_3 = str4.concat(str4_1);
          System.out.println(str4_3);
          
          //4.判断字符串中是否存在指定字符串
          // true 存在 / false 不存在
          String str5 = "好的";
          String str5_1 = "的";
          boolean result1 = str5.contains(str5_1);
          System.out.println(result1);
          
          //5.若判断字符串是否相同必须使用equals
          //字符串相同true 不同false
          String str6 = "北京";
          String str6_1 = "深圳";
          System.out.println(str6.equals(str6_1));
          
          //6.格式化字符串(静态方法)
          /*第一个参数 格式化控制符
           * %d 整数  %f小数  %c字符  %s字符串  %C汉字
           * 第二个参数时要格式化的数据
           * 格式化控制符需要和格式化数据一一对应
           * 
           */
          //保留小数后两位 保留几位小数 就.几 支持四舍五入
          String str7 = String.format("%.2f", 1.23556);
          System.out.println(str7);
          //不足两位补0
          String str7_1 = String.format("%02d", 11);
          System.out.println(str7_1);
          
          
          //7.从当前字符串中找到第一次出现的位置
          //7.1在字符串中查找指定字符串(第一次出现的位置)
          //找到了返回第一次出现的位置, 没找到返回-1
          String str8 = "abcdefc";
          char ch1 =  'c';
          int num = str8.indexOf(ch1);
          System.out.println(num);
          
          //从指定索引的位置据向后查找(第一次出现的位置)
          //指定位置是包含在查找范围
          //找到了返回第一次出现的位置, 没找到返回-1
          int num1 = str8.indexOf(ch1, 3);
          System.out.println(num1);
          
          //还有两个重载,这两个重载是查找字符串方法和上面是一样
         //找到了返回第一次出现的位置, 没找到返回-1
          String str8_1 = "are you ok!";
          String str8_2 = "ok";
          System.out.println(str8_1.indexOf(str8_2));
        
          //8.判断 字符串是否为空 isEmpty()
          //字符串是不是""空串 而不是  是不是 null
          //true 空串 false 不是
          String str9 = "";
          System.out.println(str9.isEmpty());
          
          //9.获取字符串长度
          System.out.println("abcdefghijklmn".length());
        
          
          
          //10.替换指定字符串中指定字符
          String str10 = "你好北京";
          System.out.println(str10.replace('你', '您'));
          
          //11.判断所以XXX开头, XXX结尾
          //true 是 false 不是
          System.out.println("www.baidu.com".startsWith("www"));
          System.out.println("www.baidu.com".endsWith("com"));
        
        
          //12.截取字符串
          //12.1截取指定位置的字符串(包含当前位置,从当前位置开始截取)
          String str11 = "你好呗!";
          System.out.println(str11.substring(2));
          
          //12.2截取指定位置的字符串(开始的位置和结束的位置)
          /*
           * 第一个是开始的位置(包含)
           * 第二个是结束的位置(不包含)
           */
           String str12 = "你好北京,天安门!";
           System.out.println(str12.substring(2, 8));
        
        
          //13.将字符串转换为字符数组
           String str13 = "故宫,长城,颐和园";
           char[] arr = str13.toCharArray();
           System.out.println(Arrays.toString(arr));
           
          //14.将字符串转换为大写字母或小写字母
           //所有的字母都转换,必须是字母
          String str14 = "abcdefg";
          System.out.println(str14.toUpperCase());//大写
          System.out.println(str14.toLowerCase());//小写
        
          //15.将数值转换成字符串(重载)
          String str15 = String.valueOf(10);
          System.out.println(str15);
        
          //16.去掉字符串中前后的空格(半角空格)
           String str16 = " hello world ";
           String str16_1 = str16.trim();
           System.out.println(str16_1);
         
           //17.字符串的拆分
           String str17 = "a b c d";
           //字符串数组
           String[] str17_1 = str17.split(" ");
           System.out.println(Arrays.toString(str17_1));
           
        
    }

}
/**
 * 
 */
package com.qfedu.Day12.StringBuilder;

public class StringBuilderDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //构建StringBuilder对象
        //默认使用无参构造方法创建对象,系统会自动开始一个16大小字节数组
        //自动扩容,创建一个更大的数组,将原有数组中成员复制到新数组中,使用这个新数组
        StringBuilder sbr = new StringBuilder();
         //使用给定容量大小的数组
        StringBuilder sbr1 = new StringBuilder(80);
        
        //使用字符串创建StringBuilder对象
        StringBuilder sbr2 = new StringBuilder("小黄人");
        
        
        //绝对不能使用这种方式创建
        //StringBuilder sbr3 = "abcdefug";
        
        //1.向字符串中添加内容,是想最后一位置添加
        sbr2.append("小红人"); 
        sbr2.append('小');
        sbr2.append(10);
        System.out.println(sbr2);
        //链式编程 就是因为当前append返回值是this-->当前对象
        //this关键字,当做参数传递
        sbr.append("你好").append("我好").append("大家好");
        System.out.println(sbr);
        
        //2.获取长度 length();
        
        //3.删除指定位置的字符串
        /*
         * 第一个参数是开始的位置(包含)
         * 第二个参数是结束的位置(不包含)
         */
        sbr2.delete(0, 3);
        System.out.println(sbr2);
        
        //4.删除指定位置的字符串
        sbr2.deleteCharAt(0);
        System.out.println(sbr2);
        
        //将指定字符串插入到指定位置
        //第一个参数要插入的位置,原有字符串后移
        //第二个参数要插入的字符串
        sbr2.insert(1, "啦啦啦啦啦啦啦");
        System.out.println(sbr2);
        
        //替换指定位置的字符串
        /*
         * 第一个参数开始的位置(包括)
         * 第二个参数结束的位置(不包括)
         * 第三个参数替换的字符串
         */
        sbr2.replace(1, 7, "饿了么");
        System.out.println(sbr2);
        
        //反转
        sbr2.reverse();
        System.out.println(sbr2);
        
        
        //修改指定位置的字符
        sbr2.setCharAt(0, 'k');
        
        
        
        //StringBuilder转换为String字符串
        String str = sbr2.toString();
        

    }

}
package com.qfedu.Day12.Time;

public class TimeDemo {
    public static void main(String[] args) {
        System.out.println("String字符串拼接10000次的时间:"+StringTime()+"毫秒");
        System.out.println("StringBuffer字符串拼接10000次的时间:"+StringBufferTime()+"毫秒");
        System.out.println("StringBuilder字符串拼接10000次的时间:"+StringBuilderTime()+"毫秒");

    }
    //String
    public static long StringTime() {
        //获取开始的时间
        long beginTime = System.currentTimeMillis();
        String str = "";
        for(int i = 0;i<1000000;i++) {
            str += i;
        }
        long endTime = System.currentTimeMillis();
        return endTime - beginTime;
    
    }
    //StringBuffer
    public static long StringBufferTime() {
        //获取开始的时间
        long beginTime = System.currentTimeMillis();
        StringBuffer sbr = new StringBuffer();
        for(int i = 0;i<1000000;i++) {
            sbr.append(i);
        }
        long endTime = System.currentTimeMillis();
        return endTime - beginTime;
        
    }
    //StringBuilder
    public static long StringBuilderTime() {
        //获取开始的时间
        long beginTime = System.currentTimeMillis();
        StringBuilder sbr = new StringBuilder();
        for(int i = 0;i<1000000;i++) {
            sbr.append(i);
        }
        long endTime = System.currentTimeMillis();
        return endTime - beginTime;
        
    }
    
}

猜你喜欢

转载自www.cnblogs.com/lijun199309/p/9477002.html
今日推荐