String详解

来源:互联网 发布:js .index 编辑:程序博客网 时间:2024/05/01 12:01
一.Scanner类概述 : JDK5后用于获取用户键盘输入
        构造方法  public Scanner(InputString source )
        System类下有一个静态常量
                 public static final InputStream in; 标准的输入流,对应着键盘录入。
Scanner类的成员方法
     public boolean      hasNextXxx( ) 判断是否是某种类型的元素
     public Xxxx           nextXxx( )        获取该元素
     nextLine( )  获取字符串     nextInt( )  获取整型数据 
举例   Scanner sc = new Scanner(System.in); //创建对象
           //获取数组
          if(sc.hasNext){
               int x = sc.nextInt( );
         }else{
               System.out.println(“您输入的数据有误");
         }

注意 : 先获取一个数值,在获取一个字符串,会出现问题(换行符号的问题)
 解决 : 把所有的数据先按照字符串获取,然后需要什么,就装换为什么。

二.String类概述 (字符串是由多个字符组成的一串字符数组,可以看成是一个字符数组)
    通过查看API : 字符串字面值”abc” 也可以看成是一个字符串对象 String s1 = “abcde”;
                              字符串是常量,一旦被赋值,就不能被改变
    1. 构造方法  
        public String();  空构造
        public String(byte[ ] bytes)   把字节数组转换成字符串
        public String(byte[ ] bytes,int index , int length )   把字节数组的一部分转成字符串   
        public String(char[ ] value)    把字符数组转换成字符串
        public String(char[ ] value,int index , int length )   把字符数组的一部分转成字符串   
        public String(String]   original)   把字符串常量值转换成字符串
   2.方法
        public int length( )  返回字符串的长度 
       
  特点 : 一旦赋值,就不能改变
  内存分析 :1. 字符串直接赋值的方式先导字符串常量池中找,如果有就返回,没有,就创建返回
                     2. 一旦被赋值就不能改变 ,值不能改变, 引用对象地址值可以变
   String  s  = “hello “ 
   s + = “world”;
   System.out.println(“s:”+s);  //helloworld
  栈区                                堆区                  方法区(存在字符串常量池)
String    s (0x001)                                     (字符串常量池) “hello”   0x001
                                                                                               “world”  0x002
String    s(0x003)                                                                     “hello” “world”0x003

  3.判断功能
          boolean equals(Object obj)     比较字符串的内容是否相同,区分大小写
          boolean equalsIgnoreCase(String str)    比较字符串的内容是否相同,忽略大小写
          boolean contains(String str)    判断大字符串中是否包含小字符串
          boolean startsWith(String str)  判断字符串是否以某个指定的字符串开头
          boolean endsWith(String str)    判断字符串是否以某个指定的字符串结尾
          boolean isEmpty(String str)      判断字符串是否为空
  注意 : 字符串内容为空和字符串对象为空
               String s  = “”;
               String s1  = null;
               s.isEmpty( )      //true
               s1.isEmpty( )    //NullPointerException  S5对象都不存在,所以不能调用方法,空指针异常。

  4.获取功能
         String s = “helloworld”;
         int  length()  获取字符串长度
                   s.length( ) ;  //10
         char  charAt(int index) 获取指定索引位置字符  
                   s.charAt(7);  //r
         int    indexOf(int ch)     返回指定字符在此字符串中第一次出现处的索引
                   为何是Int类型,而不是char类型 ?  ‘a’ 和 97其实都可以代表’a'
                   s.indexOf(‘l’); //2
         int   indexOf(String str )  返回指定字符串在此字符串中第一次出现的位置
                      s.indexOf(‘owo')  //4
         int   indexOf(int  ch , int  formIndex )    返回指定字符在此字符串中指定位置后第一次出现处的索引
                    s.indexOf(‘l’,4); //8
                    s.indexOf(‘k’,4); //-1
                    s.indexOf(‘l’,40); //-1  
         int   indexOf(String str , int formIndex )  返回指定字符串在此字符串中指定位置后第一次出现的索引
         String substring(int start) 从指定位置开始截取字符串,默认到末尾
         String substring(int start , int end) 从指定位置开始到指定位置结束截取字符串

  5 . 转换功能
    byte[ ] getBytes()             把字符串转成字节数组     J  =  74    a = 97
    char[ ]  toCharArray()       把字符串转换为字符数组  ‘a’  ‘b'
    static String valueOf(char[ ] chs)   把字符数组转换为字符串
    static String valueOf(int i)              把int类型的数据转换为字符串
                    注意 String类的valueOf 方法可以把任意数据类型转换为字符串
     String toLowerCase( )     把字符串转成小写
     String toUpperCase( )     把字符串转成大写
     String concat(String str)  字符串拼接

   6.其他功能
       替换功能
              String  replace(char old , char new)    替换所有指定的字符
              String  replace( String old ,char new)  替换所有指定的字符串
              String  trim( )            去除字符串空格  
          按字典顺序比较两个字符串    
             int compareTo(String str)
             int compareToIgnore(String str)           忽略大小写
  
    7.compareTo源码分析
         

三.面试题
== :         比较引用类型比较的是地址值是否相同
equlas :   比较引用类型默认也是比较地址值是否相同,而String类重写了equals( )方法,比较的是内容是否相同
    1. String s1 = new String(“hello”)  String s2  = “hello”; 的区别?
         (构造方法创建对象和String字面值对象的区别)
             s1 ==  s2  //false
             s1.equals(s2) //true
  类存分析
  栈区                                               堆区                                                                         方法区(存在字符串常量池)
String s1  0x001 ->0x001               new  String( )    0x001—>0x01                         (字符串常量池) “hello”  0x01
String s2   0x01 ->0x01
    区别 : 前者会创建2个对象(堆内存一个,方法区一个)  , 后者或者创建1个对象(方法区)。
 

   2. 注意: 字符串如果是变量相加,先开空间,在拼接。
                      String s1 = “hello”;       String s2 = “world";
                      String s3 = “helloworld”;       s3 == s1+s2;  //false
                   字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
                      String s = “helloworld”;         s3 == “hello”+”world”; //true






              
0 0