String、StringBuffer和StringBuilder的比较与总结

99 篇文章 0 订阅

String

API文档中,有如下描述:

public final class String extends Object implements SerializableComparable<String>, CharSequence

可以看出,Stirng是不被继承的。

String有如下特性:

长度固定,一旦被生成出来,就不能被改变。

代码解释:

String str1 = "abc";

str1 = "def";

关于这两行代码,并非改变了字符串,"abc"这个字符串一直没有改变,而是str1从指向"abc"变为指向"def"

如果想改变字符序列,可以使用StringBuffer或者StringBuilder实现。

StringBuffer

API文档中,对StringBuffer有如下描述:

public final class StringBuffer extends Object implements SerializableCharSequence

可以看出,StringBuffer也是不被继承的,而且,他是线程安全的类,也就是说,其内部的方法,是互斥的。

StringBuffer类提供了append,insert,delete,deleteCharAt,setCharAt等方法,来改变当前的StringBuffer对象。

StringBuilder

API文档中,描述如下:

public final class StringBuilder extends Object implements SerializableCharSequence

同样不能被继承,并且其方法几乎和StringBuffer相同,区别于StringBuffer是线程安全的,而StringBuilder并不是线程安全的,没有线程同步保证机制。

在毕向东老师讲课过程中,用自己的方法实现了String的部分方法,以下是我实现的部分方法:

  1. //用来模仿String类里的trim方法,去除字符串前后的空格。  
  2. public String simTrim (String str) {  
  3.         StringBuffer sb = new StringBuffer (str);  
  4.         while (sb.charAt(0) == ' ') {  
  5.             sb.deleteCharAt(0);  
  6.         }  
  7.           
  8.         while (sb.charAt(sb.length()-1) == ' ') {  
  9.             sb.deleteCharAt(sb.length()-1);  
  10.         }  
  11.         return sb.toString();  
  12.         }  

该方法中,可以讲StringBuffersb变成StringBuilder

  1. //该方法用来计算母串中包含几个子串;  
  2. ublic int getTimes (String mager, String sub) {  
  3.     int times = 0;  
  4.     if (mager.length() < sub.length()) {  
  5.           
  6.     } else {  
  7.         for (int i = 0; i+sub.length() <= mager.length(); i++) {  
  8.             if (mager.substring(i, i+sub.length()).equals(sub)) {  
  9.                 times++;  
  10.             }  
  11.         }  
  12.     }  
  13.     return times;  
  14.     }  

与毕向东老师实现的代码不同的是:在母串为"kkk",子串为"kk"的情况下,毕老师的方法,结果为1,我实现的方法结果为2,因为我认为母串中前两个kk和子串相同,后两个kk也和子串相同,应该算两个。

-------------------------------------------- android培训、java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima.

http://blog.csdn.net/boybeak/article/details/7558509

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

android: CharSequence和String的区别

CharSequence 是 char 值的一个可读序列。此接口对许多不同种类的 char 序列提供统一的只读访问

public interface CharSequence ;

CharSequence 是一个接口,String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例来实现。 

public interface CharSequence {
     public int length();
     public char charAt(int index);
     public CharSequence subSequence(int start, int end);
     public String toString();
 }
public final class String extends Object implements Serializable CharSequence Comparable<T> {

XXXXXXXXXXXXXXXX.............

}

http://blog.csdn.net/gg137608987/article/details/8131341

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1. 如何将int转换为string

String.valueOf(int);

2. 获得当前view的坐标

x = getView.getLeft();

y = getView.getTop();

3. CharSequence和String的区别

在项目中发现,需要charSequence做参数的地方,用String也可以。

在JDK1.4中,引入了CharSequence接口,实现了这个接口的类有:CharBuffer、String、StringBuffer、StringBuilder这个四个类。 

提供这么一个接口,有些处理String或者StringBuffer的类就不用重载了。但是这个接口提供的方法有限,只有下面几个:charat、length、subSequence、toString这几个方法,感觉如果有必要,还是重载的比较好,避免用instaneof这个操作符。 

4. AttributeSet和defStyle的理解

 在通过xml文件构造view组件的时候,往往都要使用到AttributeSet和defStyle这个两个参数,例如Button组件的构造方法Button(Context ctx, AttributeSet attrs, int defStyle)中,ctx会调用obtainStyledAttributes( AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)方法获得一个TypedArray,然后根据这个TypeArray来设置组件的属性。

具体参考:http://blog.csdn.net/czh0766/archive/2010/09/28/5912237.aspx

5. Cursor

当Android从数据库中查询数据时,它将会返回一个游标Cursor对象。Cursor代表了来自数据库的结果集,并可以移动游标来提取结果中的数据。使用一类Android提供的称为“适配器Adapter”的类,我们很容易将这个结果集绑定到指定的View上。适配器完成了提取数据库结果集中的数据并在界面上显示这些数据等这些复杂而困难工作。

6. inflater

       View v = inflater.inflate(R.layout.sort_item, container, false);      // sort_item是fragment内部的view,如果写成fragment就调用自己报错。

7. 得到EditText上的text

   edit.getText().toString()

8. View.getParent()  
  int ViewGroup.getChildCount();

    View ViewGroup.getChildAt(index);

9. ImageView ImageButton更改显示图片

  ImageButton.setBackgroundResource(resid);//不改变显示图片

  ImageButton.setImageResource(resid);//改变显示图片

10. Button ImageButton设置背景为透明

半透明:android:background = "#e0000000"

透明: android:background = "#00000000"

http://www.cnblogs.com/topcoderliu/archive/2011/04/23/2025689.html

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

待续

Content Providers 是所有应用程序之间数据存储和检索的一个桥梁,作用是使得各个应用程序之间实现数据共享。

?
Cursor对象用于在结果集中前向或后向列举数据,Crusor对象只能用来读数据。
 
增加、修改、删除数据必须使用ContentResolver对象。

1. ContentResolver

应用可以通过一个唯一的ContentResolver接口来使用具体的某个ContentProviders。

通过getContentResolver()方法来获得一个ContentResolver对象,然后用ContentResolver提供的方法来操作Content Provider。

?
ContentResolver cr = getContentResolver();

 通常,对于每一种类型的ContentProvider只有一个实例,但这个实例可以与在不同的程序或进程中的多个ContentResolver对象进行通信。

进程之间的互动由ContentResolver和ContentProvider类处理的。

2. URI

每个Content Providers都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Providers为这些

数据定义一个URI,然后其他的应用程序就可以通过Content Providers传入这个URI来对数据进行操作。

URI由3个部分组成:

"Content://" 、数据的路径、标识ID(可选)。

?
content: //media/internal/images    (将返回设备上存储的所有图片)
content: //contacts/people/5           (将返回ID=5的联系人记录)
content: //contacts/people               (将返回设备所有联系人信息)

在andorid.provider包下提供了一系列的辅助类,其中包含了很多以类变量形式给出的查询字符串,如可以将第二个URI改写成以下形式

?
Uri person=ContentUris.withAppendedId(People.CONTENT_URI, 5 );

每个ContentResolver都把URI作为其第一个参数,它决定了ContentResolver将与哪一个Provider对话。

3. 查询数据

A.用ContentReslover.query()方法
B.用Activity.managedQuery()方法。 包含Cursor生命周期,当Activity暂停后,要使用Cursor必须通过Activity.startManagingCursor()方法重新启动。

?
Cursor cur = managedQuery(person, null , null , null );
?
String[] projection = new String[]{};        //需要获取的列
?
Uri contacts = People.CONTENT_URI;
?
Cursor managedCursor = managedQuery(contacts, projection,    // 返回指定列的数据
?
null ,                            // 返回所有行的数据<br>
?
null ,                            //可选参数<br>
?
People.NAME + " ASC" );  //按名字的省续排列<br>

4. 修改数据

ContentResolver.update()方法

5. 添加数据

ContentResolver.insert()方法。

6. 删除数据

ContentResolver.delete()方法

7. 创建自己的Content Provider

http://www.cnblogs.com/topcoderliu/archive/2011/04/26/2029275.html

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值