String类-特点
String(类) str(类类型的变量)=”abc”;(字符串其实就是一个对象)
package cn.itcast.string.demo;
public class StringDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
/*
* 在eclipse中打一个/*然后回车之后,自动生成了注释。
* String类的特点:字符串对象一旦被初始化就不会被改变。
*/
StringDemo2();//刚刚是我选中了这一段代码,右击鼠标,选中refactor,然后extract method,就可以将其抽取方法出来。
}
public static void StringDemo2() { //需要对StringDemo2上按住ctrl+1才能出来创建方法体的对话框。
还是没有找到如何切换关键字权限的快捷键。(用tab好像不行)
// TODO Auto-generated method stub
String s="abc";//常量池中创建一个字符串对象
String s1=new String("abc");//现在是堆内存中,其实在堆里面创建了2个对象。
System.out.println(s==s1);//现在打印的是false,
System.out.println(s.equals(s1));//打印的是true,之前其实是比较的地址。但是字符串对象比较的是内容,而不比较地址。
//(因为String类中的equals复写了Object中的equals方法,其实就是比较字符串内容)
}
/**
* 另外ctrl+m当前窗口最大化,还原也是这个操作。
* 演示字符串定义的第一种方式,并明确字符串常量池的特点。
* 池中没有就建立,池中有,直接用。
*/
private static void StringDemo1() {
String s="abc";//刚开始没有abc,字符串存储在常量池中,就创建了。
String s1="abc";//发现常量池中已经有了abc常量,所以直接把abc的地址给了s1.
System.out.println(s==s1); //跟我想的结果一样,运行结果为真。
System.out.println("s="+s);//直接可以输入syso然后再输入Alt+/即可实现输入标准输入语句。然后再右键,
run as就可以把第一个java程序跑起来了。
}
String类-构造函数
package cn.itcast.string.demo;
public class StringConstructorDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringConstructorDemo2();
}
private static void StringConstructorDemo2() {
// TODO Auto-generated method stub
char[] arr= {'w','a','p','q','x'};
//String s=new String(arr);打印结果为s=wapqx,如果不传arr,那么什么也打印不了。只有s=
String s=new String(arr,1,3);//打印结果为s=apq;
System.out.println("s="+s);
}
private static void StringConstructorDemo() {
// TODO Auto-generated method stub为什么每次创建都有这个呢?可以清楚的。在设置里面可以设置。代码模板,问题不大。
String s=new String();//等效于String s="";不等效String s=null;
byte[] arr= {65,66,67,68};
String s1=new String(arr);
System.out.println("s1="+s1);//结果为S1=ABCD
}
}
常用对象API(String类-常见功能-获取)&(String类-常见功能-转换)&(String类-常见功能-判断)&(String类-常见功能-比较)
package cn.itcast.string.demo;
public class StringMethodDemo {
public static void main(String[] args) {
/*
* 按照面向对象的思想对字符串进行功能分类。
* “abcd”(需要去查API来获取相应的操作方法)
* 1.获取:
* 1.1获取字符串的个数(长度) int length();
* 1.2根据位置获取字符。char charAt(int index);
* 1.3根据字符获取在字符串中第一次出现的位置。常理推断应该是这种int (char )但是int indexOf(int ch)不仅仅接受‘a’,
也可以接受传入97.
* int idnexOf(int ch,int fromIndex);从指定 的位置开始索引
*
* int lastIndexOf(int ch)
* int lastIndexOf(int ch,int fromIndex);(自己多用用就熟练了。)
* 1.4获取字符串中的一部分字符串。也叫子串。
* String substring(int beginIndex, int endIndex)
* String substring(int beginIndex)
*
*
*2.转换
* 2.1将字符串变成字符串数组(字符串的切割)
* String[] split(String regex):涉及到正则表达式。
* 2.2 将字符串变成字符数组。(这个就不演示了。)
* char[] toCharArray();
* 2.3将字符串变成字节数组(一个汉字占用2个字节)
* byte[] getBytes()
* 2.4将字符串中的字母转成大小写。
* String toUpperCase():大写
* String toLowerCase() 小写
* 2.5将字符串中的内容替换。
* String replace(char oldch,char newch)
* 2.6将字符串两端的空格去掉。
* String trim();
* 2.7将字符串进行连接。
* String concatenation(string);
* 更多的自己去查API学习。
* 3.判断
* 3.1两个字符串内容是否相同啊?
* boolean equals(Object obj);
* boolean equalsIgnoreCase(string str);忽略大小写比较字符串内容
* 3.2字符串中是否包含指定字符串?
* boolean contains(string str);
* 3.3字符串是否以指定字符串开头,是否以指定字符串结尾。
* boolean startWith(string);
* boolean endsWith(sting);
* 4.比较
* public int compareTo(Sting anotherString)
*
*/
stringMethodDmeo_2();
}
private static void stringMethodDmeo_2() {
//String s="张三,李四,王五";
String s="张三。李四。王五";//下面如果用.去切的话就会报错,恰恰是正则表达式。那么如何处理呢
String[] arr=s.split("\\.");
//String[] arr=s.split(",");
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]); //打印结果为张三,李四,王五分别换行
}
}
private static void stringMethodDmeo_1() {
String s="abcdae";
System.out.println("length"+s.length()); //6
//System.out.println("char:"+s.charAt(2)); // c
//System.out.println("char:"+s.charAt(20)); //会提示越界了
System.out.println("index:"+s.indexOf('k'));//-1,我们可以根据-1来判断该字符或者字符串是否存在。
System.out.println("index:"+s.indexOf('a'));// 0
System.out.println("index:"+s.lastIndexOf('a'));//4
System.out.println("index:"+s.substring(2, 4));//包含begin,但是不包含end,只能打印cd.
}
}
常用对象API(String类-常见功能-方法)
package cn.itcast.string.demo;
public class StringObjectDemo {
public static void main(String[] args) {
//String s1="abc";
//String s2="abc";
//intern():可以对字符串池进行操作
String s1=new String("abc");
String s2=s1.intern();//操作池中的对象,返回字符串池中的对象。
System.out.println(s1==s2);//运行结果为false
}
}
练习题就略过,自己去练习。
StringBuffer字符串缓冲区(其实就是一个容器)
可变数组变长的原理(数组长度肯定不能变的,只是存不到的时候,再复制一个8个长度的数组叠加到后面):
package cn.itcast.p2.stringbuffer.demo;
public class StringBufferDemo {
public static void main(String[] args) {
/*
* StringBuffer:就是字符串缓存区。
* 用于存储数据的容器。
* 特点:
* 1.长度可变
* 2.可以存储不同类型的数据
*
*
*
* 既然是一个容器对象。应该具有什么功能呢?
* 1.添加:
* append(data);
* 2.删除:
* StringBuffer delete(start,end); 包含头,不包含尾
* StringBuffer deleteChartAt(int index):删除指定位置的元素
* 3.查找
* char charAt(index);
* int indexOf(string);
* int lastIndexOf(string);
* 4.修改
* StringBuffer replace(start,end,String);
* void setChartAt(index,char);
*
*
*
*
*/
bufferMethodDemo2();
}
private static void bufferMethodDemo2() {
StringBuffer sb=new StringBuffer("abce");
//sb.delete(1, 3);
sb.delete(0, sb.length());//清空缓冲区的操作。sb.setLength(0)也可以实现清空缓存区的操作。
System.out.println(sb);
}
private static void bufferMethodDemo1() {
StringBuffer sb=new StringBuffer("abce");
//sb.append("xixi");
sb.insert(2, "qq");
System.out.println(sb.toString());
}
public static void bufferMethodDemo() {
//创建缓冲区对象。
StringBuffer sb=new StringBuffer();
StringBuffer s1=sb.append(4);
sb.append(4).append(false);//可以一直调用下去,方法调用链
sb.insert(1, "haha");//在第一个位置处插入haha
System.out.println(sb);
System.out.println(s1);
System.out.println(sb==s1);//你把4放容器里面,其实还是这个4.
}
}
StringBuider(功能和用法和StringBuffer一模一样)
package cn.itcast.p2.stringbuffer.demo;
public class StringBuilerDemo {
public static void main(String[] args) {
/*
* jdk1.5以后出现了功能和StringBuffer一模一样的对象。就是StringBuider
* 不同的是:
* StringBuffer是线程同步的,
* 而StringBuidler是不同步的。线程不安全。所以速度更快。(不需要判断锁)
* 建议单线程使用Bulider,为了提高效率;而多线程用于Buffer.
*
* jdk升级:
* 1.简化书写(具备了一定的局限性)
* 2.提高效率(也是同样的道理)
* 3.增加爱安全性(往往带来书写的麻烦)
*/
}
}
/*
* class StringBuffer//创建一个StringBuffer对象,一个往里面添加,一个往里面删除。需要
* {
* Object lock;
* public StringBuffer append(int x )
* {
* synchronized(lock)
* {
*
* }
* }
* public StringBuffer delete(int start,int end)
* {
* synchronized(lock)
* {
*
* }
* }
* }
*
*/