Day13.01_____StringBuffer类的构造方法
- public StringBuffer(){}
构造一个不带字符的字符串缓冲区,其池子的初始容量为16个字符 - public StringBuffer(int capacity)
构造一个不带字符的字符串缓冲区,其池子的初始容量为capacity个字符 - public StringBuffer(String str)
构造一个字符串缓冲区,其池子的初始容量为(16+str长度)个字符
Day13.02_____StringBuffer类的方法
- capacity()(了解)
获取字符串缓冲区的初始容量大小,即理论值,可以通过StringBuffer()的构造方法改变其值的大小 - length()
获取字符串的长度,即实际值- (1) capacity()与length()的区别:
length()获取的是字符串的实际长度,该方法常用capacity()获取的是容量池的大小,该方法不常用
- (1) capacity()与length()的区别:
- append()
返回值类型StringBuffer,作用是往StringBuffer对象中追加对象
(1) 例子:
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = sb.append(true);
StringBuffer sb3 = sb.append(123);
StringBuffer sb4 = sb.append(“你好”);
System.out.print(sb); true123你好
System.out.print(sb2); true123你好
System.out.print(sb3); true123你好
System.out.print(sb4); true123你好
解释:这里利用了StringBuffer类中的可变性,为什么可变?是因为sb、sb2、sb3、sb4引用都指向同一个地址,因此输出的结果为最后append()完以后的结果 - insert(int offset,int i)
返回值类型StringBuffer,作用是往StringBuffer对象中,在指定的位置添加数据,添加的数据可以是基本数据类型的,也可以是String类型的,也可以是Object对象
(1) 例子:
StringBuffer sb = new StringBuffer(“itcast”);
sb.insert(1, “heima”);
System.out.print(sb); //iheimatcast
解释:1表示在索引1的位置插入字符串heima,因此tcast会往后挪 - deleteCharAt(int index)
返回值类型StringBuffer,作用是删除指定索引处的字符 - delete(int start,int end)
返回值类型StringBuffer,作用是删除从开始索引到结束索引的字符串,包含头,不包含尾
注意:清空缓冲区
sb.delete(0,sb.length()); - replace(int start,int end,String str)
返回值类型StringBuffer,作用是替换从指定索引start开始到end结束的字符串 - reverse()
返回值类型StringBuffer,作用是将缓冲区的字符反转 - substring(int start)
返回值类型String,作用是将缓冲区的字符串从start开始进行截取 - substring(int start,int end)
返回值类型String,作用是将缓冲区的指定字符串从start( 取 )开始到end( 不取 )结束进行截取
Day13.03_____StringBuffer与String之间的转换
- StringBuffer ----> String
- 通过substring(int start , int end)
- 通过toString()方法
- 通过String类的构造方法 String str = new String(sb)
- String ----> StringBuffer
- 通过StringBuffer类的构造方法
StringBuffer sb = new StringBuffer(str) - 通过append()方法
- 通过StringBuffer类的构造方法
Day13.04_____String、StringBuffer、StringBuilder的区别
- String是不可变的字符串序列;
StringBuffer和StringBuilder是可变的字符串序列 - StringBuffer是线性安全的,因此效率比较低;
StringBuilder是线性不安全的,因此效率比较高
Day13.05_____String和StringBuffer作为参数进行传递
- 例子:
解释:为什么调用String对象作为参数的方法后输出的仍然是abc,而调用StringBuffe对象作为参数的方法后输出的是abcheima?class Demo{ public static void main(String[] args){ String str = new String("abc"); StringBuffer sb = new StringBuffer("abc") change(str); System.out.print(str); // abc change(sb); System.out.print(sb); //abcheima } public static void change(String str){ str = str + "def"; } public static void change(StringBuffer sb){ sb.append("heima"); } }
根据String类和StringBuffer类的性质来解释,因为String类是不可变的字符串序列,对象一旦被创建后不可被修改,除非将原来的对象变成垃圾;而StringBuffer类是可变的字符序列,对象被创建后可以被修改
Day13.06_____冒泡排序和选择排序
- 冒泡排序:
将数组中的前一个数与后一个进行比较,最先将最大的值放到数组最后,代码实现需要用到大圈套小圈思想 - 选择排序:
将数组的第一个数分别与后面的数进行比较,最先将最小的数放到数组最前,代码实现需要用到大圈套小圈思想
Day13.07_____二分查找法
- 注意事项:
使用该方法有一个前提,数组必须是由小到大排列的 - 思想:
首先取出数组的中间值,将这个中间值与需要找的数进行比较如果中间值>需要找的数,就将中间值右边的所有数pass掉,再继续到左边去寻找
Day13.08_____Arrays类
- sort()
对数组进行升序排序 - toString()
将数组转换成字符串
Day13.09_____基本数据类型的包装类
- 为什么要有基本数据类型的包装类呢?
因为基本数据类型是不能创建对象并调用方法的,如果有了包装类,我们就可以封装方法提供给我们使用,比如说把一个整数转换成二进制 - 基本数据有哪些? ( 四类八种 )
基本数据 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
Day13.10_____Integer包装类的构造方法
- public Integer(int i)
将一个基本数据类型为int的数据转换成一个Integer对象 - public Integer(String s)
将一个数字字符串转换成一个Integer对象。需注意的是,字符串必须是数组类型的,否则会报错
Day13.11_____int与String之间的相互转换
- int ----> String
(1) 和""进行拼接
(2) 通过String类中的valueOf(int i ) - String ----> int
(1) 通过Integer类的parseInt(String s)
注意:在八种基本类型中,除了racter没有parseXxx()方法外其余的7种类型都有parseXxx()方法
Day13.12_____自动拆箱和自动装箱( JDK1.5版本以后的特性 )
- 自动拆箱
int x = 10; 把对象转换成基本数据类型
Integer i = x;
JDK1.5版本以前的做法:Integer i = new Integer(x); - 自动装箱
Integer i = x; 把基本数据类型变成对象
x = i + 20;
JDK1.5版本以前的做法:int x = i.intValue( );
Day13.13_____Integer面试题
- 例子1:
Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println(i1 == i2); //false
System.out.println(i1.equals(i2)); //true
解释:因为使用了new关键字,所以在创建对象的时候会在堆内存中创建,有几个new关键字就会创建几个对象,i1和i2是两个对象 - 例子2:
Integer i3 = new Integer(97);
Integer i4 = new Integer(97);
System.out.println(i3 == i4); //false
System.out.println(i3.equals(i4)); //true
解释:和上面一样 - 例子3:
Integer i5 = 127;
Integer i6 = 127;
System.out.println(i5 == i6); //true
System.out.println(i5.equals(i6)); //true
解释: 首先我们需要知道一个概念,在我们第一次Integer i5 = 127时会在底层创建一个数组用于存储-128到127之间的Integer对象值,然后从数组中去获取Integer对象;第二次Integer i6 = 127后不会再去创建一个对象数组,而是会从第一次创建的对象数组中去获取对象。因此两次指向的是同一对象,这个解释和String类的常量池相似。由此我们可以推断出,当创建两个Integer对象赋值范围在-128—127之间时,它们指向的时同一地址 - 例子4:
Integer i7 = -129;
Integer i8 = -129;
System.out.println(i7 == i8); //false
System.out.println(i7.equals(i8)); //true
解释:解释和上面同理,i7 == i8为false的原因是它们超出了一个字-128—127的取值范围