首页 > 代码库 > java(六)
java(六)
String类
特点: 字符串是一个特殊的对象,字符串对象一旦初始化就不可以被改变。
class StringDemo
{
public static void main(String[] args)
{
String s="abc";
String s1="abc";
String s2=new String("abc");
System.out.println(s==s1);
System.out.println(s==s2);
System.out.println(s.equals(s2));
}
}
第一个结果为true。比较的是地址,为什么会相同呢?
"abc"存储在字符串常量池中,为s赋值时,没有"abc",就创建,然后把地址给s,为s1赋值时,
发现常量池中有,就不用再创建了,直接把地址给s1,所以他两地址就相同了。
第二个结果为false。前面都相同了,这里为什么又不同了呢?
s和s1是在字符串常量池中创建的一个abc字符串,在内存中产生一个对象。s2是在堆内存创建了一个String对象,
这个对象在构造时,接收了一个字符串对象,并没有在字符串常量池做任何事情。在内存中产生两个对象,一个String,一个abc。
所以比较地址时,必定不同。前者在常量池创建一个对象,后者在堆内存创建两个对象。
第三个结果为true,equals方法比较的是地址啊,为什么又相同了呢?
String类中的equals复写了object中的equals,变成了比较字符串内容。
String的构造函数
public class StringConstructorDemo
{
public static void main(String[] args)
{
stringConstructorDemo(); //将字节数组变成字符串
stringConstructorDemo2(); //将字符数组变成字符串
}
private static void stringConstructorDemo() {
byte[] arr={65,66,67,68};
String s=new String(arr);
String s1=new String(arr,0,3); //从角标为1的元素开始,打印3个数
System.out.println("s="+s);
System.out.println("s1="+s1);
}
private static void stringConstructorDemo2() {
char[] arr={‘w‘,‘a‘,‘p‘,‘q‘,‘x‘};
String s2=new String(arr);
String s3=new String(arr,1,3); //从角标为1的元素开始,打印3个数
System.out.println("s2="+s2);
System.out.println("s3="+s3);
}
}
程序的结果为:
s=ABCD
s1=ABC
s2=wapqx
s3=apq
字符串涉及到的一些方法:
按照面向对象的思想,对字符串进行功能分类。
1.获取:
a.获取字符串中字符的个数(长度)
int length();
b.获取指定位置的字符。
char charAt(int index);
c.根据字符(串)获取其在字符串中第一次出现的位置。
int indexOf(int ch) //这里参数支持两种类型,你输A 它帮你找,输65也能找
int indexOf(int ch,int fromIndex) //从指定位置开始往后找字符第一次出现的位置,上面那个是从角标0开始。
int indexOf(String str); //从0开始,查找字符串
int indexOf(String str,int fromIndex) //从指定位置开始,查找字符串。
int lastIndexOf(int ch) //从后往前找,字符第一次出现的位置
int lastindexOf(String str,int fromIndex) //从后往前找,字符串第一次出现的位置
d.获取字符串的一部分,也叫子串
string substring(int beginIndex) //从beginIndex开始,后面全要了。
string substring(int beginIndex int endIndex) //从beginIndex开始,endIndex-1结束,也就是不包括endIndex。
2.转换
a.将字符串变成字符串数组(字符串的切割)
String[] split(String regex); //涉及到正则表达式。
b.将字符串变成字符数组
char[] toCharArray(); //注意这个和上面的区别,上面相当于刀,切成一块一块的,这个相当于锤,砸成一个一个的。
c.将字符串变成字节数组
byte[] getBytes();
d.将字符串中的字母大小写转换
String[] toUpperCase(); //转成大写
String[] toLowerCase(); //转成小写
e.将字符串中的内容进行替换
String replace(char oldChar,char newChar);
String replace(string s1,string s2);
f.去除字符串两段的空格
String trim();
g.将字符串进行连接
String concat(string);
3.判断
a.两个字符串内容是否相同?
boolean equals(Object,object);
boolean equalsIgnoreCase(String str); //忽略大小写比较字符串内容是否相同
b.字符串中是否包含指定字符串?
boolean contains(string str);
c.字符串是否以指定字符串开头?是否以指定字符串结尾?
boolean startsWith(string);
boolean endsWith(string);
4.比较
a.比较两个字符串的ascii码值大小
int compareTo(string str) //如果相等,返回0,前面大返回正数,后面大返回负数。
示例:
public class StringMethodDemo {
public static void main(String[] args) {
stringMethodDemo_1();
stringMethodDemo_2();
stringMethodDemo_3();
stringMethodDemo_4();
}
private static void stringMethodDemo_4() {
System.out.println("a".compareTo("d"));
}
private static void stringMethodDemo_3() {
String s="abc";
System.out.println(s.equals("ABC"));
System.out.println(s.equalsIgnoreCase("ABC"));
System.out.println(s.contains("bc")); //也可以用indexOf判断,如果是-1就不包含。
String str="ArrayDemo.java";
System.out.println(str.startsWith("Array"));
System.out.println(str.endsWith(".java"));
System.out.println(str.contains("demo"));
}
private static void stringMethodDemo_2() {
String s="张三,李四,王麻子";
String[] arr=s.split(","); //加入这里不是用逗号切,而是用小数点切,要这样写 \\.
//前面加转义符号,小数点相当于一个关键字,所以要转义
for(int i=0;i<arr.length;i++)
System.out.println(arr[i]);
char[] chs=s.toCharArray();
for(int i=0;i<chs.length;i++)
System.out.println(chs[i]);
s="ab你"; //一个中文,两个字节
byte[] bytes=s.getBytes();
for(int i=0;i<bytes.length;i++)
System.out.println(bytes[i]);
System.out.println("Abc".toUpperCase());
System.out.println("javo".replace(‘o‘, ‘a‘));
System.out.println("-"+" ab c ".trim()+"-"); //两端加的减号没啥意思,就是为了看的明显点
System.out.println("abc".concat("kk"));
}
private static void stringMethodDemo_1() {
String s="abcdae";
System.out.println("length:"+s.length()); //如果把abcdae全删了,长度为0,但只有一个空格,长度为1,空格也算一个字符
System.out.println("char:"+s.charAt(2)); //如果大于5,则字符串角标越界异常
System.out.println("index:"+s.indexOf(‘a‘)); //如果找k,则运行结果为-1,不报异常。所以我们也可以根据-1,判断字符是否存在。
System.out.println("lastindex:"+s.lastIndexOf(‘a‘));
System.out.println("substring:"+s.substring(3, 5)); //注意不包括结束的那个角标
}
}
运行结果为:length:6
char:c
index:0
lastindex:4
substring:da
张三
李四
王麻子
张
三
,
李
四
,
王
麻
子
97
98
-60
-29
ABC
java
-ab c-
abckk
false
true
true
true
true
false
-3
StringBuffer:就是字符串缓冲区,用于存储数据的容器。
特点:1.长度是可变的。
* 2.可以存储不同类型的数据。
* 3.最终要转成字符串进行使用。
* 4.可以对字符串进行修改。
*既然是一个容器对象,应该具备什么功能呢?
*1.添加:
* StringBuffer append(data);
* StringBuffer insert(index,data)
*2.删除:
* StringBuffer deleteCharAt(int index) //删除指定位置元素
* StringBuffer delete(int start,int end) //包含头不包含尾
*3.查找
* char charAt(index);
* int indexOf(string);
* int lastIndexOf(string);
* 4.修改
* StringBuffer replace(start,end,data)
* void setCharAt(int index,char ch) //替换某个指定位置,注意,这个比较特殊,返回值类型是void。
*
* 增删改查C(create)U(update)R(read)D(delete)
*
*
* 5.设置长度
* setLength(newLength) //s.setlength(0) 这也相当于清空缓冲区
* 6.反转
* reverse()
public class StringBufferDemo {
/**
* StringBuffer:就是字符串缓冲区,用于存储数据的容器。
*特点:1.长度是可变的。
* 2.可以存储不同类型的数据。
* 3.最终要转成字符串进行使用。
* 4.可以对字符串进行修改。
*既然是一个容器对象,应该具备什么功能呢?
*1.添加:
* StringBuffer append(data);
* StringBuffer insert(index,data)
*2.删除:
* StringBuffer deleteCharAt(int index) //删除指定位置元素
* StringBuffer delete(int start,int end) //包含头不包含尾
*3.查找
* char charAt(index);
* int indexOf(string)
* int lastIndexOf(string)
* 4.修改
* StringBuffer replace(start,end,data)
* void setCharAt(int index,char ch) //替换某个指定位置,注意,这个比较特殊,返回值类型是void。
*
* 增删改查C(create)U(update)R(read)D(delete)
*
*
* 5.设置长度
* setLength(newLength) //s.setlength(0) 这也相当于清空缓冲区
* 6.反转
* reverse()
*/
public class StringBufferDemo {
public static void main(String[] args) {
bufferMethodDemo_1();
bufferMethodDemo_2();
}
private static void bufferMethodDemo_2() {
StringBuffer sb=new StringBuffer("abcd");
sb.delete(1, 3);
System.out.println(sb.toString());
//情况缓冲区
sb.delete(0, sb.length());
System.out.println(sb.toString()+"清空");
//另一种清空缓冲区的方法
//sb=new StringBuffer();不过还是上面那个好点,节省内存。
}
public static void bufferMethodDemo_1(){
//创建缓冲区对象
StringBuffer sb=new StringBuffer("nba");
sb.append("ab").append("cd");
sb.insert(3, "qq");
System.out.println(sb.toString());
}
}
StringBuilder
jdk1.5后出现了功能和stringBuffer一模一样的对象,就是StringBuilder.
不同的是:
StringBuffer是线程同步的 ,安全的。
StringBuilder是线程不同步的 ,不安全的。优先使用这个,因为它支持所有相同的操作,但不同步。速度更快。
简单来说:单线程使用StringBuilder
多线程使用StringBuffer
/**
* 将一个int数组变成字符串
* */
public class StringBuilderTest {
public static void main(String[] args) {
int[] arr={3,1,5,3,8};
String s=arrayToString_2(arr); //方法2优于方法1,方法1太占内存,尽量用方法2
System.out.println(s);
}
public static String arrayToString_2(int[] arr){
StringBuilder sb=new StringBuilder();
sb.append("[");
for(int i=0;i<arr.length;i++){
if(i!=arr.length-1)
sb.append(arr[i]+",");
else
sb.append(arr[i]+"]");
}
return sb.toString();
}
public static String arrayToString_1(int[] arr){
String str="[";
for(int i=0;i<arr.length;i++){
if(i!=arr.length-1)
str+=arr[i]+",";
else
str+=arr[i]+"]";
}
return str;
}
}
本文出自 “12946849” 博客,请务必保留此出处http://12956849.blog.51cto.com/12946849/1929628
java(六)