目录
1.String类
String类的特点:
- 字符串是一个特殊的对象
- 字符串一旦初始化就不可以被改变
- 分析以下两句代码有什么区别?
String s1 = "abc";//s1是一个类类型变量, "abc"是一个对象 //字符串最大特点:一旦被初始化就不可以被改变。 String s2 = new String("abc");
s1在内存中有一个对象。
s2在内存中有两个对象。(先new一个对象,然后把"abc"传递给String的构造函数)。在这里,先不谈堆 和 栈 ,先简单引入常量池这个简单的概念。其实,常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
例子中的s1中的”abc”是字符串常量,它们在编译期就被确定了。
而用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的内存地址。
例1:
class Demo
{
public static void main(String[] args)
{
String s1="abc";
String s2=new String("abc");
String s3="abc";
System.out.println(s1==s2);
System.out.println(s1==s3);
//凡是内容中存在的字符串都不会再创建,Java会确保一个字符串常量只有一个拷贝
System.out.println(s1.equals(s2));
//String类复写了Object类中equals方法,该方法用于判断字符串的内容是否相同
}
}
注意:关于 equals() 和 == 区别:
- String类复写了Object类中equals方法,该方法用于判断字符串的内容是否相同。
- 而 == 是比较两字符串的地址是否相同,比较是不是同一个字符串的地址引用。
String类方法
String类适用于描述字符串事物。那么它就提供了多个方法对字符串进行操作。
常见的操作有哪些?
1.获取
- 字符串中的包含的字符数,也就是字符串的长度 int length():获取长度。
- 根据位置获取位置上某个字符。 char charAt(int index):
- 根据字符获取该字符在字符串中位置。
int indexOf(int ch):返回的是ch在字符串中第一次出现的位置。
int indexOf(int ch, int fromIndex) :从fromIndex指定位置开始,获取ch在字符串中出现的位置。
int indexOf(String str):返回的是str在字符串中第一次出现的位置。
int indexOf(String str, int fromIndex) :从fromIndex指定位置开始,获取str在字符串中出现的位置。int lastIndexOf(int ch) :返回字符最后一次出现的索引值
class StringDemo
{
public static void main(String[] args)
{
String s1="abcdefgaf";
System.out.println(s1.length()); //返回字符串的长度
System.out.println(s1.charAt(3)); //返回下标是3处的字符
System.out.println(s1.indexOf('c')); //字符c处的索引值
System.out.println(s1.indexOf('d',1)); //从下标1处开始查找字符d的索引
System.out.println(s1.lastIndexOf('a')); //字符a最后出现的索引值
}
}
2.判断
- 字符串中是否包含某一个子串 boolean contains(str):
特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1.表示该str不在字符串中存在。所以,也可以用于对指定判断是否包含。 if(str.indexOf("aa")!=-1) 而且该方法即可以判断,也可以获取出现的位置。
判断字符串中是否有内容 boolean isEmpty(): 原理就是判断长度是否为0.
字符串是否是以指定内容开头 :boolean startsWith(str);
字符串是否是以指定内容结尾:boolean endsWith(str);
判断字符串内容是否相同。复写了Object类中的equals方法:boolean equals(str);
判断内容是否相同,并忽略大小写:boolean equalsIgnoreCase();
class StringDemo
{
public static void main(String[] args)
{
String s1="StringDemo.java";
String s2="stringdemo.java";
System.out.println(s1.contains("Demo")); //是否包含Demo
System.out.println(s1.isEmpty()); //判断字符串是否为空
System.out.println(s1.startsWith("String"));
System.out.println(s1.endsWith("java"));
System.out.println(s1.equals(s2));
System.out.println(s1.equalsIgnoreCase(s2)); //忽略大小写比较内容
}
}
3.转换
- 将字符数组转成字符串:
构造函数:String(char[])
String(char[],offset,count):将字符数组中的一部分转成字符串。静态方法:
static String copyValueOf(char[]);
static String copyValueOf(char[] data, int offset, int count);static String valueOf(char[]):
- 将字符串转成字符数组
char[] toCharArray()
- 将字节数组转成字符串
String(byte[])
String(byte[],offset,count):将字节数组中的一部分转成字符串。
- 将字符串转成字节数组。
byte[] getBytes():
- 将基本数据类型转成字符串
static String valueOf(int)
static String valueOf(double)
class StringDemo
{
public static void main(String[] args)
{
char[] ch={'a','b','c','d','e','f'};
String s1=new String(ch);
String s2=new String(ch,1,3);//将字符数组的一部分转成字符串
System.out.println(s1);
System.out.println(s2);
String str="abcdef";
char[] arr=str.toCharArray();
for(int x=0;x<arr.length;x++)
{
System.out.println("arr="+arr[x]);
}
}
}
4.替换
String replace(oldchar,newchar);
class StringDemo
{
public static void main(String[] args)
{
String str="hello.java";
String s1=str.replace("java","class");
System.out.println(s1);
}
}
5.切割
String[] split(regex);
class StringDemo
{
public static void main(String[] args)
{
String str="Tom,Jack,Mike";
String[] s1=str.split(","); //切割完以后的字符串变成了字符串数组
for(int x=0;x<s1.length;x++)
{
System.out.println(s1[x]);
}
}
}
6.子串
获取字符串中的一部分:
String substring(begin); //从begin到字符串末尾
String substring(begin,end);
class StringDemo
{
public static void main(String[] args)
{
String str="abcdef";
String s1=str.substring(2); //从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异常。
String s2=str.substring(2,4); //包含头,不包含尾。
System.out.println(s1);
System.out.println(s2);
}
}
7.转换
转换,去除空格,比较:
- 将字符串转成大写或则小写:
String toUpperCase(); //将字符串中的所有字母都变成大写
String toLowerCase(); //将字符串中的所有字母都变成小写
- 将字符串两端的多个空格去除
String trim(); //只去除两端的空格,中间的空格不会去除
- 对两个字符串进行自然顺序的比较:
int compareTo(string);
class StringDemo
{
public static void main(String[] args)
{
String str=" Hello World";
String s1=str.toUpperCase(); //变大写
String s2=str.toLowerCase(); //变小写
String s3=str.trim(); //去除两边的空格
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
String s4 = "a1c";
String s5 = "aaa";
System.out.println(s4.compareTo(s5));
}
}
2.StringBuffer
- 字符串的组成原理就是通过该类实现的;
- StringBuffer可以对字符串内容进行增删;
- StringBuffer是一个容器;
- 很多方法与String相同;
- StingBuffer是可变长度的.
- StingBuffer是字符串缓冲区
- 可以直接操作多个数据类型
- 最终会通过toString方法变成字符串。
StringBuffer特有方法
1.存储
StringBuffer append():将指定数据作为参数添加到已有数据结尾处。
StringBuffer insert(index,数据):可以将数据插入到指定index位置。
class StringDemo
{
public static void main(String[] args)
{
StringBuffer sb=new StringBuffer();
sb.append("abc");
sb.append("def");
System.out.println(sb.toString()); //最终会通过toString方法变成字符串
sb.insert(2,"haha");
System.out.println(sb.toString());
}
}
2.删除
StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
StringBuffer deleteCharAt(index):删除指定位置的字符。
class StringDemo
{
public static void main(String[] args)
{
StringBuffer sb=new StringBuffer("abcdefg");
sb.delete(1,3); //删除时包含头不包含尾
System.out.println(sb);
sb.delete(0,sb.length()); //删除全部内容
System.out.println(sb);
}
}
3.获取
char charAt(int index)
int indexOf(String str)
int lastIndexOf(String str)int length()
String substring(int start, int end)
4.修改
StringBuffer replace(start,end,string);
void setCharAt(int index, char ch) ;将缓冲区中指定数据存储到指定字符数组中
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
class StringDemo
{
public static void main(String[] args)
{
StringBuffer sb=new StringBuffer("abcdefg");
sb.replace(1,3,"haha");
System.out.println(sb);
sb.setCharAt(3,'g');
System.out.println(sb);
}
}
5.反转
StringBuffer reverse();
class StringDemo
{
public static void main(String[] args)
{
StringBuffer sb=new StringBuffer("abcdefg");
sb.reverse();
System.out.println(sb);
}
}
注意:JDK1.5 版本之后出现了StringBuilder.
StringBuffer是线程同步。
StringBuilder是线程不同步。以后开发,建议使用StringBuilder
升级三个因素:
1,提高效率。
2,简化书写。
3,提高安全性。