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