码迷,mamicode.com
首页 > 其他好文 > 详细

String【字符串】

时间:2016-08-03 21:40:05      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

属性

public final class String

  字符串在java中是一个类,然后这个类是一个太监类

  类面里面肯定有属性

private final char value[]; 

  final

  这个变量value的引用只能被初始化一次,而且引用没法进行修改
  但是数组中的值还是可以被改变的

  private

  就保证这个char类型数组只能被当前类所使用
  而且string类中没有提供设置数组的方法,禁止外部的修改

  对于我们的字符串来讲,如果我们对字符串做了拼接,删除的操作,会重新创建新的字符串

内存分析
  栈
  堆
  方法区
    代码
    静态变量
    字符串常量池
  字符串这种数据类型在日常生活中使用较频繁
  常量池中的字符串对象有可能有多个引用同时指向,如果字符串的值是可变的,那其中一个引用把值给它改变了
  所有的引用看到的结果都是改变后的, 数据的安全性就得不到保证

  就是因为字符串是一个不可变的字符序列,所以每当发生改变的时候都会创建一个新的对象,所以常量池这种机制才能够使用
字符串比较

  变量相加就先创建新的字符串,有独立的地址值 如b1="hello" b2="world" b1+b2!=helloworld
  字符串和字符串相加就是普通的字符串加字符串 如 "hello"+"world" =helloworld

注意:基本数据类型只比较值,地址一不一样无所谓
     引用类型比较地址值

应用

单纯值与值的比较

1 public class TestString {
2 public static void main(String[] args) {
3 
4   String a1 = "abcdef";
5   String a2 = "abcdef";
6 
7  System.out.println(a1 == a2); //true
8 
9 }
 1 public class TestString {
 2 public static void main(String[] args) {
 3 
 4   String b1 = "hello";
 5   String b2 = "world";
 6 
 7   String b3 = "helloworld";
 8   String b4 = "hello" +"world";
 9 
10  System.out.println(b3 == b4); //true
11 
12 }

地址值和地址值的比较

public class TestString {
public static void main(String[] args) {

  String b1 = "hello";
  String b2 = "world";

  String b3 = "helloworld";
  String b4 = b1+"world";

 System.out.println(b3 == b4); //false

}

String中的常用方法

charAt,返回value数组指定索引的值  value[index]

1 public class TestStringSkill {
2     public static void main(String[] args) {
3 
4         String string = "abcdefghijklMnopqrstuvwxyz中发白中发白";
5                 char c = string.charAt(1);
6         System.out.println(c);  //b
7 }
8 }

codePointAt:char类型的字符对应的编码值

 1 public class TestStringSkill {
 2     public static void main(String[] args) {
 3 
 4         String string = "abcdefghijklMnopqrstuvwxyz中发白中发白";
 5                                 int i = string.codePointAt(26);
 6                 int i1 = string.codePointBefore(27);
 7                 int i2 = string.codePointCount(0, 26);
 8                 System.out.println(i);    //20013
 9                 System.out.println(i1);  //20013
10                 System.out.println(i2);  //26
11     }
12 }

compareTo:比较两个字符串的大小 大于正数  小于负数 相等0 ,考虑大小写,而且小写字母比大写字母大

1 public class TestStringSkill {
2     public static void main(String[] args) {
3         String string1 = "a";
4       String string2 = "A";
5         System.out.println(string1.compareTo(string2));       //32
6         System.out.println(string1.compareToIgnoreCase(string2));  //0
7 }
8 }

concat:连接字符串,但会创建一个新的字符串并返回

1 public class TestStringSkill {
2     public static void main(String[] args) {
3 
4         String string = "abcdefghijklMnopqrstuvwxyz中发白中发白";
5                 String ss = string.concat("东南西北");
6         System.out.println(ss == string);  //false
7 }
8 }

contains:查询是否包含指定的字符串

1 public class TestStringSkill {
2     public static void main(String[] args) {
3 
4         String string = "abcdefghijklMnopqrstuvwxyz中发白中发白";
5      boolean flag = string.contains("abcdef");
6               System.out.println(flag);  //true
7 }
8 }

startWith:以XXX开头   endsWith:以XXX结尾

 1 public class TestStringSkill {
 2     public static void main(String[] args) {
 3 
 4         String string = "abcdefghijklMnopqrstuvwxyz中发白中发白";
 5      boolean flag = string.startsWith("abcdefghijklmnopqrstuvwxyz");
 6                 System.out.println(flag);  //false
 7                 boolean flag1 = string.endsWith("发白");
 8                 System.out.println(flag1);  //true
 9 }
10 }

equals:比较的是字符串的值,字符串重写了equals方法,将来我们的对象也可以重写equals

1 public class TestStringSkill {
2     public static void main(String[] args) {
3      String str1 = new String("abcd");
4         String str2 = new String("abcd");
5     System.out.println(str1 == str2);  //false
6     System.out.println(str1.equals(str2));  //true
7 }
8 }

hashCode:获取对象的哈希值,如果两个对象equals那么他们的hashcode一定相同,但hashcode相同不一定equals

1 public class TestStringSkill {
2     public static void main(String[] args) {
3        String str1 = new String("abcd");
4         String str2 = new String("abcd");
5       System.out.println(str1.hashCode());   //2987074
6         System.out.println(str2.hashCode()); //2987074
7 }
8 }

getBytes:获取字符串对应的字节数组,有可能产生乱码

1 public class TestStringSkill {
2     public static void main(String[] args) {
3     byte[] bytes = string.getBytes();
4                 for (int i = 0; i < bytes.length; i++) {
5                     System.out.print(bytes[i]+" ");
6                 }
7 }
8 }
9 输出:97 98 99 100 101 102 103 104 105 106 107 108 77 110 111 112 113 114 115 116 117 118 119 120 121 122 -42 -48 -73 -94 -80 -41 -42 -48 -73 -94 -80 -41 

indexOf:返回当前字符串所在的索引值

 1 public class TestStringSkill {
 2     public static void main(String[] args) {
 3                 int i = string.indexOf("bc");
 4                 int i1 = string.indexOf(122);
 5                 int i2 = string.lastIndexOf("中");
 6                 System.out.println(i);  //1
 7          System.out.println(i1);  //25
 8          System.out.println(i2);  //29
 9     }
10   }

length:返回当前字符串的长度

1 public class TestStringSkill {
2     public static void main(String[] args) {
3 
4         String string = "abcdefghijklMnopqrstuvwxyz中发白中发白";
5      System.out.println(string.length());  //32
6 }
7 }

replace:替换

1 public class TestStringSkill {
2     public static void main(String[] args) {
3 
4         String string = "abcdefghijklMnopqrstuvwxyz中发白中发白";
5      String newstring = string.replace("abc", "_");
6         System.out.println(newstring);   //_defghijklMnopqrstuvwxyz中发白中发白
7 
8 }
9 }

split:拆分字符串

 1 public class TestStringSkill {
 2     public static void main(String[] args) {
 3 
 4         String string = "abcdefghijklMnopqrstuvwxyz中发白中发白";
 5      String[] ss = string.split("xyz");
 6          for (int i = 0; i < ss.length; i++) {
 7          System.out.println(ss[i]); //abcdefghijklMnopqrstuvw
 8                                       中发白中发白
 9                 }
10 }
11 }

substring:截取字符串 [1,5)

 1  public class TestStringSkill {
 2      public static void main(String[] args) {
 3  
 4          String string = "abcdefghijklMnopqrstuvwxyz中发白中发白";
 5       String news = string.substring(1, 5);
 6          String news1 = string.substring(1, string.length());
 7          System.out.println(news);  //bcde
 8          System.out.println(news1);  //bcdefghijklMnopqrstuvwxyz中发白中发白
 9  }
10  }

trim:去掉前后两端的空格

1 public class TestStringSkill {
2       public static void main(String[] args) {
3     String string4 = "      Hello Bjsxt           ";    //Hello Bjsxt
4 
5   }
6 }

toLowerCase/toUpperCase:转换为大小写

1 public class TestStringSkill {
2     public static void main(String[] args) {
3   System.out.println(string.toLowerCase() + "----" +   string.toUpperCase());    //abcdefghijklmnopqrstuvwxyz中发白中发白----ABCDEFGHIJKLMNOPQRSTUVWXYZ中发白中发白
4 
5     }
6 }

可变与不可变字符串序列

不可变字符串序列
   String:
可变字符串序列
   StringBuffer:安全性高效率低
   StringBuilder:效率高安全性低

  首先创建了一个长度为16的数组,当存放数据的时候,首先检查当前数组是否能够装下当前数据,如果存的下直接存放,
如果存不下,数组开始扩容,每次扩大 length*2+2,所以说我们可变字符串序列就是因为数组的大小在一直改变

  synchronized 同步 --线程安全

  int[] nums = new int[20];
  length = 20
实际存放了多少数据:
  



 

 

 

  

 

String【字符串】

标签:

原文地址:http://www.cnblogs.com/wcy123/p/5734475.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!