Java语言除了基本类型之外的变量类型都是引用类型。
引用是得到对象的一种方式,是对象的地址,可以理解为简化的指针,但引用屏蔽了一些指针的基本操作,例如++ -- * ,防止程序员直接对地址进行操作。
Java中对象就是通过引用操作的。
java.lang.String类代表不可变的字符序列(使用lang包里的东西,不需要引用lang包)
class StringDemo
{
public static void main(String[] args)
{
String s1="abc";//s1是一个类类型变量,所以abc是一个对象
//字符串最大特点:一旦初始化就不可以被改变
String s2=new String("abc");
//s1和s2有什么区别?
//s1代表一个对象,s2有两个对象
System.out.println(s1==s2);
System.out.println(s1.equals(s2));//String类复写了Object类中的equals方法,该方法用于判断字符串是否相同
}
}
/*
String类适用于描述字符串事物,那么它提供了多个方法对字符串进行操作
常见的有:“abcd”
1、获取
1.1字符串中的保函的字符数,即字符串的长度。int length();获取长度
1.2根据位置获取位置上某个字符。char charAt(int index);
1.3根据字符获取该字符在字符串中的位置。
int indexOf(int ch);返回的是ch在字符串中第一次出现的位置。
int indexOf(int ch,int fromIndex):从fromIndex指定位置开始,获取ch在字符串中出现的位置。
int indexOf(int str);返回的是str在字符串中第一次出现的位置。
int indexOf(int str,int fromIndex):从fromIndex指定位置开始,获取str在字符串中出现的位置。
int lastIndexOf(int ch);
2、判断
2.1字符串是否包含某一个子串
boolean contains(str);
特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1,表示该str步骤字符串中存在,
所以,也可以用于对指定判断是否包含。
if(str.indexOf("aaaa")!=-1)
该方法既可以判断又可以判断获取出现的位置。
2.2字符中是否有内容
boolean isEmpty();原来是判断字符串长度是否为0
2.3字符串是否是以指定内容开头
boolean startswith(str);
2.4字符串是否是以指定内容结尾
boolean endswith(str);
2.5判断字符串内容是否相同,复写了Object类中的equals方法
boolean equals(str);
2.6判断内容是否相同,并忽略大小写
boolean equalsIgnoreCase();
3.转换
3.1将字符数组转成字符串
构造函数:String(char[])
String(char[],offset,count):将字符数组中的一部分转成字符串
静态方法:static String copyValueOf(char[]);
static String copyValueOf(char[] data,int offset,int count)
static String valueOf(char[]);
3.2将字符串转成字符数组
char[] toCharArray();
3.3将字节数组转成字符串
String(byte[])
String(byte[],offset,count):将字节数组中的一部分转成字符串
3.4将字符串转成字节数组
byte[] getBytes();
3.5将基本数据类型转成字符串
static String valueOf(int)
static String valueOf(double)
//3+"";//String.valueOf(3);
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
4.替换
String replace(oldchar,newchar);
5.切割
String[].split(regex);
6.子串,获取字符串中的一部分
String substring(begin);
String substring(begin,end);
7.转换、去除空格、比较
7.1将字符串转成大写或小写
String toUpperCase();
String toLowerCase();
7.2将字符串两端的多个空格去除
String trim();
7.3对两个字符串进行自然顺序的比较
int compareTo(string);
*/
class StringMethodDemo
{
public static void method_7()
{
String s=" jfkjd jdkfj fjd ";
sop(s.toLowerCase());
sop(s.toUpperCase());
sop(s.trim());
String s1="abc";
String s2="aaa";
sop(s.compareTo(s2));
}
public static void method_sub()
{
String s="abcdefgh";
sop(s.substring(2));//从指定位置到结尾.如果角标不存在,会出现字符串角标越界异常
sop(s.substring(2,5));//包含头,不包含尾
//获取整个字符串s.substring(0,s.length());
}
public static void method_split()
{
String s="jdfa,fjkads,irj";
String[] arr=s.split(",");
for(int x=0;x<arr.length;x++)
{
sop(arr[x]);
}
}
public static void method_replace()
{
String s="hello world";
// String s1=s.replace('e','g');//如果要替换的字符不存在,返回的还是原字符串
String s1=s.replace("world","java");
sop("s="+s);
sop("s="+s1);
}
public static void method_trans()
{
char[] arr={'a','b','c','d','e'};
String s=new String(arr);
sop("s="+s);
String s1="afagags";
char[] chs=s1.toCharArray();
for(int x=0;x<chs.length;x++)
{
sop("ch="+chs[x]);
}
}
public static void method_is()
{
String str="ArratDemo.java";
sop(str.startswith("Array"));//判断文件名称是否是Array单词开头
sop(str.endswith(".java"));//判断文件名称是否是.java的文件
sop(str.contains("Demo"));//判断文件名中是否包含Demo
public static void method_get()
{
String str="afgdfgff";
//长度
sop(str.length());
//根据索引获取字符
sop(str.charAt(4));//当访问到字符串中不存在的角标时会发生SrringIndexOutOfBoundsException。
//根据字符获取索引
sop(str.indexOf('f',2));//如果没有找到,返回值为-1
//反向索引一个字符出现位置
sop(str.lastIndexOf("a"));
// System.out.println(str.length());
}
public static void main(String[] args)
{
method_7();
// method_sub();
// method_split();
// method_replace();
// method_trans();
// method_is();
// method_get();
// String s1="abc";
// String s2=new String("abc");
// String s3="abc";
// System.out.println(s1==s2);
// System.out.println(s2==s3);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
StringBuffer与String
StringBuffer和String类似,但StringBuffer可以对字符串对象进行修改
当修改时,不用另在堆里开内存,而是在原来的内存里添加修改的东西,StringBuffer是线程安全的。
/*
StringBuffer是字符串缓冲区,是一个容器,
特点:1.而且长度是可变化的2.可以字节操作多个数据类型3.最终会通过toString方法变成字符串
C create U update R read D delete
1.存储
StringBuffer append():将指定数据作为参数添加到已有数据结尾处
StringBuffer insert(index,数据);可以将数据插入到指定位置
2.删除
StringBuffer delete(start,end);删除缓冲区中的数据,包含start,不包含end
StringBuffer deleteCharAt(index);删除指定位置的字符
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);
5.反转
StringBuffer reverse();
6.void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin)
JDK1.5版本之后出现了StringBuilder
StringBuffer是线程同步的(多线程),StringBuilder是线程不同步的(单线程)。
建议使用StringBuilder
升级三个因素
1.提高效率 2.简化书写 3.提高安全性
*/
class StringBufferDemo
{
public static void main(String[] args)
{
// method_delete();
// method_update();
StringBuffer sb=new StringBuffer("fafafdfgd");
char[] chs=new char[9];
sb.getChars(2,4,chs,1);
for(int i=0;i<chs.length;i++)
{
sop("chs["+i+"]="+chs[i]+";");
}
public static void method_update()
{
StringBuffer sb=new StringBuffer("jgfdgsdfm");
// sb.replace(1,4,"java");//将角标1-4替换成java
sb.setCharAt(2,'k');//将角标为2的字母替换成k
sop(sb.toString());
}
public static void method_delete()
{
StringBuffer sb=new StringBuffer("affgfg");
// sb.delete(1,3);
//清空缓冲区
// sb.delete(0,sb.length());//删除所有
// sb.delete(2,4);//删除某一个2-4
sb.deleteCharAt(2);
sop(sb.toString());
}
public static void method_add()
{
StringBuffer sb=new StringBuffer();
sb.append("abc").append(true).append(34);//方法调用链
// StringBuffer sb1=sb.append(34);
sb.insert(1,"qq");
sop(sb.toString());//abctrue34
// sop(sb1.toString());
}
public static void sop(String str)
{
System.out.println(str);
}
}