黑马程序员--字符串类型

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

字符串

       对于字符串,我们只要掌握常见的操作方法即可。

(一) String类的特点:

1)字符串对象一旦被初始化就不会被改变。

             String str="abc";

              str="nba";

              System.out.println("str="+str);

此时,打印出来的结果是:str=nba,貌似是字符串的结果被改变,但是,真的是这样

其实,在这段代码中,有两个对象,之所以结果会发生改变,是因为str改变了指向引用,此时,"abc"这个字符串并没有发生改变。

2)比较:Stringstr="abc"String str1="abc"

在字符串建立时,在内存中有一个叫字符串缓冲区(也可理解为:字符串常量池)。

String str="abc";创建一个字符串对象strstr先到字符串常量池中寻找,发现没有

对象,于是,自己就创建一个对象"abc"

String str1="abc";str1也先到常量池中寻找,发现已经存在,就把已有的对象地址

赋给str1。这就意味着strstr1指向同一个字符串"abc"(该对象存储在字符串常量池中)。

3)比较:String str="abc"String str1=newString("abc");的区别:

String str="abc";这句话就是在字符串常量池中创建了一个字符串"abc",并把地址赋给了str引用型变量。

String str1=new String("abc");表示的是:是在堆内存当中,用new的方式创建了一个String对象,这个对象接受了一个字符串"abc"这个对象,这样的话,这条语句就创建了两个对象(一个是new,另一个是"abc")。

4)注意事项:

String s=new String();Stringstr="";的内容是相等的,但是,不等于String str1=null;

(二)字符串常见功能(按照面向对象的思想对字符串进行功能分类):

1.获取

              1.1获取字符串中字符的个数(长度)

                     int length();

              注意:数组中的length是属性,字符串中的length是方法

              1.2根据位置获取字符

                     char charAt(int index);

              1.3根据字符获取在字符串中第一次出现的位置(防止有相同的字母)。

                     int indexOf(int ch);97也可以获取字符中的位置

                     int indexOf(int ch,intfromIndex);从指定位置进行ch的查找第一次出现的位置

                     int indexOf(String str);

                     int indexOf(String str,intfromIndex);根据字符串获取在字符串中第一次出现的位置

                    

                     int lastIndexOf(int ch);

                     int lastIndexOf(int ch,intfromIndex);

                     int lastIndexOf(Stringstr);

                     int lastIndexOf(Stringstr,int fromIndex);

               1.4获取字符串中一部分字符串,也叫子串。

                    Stringsubstring(int beginIndex);该字符串从指定的 beginIndex处开始,直到索引 endIndex - 1 处的字符。

                    Stringsubstring(int beginIndex,int endIndex);    

2.转换

    2.1将字符串编程字符串数组(字符串的切割)

            String[] split(String regex);涉及到正则表达式

 2.2将字符串变为字符数组

                 char[] toCharArray();

 2.3将字符串转成字符数组

                byte[] getBytes();

 2.4将字符串中的字母转成大小写

                 String toUpperCase();大写

                 String toLowerCase();小写

       2.5将字符串中的内容进行替换

                     String replace(char oldChar,char newChar);

                     String replace(Strings1,String s2);

       2.6将字符串两端的空格去除

                     String trim();

       2.7将字符串进行连接

                     Stringconcat(string);

3.判断

       3.1连个字符串内容是否相同

                     boolean equals(Object obj);

备注:String类覆写了Object类中的equals方法,建立了String类自己的判断字符串对象是否相同的依据,其实就是比较字符串的内容。

                     booleanequalsIgnoreCase(String anotherString);忽略大小写,比较字符串的内容

       3.2字符串中是否包含指定字符串? 

                     boolean contains(stringstr);

       3.3字符串是否以指定字符串开头或者以指定字符串结尾

                     boolean startsWith(string);

                     boolean endsWith(string);

4.两个字符串之间进行比较:

              int compareTo(StringanotherString)按字典顺序比较两个字符串

5对字符串池进行操作:intern()方法

              String str1=new String("abc");

              String str2=str1.intern();

              System.out.println(str2==str1);//false

创建好s1这个字符串对象,利用s1调用字符串池中的方法,发现字符串池中没有,此时,它就在字符串池中创建s1的对象,然后返回给s2s2是池中的对象)

 

(三)StringBuffer(字符串缓冲区)

1StringBuffer就是字符串缓冲区,它是用于存储数据的容器(容器对象)。

2)特点:

       1,长度是可变的

       2,可以存储不同类型的数据

       3,最终要转换成字符串进行使用

       4,可以对字符串进行修改

3)常用的功能:

1,添加:

              StringBuffer   append(data);

              StringBuffer   insert(index,data);

       2,删除:

              StringBuffer   delete(start,end):包含头,不包含尾

              StringBuffer   deleteCharAt(index):删除指定位置的元素

       3,查找:

              char charAt(index);

          int indexOf(string);

          int lastIndexOf(string);

       4,修改:

        StringBuffer replace(start,end,string);

        void setCharAt(index,char);

    5,可变容器长度数组:

        StringBuffer(int capacity)

4)问题:字符串缓冲区的初始容器为16个字符,为什么还要手动指定一个容器的长度?

   其实这两个用哪个都行,区别在于效率上,如果你能确定数据量在多少范围之内,那么你可以直接产生一个长度为你需要的长度就可以了,但是如果你要用默认的数据来处理你的数据的话,一旦超过16就需要延长,延长第一个要开辟空间,第二个要进行运算。初始化刚好的,可以减少创建数组和延长的动作,从而达到提高效率的目的。

(四)StringBuilder:一个可变的字符序列

1jdk1.5以后,出现了功能和StringBuffer一模一样的对象就是StringBuilder

2)比较StringBufferStringBuilder

不同的是:

       StringBuffer是线程同步(通常是用于多线程)。

       StringBuilder是线程不同步(通常用于单线程)。

问题:StringBuffer是线程是如何进行同步的?

案例:当我们要向StringBuffer容器存储数据的时候,此时如果也在删除数据,那么就会导致线程安全隐患,所以,我们必须要保证存储数据的时候就不可进行删除数据,删除数据就不能进行存储数据,那么这就涉及到同步问题,如下面代码:

       class StringBuffer{

       Object lock;

       public StringBuffer append(int x){

              synchronized(lock){

                    

              }

       }

       public StringBuffer delete(int start,intend){

              synchronized(lock){

                    

              }

       }

}

添加与删除使用的是同一个锁,这个时候就保证了删除数据或者添加数据的安全性,当然,你也可以使用同步函数进行同步。

3StringBuilder不同步,因此,不需要判断锁,提高了效率,我们建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。

4)注意:StringBuilder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer

总结:

1单线程使用StringBuilder,多线程使用StringBuffer。

2)针对于字符串的相关问题,基本都是一些常见的方法操作,比之前学的面向对象要容易的多,所以,对于字符串的要求是要将基本的常用的方法熟记于心。

 

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值