包装类、字符串

http://www.cnblogs.com/dolphin0520/p/3780005.html

包装类
包装类就是基本数据类型对应的引用类型
集合 --> 集合只能存储对象,存储不了基本数据类型
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;
        
    }
    
}

 

package com.tju.day12homework;

import java.util.Arrays;

public class exercise03 {

    public static void main(String[] args) {
        String string = "this is a test of java";
        char[] cs = string.toCharArray();
        /*
        * 方法一:解题思路,将字符串放到char数组中,除了第一个单词的首字母个, 其他的在空格的下一个下标的字符转换成大写
        */
        // 先将第一个下标的字符转换成大写
        cs[0] = Character.toUpperCase(cs[0]);
        for (int i = 0; i < cs.length - 1; i++) {
        if (cs[i] == ' ') {
        // 将空格的下一个下标处的字符转换成大写
        cs[i + 1] = Character.toUpperCase(cs[i + 1]);
        }
        }
        for (char c : cs) {
        System.out.print(c);
        }
        System.out.println();

/*
* 方法二:解题思路是以空格为界,拆分成每一个单词,然后再将首字母转成大写
*/
        String[] strings = string.split(" ");
        for (int i = 0; i < strings.length; i++) {
            char c = strings[i].charAt(0);
            char c2 = Character.toUpperCase(c);
            // 将已经转成大写的字符与截取的字符进行拼接
            strings[i] = c2 + strings[i].substring(1);
        }
        System.out.println(Arrays.toString(strings));
// 方法三:
        for (String string2 : strings) {
// 得到每一个单词的第一个字母
            String string4 = String.valueOf(string2.charAt(0));
// 将每一个首字母转成大写
            String string5 = string2.replaceFirst(string4, string4.toUpperCase());
            System.out.print(string5 + " ");
                }
            }
       }


package com.tju.day12homework;

public class exercise04 {
    public static void main(String agrs[]){
        String string = "this is a test of java";
        word_reverse(string);
 
    }
    //字符反转
    public static void char_reverse(String line){
 
        char[] chars = new char[line.length()];
        for (int i = line.length()-1,j = 0; i >= 0; i--,j++) {
            chars[j] = line.charAt(i);
            System.out.println(chars[j]);
        }
        line = String.copyValueOf(chars);
        System.out.println(line);
        //方法2 更简单:
        StringBuffer sb = new StringBuffer();
        //方法3 更简单 更快
        StringBuilder sb1 = new StringBuilder();
        sb.append(line);
 
        sb.append(line);
        System.out.println(sb.reverse());
        System.out.println(sb1.reverse());
    }
    //单词反转
    public static void word_reverse(String line){
        String[] str = line.split(" ");
        StringBuilder str1 = new StringBuilder();
        
        for (int i = str.length-1; i >= 0; i--) {
            str1.append(str[i]);
            if (i>0){
                str1.append(" ");
            }
        }
        System.out.println(str1);
 
    }
}

 

/**
 * 
 */
package com.qfedu.Day13.HomeWork;

import java.util.Arrays;
import java.util.Scanner;

import javax.swing.text.IconView;

public class HomeWork {

/**
 * 1.从控制台录入一个字符串,如果这个字符串以大写字母开头,将该字符串转成全小写;
 * 如果这个字符串以小写字母开头,将该字符串转成全大写
   2.去除字符串中所有的空格。例如 a b c d e  f --> abcdef
   3.将一个字符串进行反转。将字符串中指定部分进行反转 例如 abcdefg --> abfedcg
   4.将电话号中间4位替换成XXXX 例如13842383838-->138XXXX3838
   5.已知字符串:"this is a test of java"
         执行以下操作:
    1.统计出字符串中s出现的次数
    2.取出字符串中"test"
    3.将字符串转换成一个字符数组
    4.将字符串中每个单词的第一个字母变成大写,输出到控制台
    5.将字符串是此案倒叙输出 "java of test a is this"

    6.输入一个时间,输出它的下一秒时间(字符串版本)
     例如
     输入 20:39:40
     输出 20:39:41
        20:39:59
        20:40:00
        20:59:59
        21:00:00
        23:59:59
        00:00:00
    7."华为"公司去年的营业额是:1798798099079798098
       格式化后的金额信息是:1,798,798,099,079,798,098
     */
    public static void main(String[] args) {
        //1.
        //  First();
        //2.
        //  second();
       //3.
        //  thrid();
        //4.
         //   fourth();
        //5.
        //  fifth();
        //6.
        //   sixth();
        //7.
            seventh();
        
    }
     public static void First() {
         Scanner input = new Scanner(System.in);
         String str = input.next();
         if(str.charAt(0)>='A' && str.charAt(0)<='Z') {
             System.out.println(str.toLowerCase());
         }else {
             System.out.println(str.toUpperCase());
         }
     }
    
     public static void second() {
         String str = " a b c d e  f ";
         StringBuffer sbr = new StringBuffer();
         //字符串底层是一个字符数组,提供length() 可以使用类似数组的方式直接操作字符串
         for(int  i = 0; i<str.length();i++) {
             if(str.charAt(i)!=' ') {
                 sbr.append(str.charAt(i));
             }
         }
         System.out.println(sbr);
         
     }
    
     public static void thrid() {
         Scanner input = new Scanner(System.in);
         String str = input.next();
         System.out.println("请输入开始的位置:");
         int beginIndex = input.nextInt();
         System.out.println("请输入结束的位置:");
         int endIndex = input.nextInt();
         //进行截取
         String subStr = str.substring(beginIndex, endIndex+1);
         StringBuffer sbr = new StringBuffer(subStr);
         sbr.reverse();//进行字符串翻转
         String newStr = sbr.toString();//翻转完成的
         str = str.replace(subStr, newStr);
         System.out.println(str);
         
     }
    
     public static void fourth() {
         String str = "13842383838";
         char[] buf = str.toCharArray();
         for(int i =0 ;i<buf.length;i++) {
             if(i>=3 && i<=6) {
                 buf[i] = 'X';
             }
         }
         //通过字符串创建字符串
         String newStr = new String(buf);
         System.out.println(newStr);
        
     }
    
     public static void fifth() {
         //5.1
         String str = "this is a test of java";
         int count = 0;
         for(int i = 0;i<str.length();i++) {
             if(str.charAt(i) == 's') {
                 count++;
             }
         }
         System.out.println("s的次数是:"+count);
         
         //5.2
         int index = str.indexOf("test");
         String subStr = str.substring(index,(index+"test".length()));
         System.out.println("截取:"+subStr);
         
         //5.3
         char[] buf = str.toCharArray();
         System.out.println("字符数组:"+Arrays.toString(buf));
         
         //5.4
         String[] strArray = str.split(" ");
         System.out.println("字符串数组存储的元素:"+Arrays.toString(strArray));
         StringBuffer sbr = new StringBuffer();
         char[] bufs;
         for(String s : strArray) {
              bufs =  s.toCharArray();
              bufs[0] = (char)(bufs[0] - 32);
              for(int i = 0;i<bufs.length;i++) {
                  sbr.append(bufs[i]);
              }
              sbr.append(' ');
         }
         System.out.println("第一个单词字母大写后的字符串:"+sbr);
         
         //5.5
         for(int i = 0;i<strArray.length/2;i++) {
             String  tmp = strArray[i];
             strArray[i] = strArray[strArray.length-1-i];
             strArray[strArray.length-1-i] = tmp;
             
         }
         //按照要求进行拼接
         /*
          * 第一个参数就要按照什么隔开(拼)
          * 第二个参数是一个字符串数组
          */
         String newStr = String.join(" ", strArray);
         System.out.println(newStr);
     }
    
     public static void sixth() {
         Scanner input = new Scanner(System.in);
         String time = input.next();//20:39:40
         String[] times = time.split(":");//20,39,40
         int h  = new Integer(times[0]);
         int m  = new Integer(times[1]);
         int s  = new Integer(times[2]);
         s++;
         if(s == 60) {
             s = 0;
             m++;
             if(m == 60) {
                 m = 0;
                 h++;
                 if(h == 24) {
                     h = 0;
                 }
             }
         }
         System.out.println(String.format("%02d", h)+":"+
                     String.format("%02d", m)+":"+String.format("%02d", s));
     }
      public static void seventh() {
          String str = "1798798099079798098";
          StringBuffer sbr = new StringBuffer(str);
          for(int index = sbr.length()-3; index > 0; index -= 3) {
               sbr.insert(index, ',');
          }
          System.out.println(sbr);
      }

    
}

 

posted @ 2018-08-14 19:34  lijun199309  阅读(757)  评论(0编辑  收藏  举报