首页 > 代码库 > 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(六)