1.String 类:
java用于描述字符串数据的对象。
特点:String类型一旦初始化就不能再被赋值,因为是常量。字符串存储在字符串常量池中,实现数据共享。常量池的好处:不用每次都开辟空间,每次创建字符串对象之前,都会在字符串常量池中查找,如果有,就直接获取其地址,若没有则创建一个,方便下次使用。
2. "abcd"和new String("abcd")的区别:
"abcd":在字符串常量池中创建的一个"abcd"对象;new String("abcd"):在堆内存通过new创建了一个String类型的对象且在常量池中创建了一个"abcd"对象,并称其地址传给了堆内存new对象的构造函数。
记住:一般比较对象用的都不是==,而是equals,string重写equals方法,定义了自己对象相同的比较方式。用来比较字符串是否相同。
indexOf(str,fromindex): 获取子串str在字符串从索引fromindex开始第一次出现的位置;
length(): 获取字符串的长度;
charAt(int a): 某位置上的字符;
indexOf(char):获取字符char在字符串中第一次出现的位置;
replace(str,key):用字符串str来替换字符串中的一部分字符串key;
replace(target,replacement):用replacement来替换目标位置target的字符串;
subString(begin,end):取出begin到end间的一部分字符串;取出的是begin到end-1的值;
tocharArray():将字符串变成很多字符;返回char[];
LastindexOf():从后往前获取第一次出现的位置,但角标还是从前往后的。
4.通过练习学习String类的方法。
1.练习一:两个字符串的最大相同子串。
思路:
1.通过字符串的长度来判断长串和短串;
2.获取短串的所有子串(也可以获取长串的子串,只是相对效率较低);
3.再判断从长到短的子串是否包含于长串中,如果包含在其中,则返回该子串。
包含的方法:
length():获取字符串的长度,返回值类型int。
substring(i,j):获取字符串i角标到j-1角标的子串,返回值类型为String。
contains(s):判断字符串s是否包含在另一字符串中,返回值类型为boolean。
2.练习二:将字符串按自然顺序排序。
思路: 1.以前学过数组排序,所以先将字符串转为一个字符数组;
2.对字符数组中的元素进行排序,和整型数组元素排序差不多,比大小;
3.最后再将字符数组转为一个新的字符串。
或者直接用Arrays类的方法sort快速排序,效率最高。
包含的方法:
toCharArray():将字符串转为字符数组,返回char[] 类型。
new String(char[] ch):将一个字符数组转为新的字符串;
copyValueOf(char[] ch):返回数组组成的新字符串;返回类型是String;
valueOf(char[] ch):返回数组组成的新字符串;返回类型是String;
或者直接用Arrays.sort(char[] ch);
3.练习三:将字符串反转,如absdf-->fdsba.
思路:将字符串中的字符进行头尾置换,头自增,尾自减,直到头>尾结束置换,再返回字符串。
包含的方法:
charAt(int index):返回index角标的字符。
4.练习四:对字符串数组进行排序。
思路:和整型数组排序是一样的,通过String类的compareTo方法来比较字符串的大小,如果结果大于0,则交换位置。
包含的方法:compareTo(String s):返回值为int型。
5.练习五:对字符串数组取最值。
思路:先定义一个max来存储最大值的角标,初始化为0,然后通过比较compareTo方法将数组中
的每个元素与最大值比较,其它和整型数组中求最值一样。
使用的方法:compareTo(String s):返回值为int型。
5.字符串缓冲区StringBuffer
1.特点: 1.它是一个容器,可以存储任意类型的数据元素;
2.它的长度是可变的;
3.内部有synchronized,可用于多线程同步,安全;
4.可以对其中存入的内容和长度进行修改;
5.具备容器的基本方法:添加、删除、修改、获取;
6.里面的数据最终还是会转成字符串数据给别人使用。
2.基本方法:
添加: append(Object obj):添加obj到StringBuffer中已有数据的后面;
如:
StringBuffer sb=new StringBuffer();
sb.append("df").append(98).append('d');
insert(index,obj)://将obj插入到角标为index处,返回一个新的字符串。
如:sb.insert(2,"dfs");
删除:delete(start,end):删除角标为start到end-1之间的字符串;
需要注意的是:若end>count,则默认为end=count;若start<0,则抛出异常。
如:sb.delete(0,sb.length):清空缓冲区;
deleteCharAt(index):删除index角标处的单个字符。
如:sb.deleteCharAt(3);
修改:replace(start,end,str):用str替换角标为start到end-1的一部分字符串;
如:sb.replace(1,3,"ds");
setCharAt(index,str):将index处的字符用str替换,即替换单个字符;返回类型为void;
如:sb.setCharAt(2,"ds");
获取:indexOf(s):获取s在另一个字符串中的位置,返回int类型;
length():获取字符串的长度;
setLength(i):设置字符串的长度为i;如:setLength(0):清空缓冲区。
reverse():反转字符串;
等等方法。
思考题:既然数组和StringBuffer都是容器,有什么区别?
区别: 1.数组长度是固定的,而StringBuffer的长度是可变的;
2.数组一旦定义必须明确存储的元素类型,而StringBuffer存储的是任意类型的;
3.数组可以通过索引获取元素,而StringBuffer在调用时,只能将其转成字符串,无法直接使用其中单个元素。
3.StringBuffer内部原理:
1.其实该类中用于存储数据的容器就是数组,类型为char,调用的时候转成字符串再使用;
2.内部是一个长度可变的数组;
数组长度可变原理:创建StringBuffer对象时,就会建立一个数组实体,长度是16个字符,如果超出16个字符,就会新创建一个
长度规律增长的数组,将原数组的元素复制到新的数组,并将新元素添加到新数组中。
4.使用条件:只要有多种类型的数据,并最终要变成字符串,就可以使用StringBuffer。
6.SringBuilder:出现在JDK1.5版本后。
StringBuffer和StringBuilder的区别:
StringBuffer:能用于多线程,同步安全,但效率低,适用于多线程;
StringBuilder:用于单线程不同步,但效率高,适用于单线程。
7.基本数据类型对象包装类
共八中基本数据类型:byte,int,char,long,float,double,short,boolean.
1.最常用的Integer:被final修饰,不能再被继承。
将int类型封装成对象,作用之一是提供了能在int类和String类型之间相互转换的方法。
★ 基本数据类型base-->字符串
1.通过+"";
2.通过String类的valueOf(base)方法;
3.通过Integer类中的构造函数+toString();如:Integer i=new Integer("12");i.toString();
4.通过Integer类中的静态函数 toString(base);如:Integer.toString(3);
★ 字符串-->基本数据类型base
1.通过Integer类的构造函数+intValue();
2.通过Integer类的静态方法 parseInt(str);
注意:这里的str只能是数字格式的字符串,如果不是,则会抛出异常,但是又没处理,所以继承了RuntimeException,
不用标识出来,标识出来是因为可以处理,预先给出处理方案。
parseInt(str):可以将其他进制转换为十进制,因为默认为十进制。
parseInt(str,基数):标示str为基数进制的数字格式字符串。
2.基类对象包装类的特性(JDK1.5后):
★ 自动装箱拆箱:
如:Integer i=new Integer(3);
可以写成Integer i=3;这就叫自动装箱,在内部实现了Integer.valueOf(3),将3变成了一个对象赋给i;
i=i+3;这叫自动拆箱;在内部先将对象i转为整数即i.intValue(),这时再加3,自动拆箱过程;
全写:Integer i=Integer.valueOf(i.intValue()+3);
作用:简化书写,但有弊端。
弊端:如果Integer i=null; i就不能调用intValue方法了,会编译失败。
注意:自动装箱时,如果参数在byte范围[-128,127]内,则valueOf方法返回同一个对象,否则返回一个新的对象。
如:
Integer i=128;
Integer j=128;
System.out.println(i==j);
//结果为false,因为128不在byte范围[-128,127]内,所以i和j都各自返回一个新的对象。