包装类、字符串
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); } }