------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
==========================================
15-01-01
==========================================
1.String类的特点:
字符串对象一旦被初始化,就不会被改变了.
String s ="abc";
s="nba";
sysout(s)
s是不变的,变的是s指向的是谁.
2.String s和String s1,s==s1的结果为true.
字符串创建的时候都会在字符串常量池中.s1建立的时候,常量池中已经有了,那么就把已经有的"abc"的地址值给s1,所以s和s1指向的是同一个"abc".存储在字符串常量池中,也叫字符串缓冲区.
3.String s1=new String("abc");
这时候s和s1就为false了,s1是在堆中创建了两个对象.s在字符串常量池中创建了一个abc字符串,s1是在堆内存中用new的方式创建了一个String对象,然后在构造的时候,接收了一个abc字符串,
equals比较的是地址值,但是把equals复写了,所以只比较内容.
==========================================
15-01-02
==========================================
1.String s=new String();
等效于String s="";
不等效于String s=null;
2.new String(arr,1,3)是从1开始取3个.
3.按照面向对象的思想对字符串进行功能分类.
1.获取
1.1获取字符的个数(长度).返回int
字符数组也有length,字符数组是属性,这里是方法.
1.2根据位置获取字符.
char charAt()
1.3根据字符获取第一次出现的位置
int indexOf
int lastIndexOf
查不到的话返回-1.
4.获取字符串中一部分字符串.也叫子串.
substring,返回子串,比如(1,3),从角标1到角标2,3是指在角标3之前.
所以获取全部其实就是(1,s.length()).
==========================================
15-01-05
==========================================
1.转换
1.1将字符串变成子串数组(字符串的切割)
split
String s="a,b,c";
String[] arr=s.split(",");
就是拿,逗号切
如果拿"."点来切,"."恰恰是正则中的符号,不能普通来切,那么就转译成普通点"\\.",一定要用两个斜线.涉及到正则表达式.
1.2打散成各个字符
toCharArray
返回的是 char[] arr 字符数组
1.3将字符串转成字节数组.
getBytes
返回的是 byte[] arr 字节数组
中文被打散成2个字节,ascii码表,美国标准信息交换码,GB2312,记录中文和二进制的对应关系.GBK,扩展,2万多中文字.
1.4将字符串中的字母转换大小写
toUpperCase() 变大写
toLowerCase() 变小写
返回的是String
大A65,小a97,相差32.如果char小于97,就+32,如果大于97,就-32.(转换大小写)
可以直接"abc".toUpperCase
1.5将字符串中的内容进行替换
replace(char oldch,char newch)
没有替换成功,返回的字符串还是指向原来的字符串,如果替换成功了,跟别的字符串是不相等的.
1.6返回字符串的副本,忽略前后空白
trim()
1.7连接字符串
concat(),其实就和+加号一样.
1.8别的形式都变成String.
valueOf
可以直接前面加""就行了.
2.判断
2.1两个是否相同
equals(Object obj) 返回的是boolean
equalsIgnoreCase 忽略大小写
2.2是否包含某一个字符串
contains boolean
2.3字符串是否以指定字符串开头,结尾
startsWith
endsWith
3.比较
3.1比较大小
compareTo
如果等于,返回值0,如果小于,返回负数,大于,返回正数.
例如"a"比"b"返回-1,"a"比"c"返回-2,"a"比"A"返回32.
==========================================
15-01-08
==========================================
1.intern
对字符串池进行操作
String s1=new String("abc");
String s2=s1.intern();
s1在堆里,池子里没有,所以创了一个返回给s2.
2.光标放在词组上,按一下f3,直接可以打开查看源文件
==========================================
15-01-08
==========================================
练习题
1.对字符串数组排列
选择排序,冒泡排序一个道理.
选择:
x=0;y=x+1;x<arr.length-1;
arr[x]>arr[y];
冒泡 x=0;y=0;y<arr.length-1-x;
arr[y]>arr[y+1]
2.子串在整串中出现的次数.
第一种:获取子串,在子串中找.
第二种:获取位置,从找到的位置开始找.
3.两个字符串中最大的相同子串.
相当于求小的字符串的所有子串
大圈为长度的次数,长度为5,就是5次
所以i<arr.length();
小圈两个变量,两个角标同时在加.
y=0; z=length-x
z<length+1;
==========================================
15-01-09
==========================================
1.StringBuffer--字符串缓冲区对象.
用于存储数据的容器.
特点:
1长度可以改变
2可以存储不同类型数据
3最终要转成字符串进行使用
4可以对字符串进行修改
2.既然是一个容器对象,应该具备什么功能呢?
1添加:
StringBuffer append(data);
sb2=sb1.append(*);
往sb1里面添加一个,s1和s2是一样的.
可以sb1.append().append();
2删除:
delete(start,end)包头不包尾
deleteCharAt(int index):删除指定位置的元素.
清空缓冲区sb.delete(0,sb.length())
sb=new StringBuffer();
用第一个比较好,第二个占内存.
还有:sb.setLength(0);
增长长度会在后面增加空字符"".
3插入:
insert(1,"abc"),在角标1插入"abc".
如果sb已经是"abcd",那么就是在b后面插入,也就是初始化b就是角标1的位置.
4查找:
charAt(index)
indexOf(String)
lastIndexOf(String)
5修改:
replace(start,end,string);把头到尾的东西换掉
setChatAt(index,char)角标上的元素换掉
增删改查CURD create,update,read,delete
reverse:头尾反转
==========================================
15-01-11
==========================================
1.StringBuffer构造一个其中不带字符的字符串缓冲区,初始容量为16个字符.
如果加入17个字符,系统会自动复制一个新数组,长度是原数组的2倍,然后把原数组的元素全都放在新数组中,然后把多出来的往后放.
也可以指定初始容量.
2.StringBuilder
提供和StringBuffer兼容的API,但不保证同步.StringBuffer线程安全.解决单线程效率问题.所以单线程用Builder,多线程用Buffer.
3.StringBuffer一旦构成了就是整串字符串,不像数组那样可以一个个取出来.
4.把数组改变成字符串,如果用String来加,那么每次都会在字符串常量池中添加一个字符串,占内存大,如果用StringBuffer,那么就是一个字符串对象.