Java基础---String类和基本数据类型包装类


第一讲:String

        1String对象的初始化

由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下:

        

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

		String s = "abc"; // 也是一个对象 . 常量池
		System.out.println(s);
		 String s2= new String("abc"); // 也是一个对象 堆内存
		s += "d"; 
		String ss = "abcd";

		System.out.println(s == ss);  //地址值不相等  
		

	}

}

            

        2、字符串的常见操作

                  acharAt方法

该方法的作用是按照索引值(规定字符串中第一个字符的索引值是0,第二个字符的索引值是1,依次类推),获得字符串中的指定字符。例如:

         String s =“abc”;

         char c =s.chatAt(1);

则变量c的值是’b’

                  bcompareTo方法

该方法的作用是比较两个字符串的大小,比较的原理是依次比较每个字符的字符编码。首先比较两个字符串的第一个字符,如果第一个字符串的字符编码大于第二个的字符串的字符编码,则返回大于0的值,如果小于则返回小于0的值,如果相等则比较后续的字符,如果两个字符串中的字符编码完全相同则返回0

                            例如:

                                    String s = “abc”;

                                    String s1 = “abd”;

                                    int value = s.compareTo(s1);

                            value的值是小于0的值,即-1

                           String类中还存在一个类似的方法compareToIgnoreCase,这个方法是忽略字符的大小写进行比较,比较的规则和compareTo一样。例如:

                                    String s = “aBc”;

                                    String s1 = “ABC”;

                                    int value = s. compareToIgnoreCase (s1);

                            value的值是0,即两个字符串相等。

                  cconcat方法

该方法的作用是进行字符串的连接,将两个字符串连接以后形成一个新的字符串。例如:

                                    String s = “abc”;

                                    String s1 = “def”;

                                    String s2 = s.concat(s1);

则连接以后生成的新字符串s2的值是”abcdef”,而字符串ss1的值不发生改变。如果需要连接多个字符串,可以使用如下方法:

                                   String s = “abc”;

                                    String s1 = “def”;

                                    String s2 = “1234”;

         String s3 =s.concat(s1).concat(s2);

则生成的新字符串s3的值为”abcdef1234”

其实在实际使用时,语法上提供了一种更简单的形式,就是使用“+”进行字符串的连接。例如:

         String s =“abc” + “1234”;

则字符串s的值是”abc1234”,这样书写更加简单直观。

而且使用“+”进行连接,不仅可以连接字符串,也可以连接其他类型。但是要求进行连接时至少有一个参与连接的内容是字符串类型。而且“+”匹配的顺序是从左向右,如果两边连接的内容都是基本数字类型则按照加法运算,如果参与连接的内容有一个是字符串才按照字符串进行连接。

例如:

         int a = 10;

         String s =“123” + a + 5;

则连接以后字符串s的值是“123105”,计算的过程为首先连接字符串”123”和变量a的值,生成字符串”12310”,然后使用该字符串再和数字5进行连接生成最终的结果。

而如下代码:

         int a = 10;

         String s = a +5 + “123”;

则连接以后字符串s的值是”15123”,计算的过程为首先计算a和数字5,由于都是数字型则进行加法运算或者数字值15,然后再使用数字值15和字符串”123”进行连接获得最终的结果。

而下面的连接代码是错误的:

         int a = 12;

         String s = a +5 + ‘s’;

因为参与连接的没有一个字符串,则计算出来的结果是数字值,在赋值时无法将一个数字值赋值给字符串s

                  dendsWith方法

该方法的作用是判断字符串是否以某个字符串结尾,如果以对应的字符串结尾,则返回true

例如:

         String s =“student.doc”;

         boolean b =s.endsWith(“doc”);

则变量b的值是true

                  eequals方法

该方法的作用是判断两个字符串对象的内容是否相同。如果相同则返回true,否则返回false

而使用“==”比较的是两个对象在内存中存储的地址是否一样。例如上面的代码中,如果判断:

String类中存在一个类似的方法equalsIgnoreCase,该方法的作用是忽略大小写比较两个字符串的内容是否相同。例如:

       

public class StringFun1 {
	public static void main(String[] args) {
		String s = "abc";
		String s2 = "askhfkadshfkabcshflakjfsajf";
		String s3 = "";
		String s4 = " ";
		String s5 = null;

		System.out.println(s.equals("abc")); // equals 比较内容,区分大小写的 , 密码
		System.out.println(s.equals("aaa"));
		System.out.println(s.equals("bba"));
		System.out.println("-----------");
		System.out.println(s.equalsIgnoreCase("ABC")); // 不区分大小写 , 验证码
		System.out.println(s.equalsIgnoreCase("aBC"));
		System.out.println(s.equalsIgnoreCase("AbC"));

		System.out.println("s2:" + s2.isEmpty()); // false
		System.out.println("s3:" + s3.isEmpty()); // true
		System.out.println("s4:" + s4.isEmpty()); // true | false
		System.out.println("s5:" + s5.isEmpty()); // java.lang.NullPointerException

	}

                  fgetBytes方法

该方法的作用是将字符串转换为对应的byte数组,从而便于数据的存储和传输。例如:

         String s = “计算机”;

         byte[] b =s.getBytes();   //使用本机默认的字符串转换为byte数组

         byte[] b =s.getBytes(“gb2312”); //使用gb2312字符集转换为byte数组

                           在实际转换时,一定要注意字符集的问题,否则中文在转换时将会出现问题。

                  gindexOf方法

该方法的作用是查找特定字符或字符串在当前字符串中的起始位置,如果不存在则返回-1。例如:

                                    String s = “abcded”;

                                    int index = s.indexOf(‘d’);

                                    int index1 = s.indexOf(‘h’);

则返回字符d在字符串s中第一次出现的位置,数值为3。由于字符h在字符串s中不存在,则index1的值是-1

                            当然,也可以从特定位置以后查找对应的字符,例如:

                                    int index = s.indexOf(‘d’,4);

则查找字符串s从索引值4(包括4)以后的字符中第一个出现的字符d,则index的值是5

由于indexOf是重载的,也可以查找特定字符串在当前字符串中出现的起始位置,使用方式和查找字符的方式一样。

另外一个类似的方法是lastIndexOf方法,其作用是从字符串的末尾开始向前查找第一次出现的规定的字符或字符串,例如:

                                    String s = “abcded”;

                                    int index = s. lastIndexOf(‘d’);

                            index的值是5

                  hlength方法

该方法的作用是返回字符串的长度,也就是返回字符串中字符的个数。中文字符也是一个字符。例如:

         String s =“abc”;

         String s1 =“Java语言”;

         int len =s.length();

         int len1 =s1.length();

则变量len的值是3,变量len1的值是6

                  ireplace方法

该方法的作用是替换字符串中所有指定的字符,然后生成一个新的字符串。经过该方法调用以后,原来的字符串不发生改变。例如:

         String s =“abcat”;

         String s1 =s.replace(‘a’,’1’);

该代码的作用是将字符串s中所有的字符a替换成字符1,生成的新字符串s1的值是”1bc1t”,而字符串s的内容不发生改变。

如果需要将字符串中某个指定的字符串替换为其它字符串,则可以使用replaceAll方法,例如:

         String s =“abatbac”;

         String s1 =s.replaceAll(“ba”,”12”);

该代码的作用是将字符串s中所有的字符串”ab”替换为”12”,生成新的字符串”a12t12c”,而字符串s的内容也不发生改变。

如果只需要替换第一个出现的指定字符串时,可以使用replaceFirst方法,例如:

         String s =“abatbac”;

         String s1 = s.replaceFirst (“ba”,”12”);

该代码的作用是只将字符串s中第一次出现的字符串”ab”替换为字符串”12”,则字符串s1的值是”a12tbac”,字符串s的内容也不发生改变。

                  jsplit方法

该方法的作用是以特定的字符串作为间隔,拆分当前字符串的内容,一般拆分以后会获得一个字符串数组。例如:

         String s =“ab,12,df”;

         String s1[] =s.split(“,”);

该代码的作用是以字符串”,”作为间隔,拆分字符串s,从而得到拆分以后的字符串数字s1,其内容为:{“ab”,”12”,”df”}

该方法是解析字符串的基础方法。

如果字符串中在内部存在和间隔字符串相同的内容时将拆除空字符串,尾部的空字符串会被忽略掉。例如:

         String s =“abbcbtbb”;

         String s1[] =s.split(“b”);

则拆分出的结果字符串数组s1的内容为:{“a”,””,”c”,”t”}。拆分出的中间的空字符串的数量等于中间间隔字符串的数量减一个。例如:

         String s =“abbbcbtbbb”;

         String s1[] =s.split(“b”);

则拆分出的结果是:{“a”,””,””,”c”,”t”}。最后的空字符串不论有多少个,都会被忽略。

如果需要限定拆分以后的字符串数量,则可以使用另外一个split方法,例如:

         String s =“abcbtb1”;

         String s1[] =s.split(“b”,2);

该代码的作用是将字符串s最多拆分成包含2个字符串数组。则结果为:{“a”,”cbtb1”}

         如果第二个参数为负数,则拆分出尽可能多的字符串,包括尾部的空字符串也将被保留。

                  kstartsWith方法

该方法的作用和endsWith方法类似,只是该方法是判断字符串是否以某个字符串作为开始。例如:

         String s =“TestGame”;

         boolean b =s.startsWith(“Test”);

则变量b的值是true

                  lsubstring方法

该方法的作用是取字符串中的“子串”,所谓“子串”即字符串中的一部分。例如“23”是字符串“123”的子串。

字符串“123”的子串一共有6个:”1””2””3””12””23””123”。而”32”不是字符串”123”的子串。

例如:

         String s =“Test”;

         String s1 =s.substring(2);

则该代码的作用是取字符串s中索引值为2(包括)以后的所有字符作为子串,则字符串s1的值是”st”

如果数字的值和字符串的长度相同,则返回空字符串。例如:

         String s =“Test”;

         String s1 =s.substring(4);

则字符串s1的值是””

如果需要取字符串内部的一部分,则可以使用带2个参数的substring方法,例如:

         String s = “TestString”;

         String s1 =s.substring(2,5);//包含左边,不包含右边 [2,5)

则该代码的作用是取字符串s中从索引值2(包括)开始,到索引值5(不包括)的部分作为子串,则字符串s1的值是”stS”

下面是一个简单的应用代码,该代码的作用是输出任意一个字符串的所有子串。代码如下:

                                

public class StringFun2 {
	
	public static void main(String[] args) {
		
		
	    String s = "子串示例";
        int len = s.length(); //获得字符串长度
        for(int begin = 0;begin < len - 1;begin++){ //起始索引值
                  for(int end = begin + 1;end <= len;end++){ //结束索引值
                           System.out.println(s.substring(begin,end));
                  }
        }
		
	}

在该代码中,循环变量begin代表需要获得的子串的起始索引值,其变化的区间从第一个字符的索引值0到倒数第二个字符串的索引值len -2,而end代表需要获得的子串的结束索引值,其变化的区间从起始索引值的后续一个到字符串长度。通过循环的嵌套,可以遍历字符串中的所有子串。

                  mtoCharArray方法

该方法的作用和getBytes方法类似,即将字符串转换为对应的char数组。例如:

         String s =“abc”;

         char[] c =s.toCharArray();

则字符数组c的值为:{‘a’,’b’,’c’}

                  ntoLowerCase方法

                            该方法的作用是将字符串中所有大写字符都转换为小写。例如:

                                    String s = “AbC123”;

                                    String s1 = s.toLowerCase();

                            则字符串s1的值是”abc123”,而字符串s的值不变。

类似的方法是toUpperCase,该方法的作用是将字符串中的小写字符转换为对应的大写字符。例如:

                                   String s = “AbC123”;

                                    String s1 = s. toUpperCase ();

则字符串s1的值是”ABC123”,而字符串s的值也不变。

                  otrim方法

该方法的作用是去掉字符串开始和结尾的所有空格,然后形成一个新的字符串。该方法不去掉字符串中间的空格。例如:

                                    String s = “   abc abc 123 “;

                                    String s1 = s.trim();

                            则字符串s1的值为:”abc abc 123”。字符串s的值不变。

                  pvalueOf方法

该方法的作用是将其它类型的数据转换为字符串类型。需要注意的是,基本数据和字符串对象之间不能使用以前的强制类型转换的语法进行转换。

另外,由于该方法是static方法,所以不用创建String类型的对象即可。例如:

         int n = 10;

         String s =String.valueOf(n);

则字符串s的值是”10”。虽然对于程序员来说,没有发生什么变化,但是对于程序来说,数据的类型却发生了变化。

介绍一个简单的应用,判断一个自然数是几位数字的逻辑代码如下:

         int n = 12345;

         String s =String.valueOf(n);

         int len =s.length();

则这里字符串的长度len,就代表该自然数的位数。这种判断比数学判断方法在逻辑上要简单一些。

关于String类的使用就介绍这么多,其它的方法以及这里到的方法的详细声明可以参看对应的API文档。

第二讲     StringBuffer

一、概述

        StringBuffer是一个容器,字符串的组成原理就是通过该类实现的。StringBuffer可以对字符串内容进行增删改查等操作,很多方法和String相同。

 

二、特点

        1、而且长度是可变化的。(数组是固定的)

        2、可以直接操作多个数据类型。(数组只能操作一个)

        3、最终会通过toString方法变成字符串。

 

三、常见操作

1、存储

        StringBuffer append():将指定数据作为参数添加到已有数据的结尾处。

        StringBuffer insert(intoffset ,数据):可以将数据插入到指定offset位置。

2、删除

        StringBufferedelete(start,end):删除缓冲区中的数据,左闭右开。

        StringBuffer deleteCharAt(index):删除指定位置的字符。

        清空缓冲区:对象.delete(0,对象.length());

3、获取

        char charAt(int index)

        int indexOf(String str)

        int lastIndexOf(String str)

        int length()

        String substring(int start,int end)

4、修改

        StringBuffer replace(int start,int end,String str)

        void setCharAt(int index,char ch)

5、反转

        StringBuffer reverse()

6、将缓冲区中指定数据存储到指定字符数组中

        voidgetChars(int srcBegin, int srcEnd,char[] dst,int dstBegin)

JDK1.5版本之后出现了StringBuilder

        StringBuffer是线程同步的。有锁。效率低

        StringBuilder是线程不同步的。无锁。效率高

以后开发,建议使用StringBuilder。如遇多线程,使用StringBuffer或自己加锁。

升级三因素:

        1、提高效率

        2、简化书写

        3、提高安全性。

 

第三讲     基本数据类型包装类 

        将基本数据类型封装成对象的好处,在于可以在对象中定义更多的功能方法操作该数据。基本数据类型对象包装类的最常见作用,就是用于基本数据类型和字符串类型之间做转换。下面我们来了解包装类的写法形式和常用方法。

 

一、基本数据类型对象包装类。

        byte               Byte

        short              Short

        int                  Integer

        long               Long

        boolean          Boolean

        float               Float

        double           Double

        char               Character

 

二、基本数据类型转成字符串

        基本数据类型+" "

        基本数据类型.toString(基本数据类型值)

        如:Integer.toString(34);//34整数变成"34"

 

三、字符串转成基本数据类型。

         xxx a=Xxx.parseXxx(string);//必须传入对应类型的字符串。

           inta=Integer.parseInt("123");//静态

        booleanb=Boolean.parseBoolean("true");

        Integeri=new Integer("123");

        intnum=i.intValue();//跟上面的静态方式的结果一样,但这种属于对象调用方式。

注意:

        在使用时,Integer  x = null;上面的代码就会出现NullPointerException

 

四、十进制转成其他进制。

         toBinaryString();//二进制

         toHexString(); //十六进制

         toOctalString();//八进制

 

五、其他进制转成十进制。

         parseInt(String,radix);

         如:int a= Intager.parseInt("3c",16);

JDK1.5版本以后出现的新特性。

                         Integer x=new Integer(4);

         等效于:Integer x=4;//自动装箱。

        还可以直接进行运算:x=x+2;//x进行自动拆箱。变成了int类型。和2进行加法运算。再将和进行装箱赋给xx的拆箱动作等效:x.intValue()

 

六、示例

        Integer x=128;

        Integer y=128;

        x==y   false

        Integer m=127;

        Integer n=127;

        m==n  true

原因:

        因为mn指向了同一个Integer对象。因为当数值在byte范围内,对于新特性,如果该数组已经存在,则不会再开辟新的空间。

 

七、小练习

[java]  view plain copy
  1. /* 
  2. "12 0 99 -7 30 4 100 13 -6" 
  3. 要求对字符串中的数值进行排序。生成一个数值从小到大新字符串。 
  4.  
  5. "-7 -6 0 4 12 13 30 99 100" 
  6.  
  7. 思路:1、将字符串切割为字符串数组 
  8.       2、将字符串数组转换为整数类型数组 
  9.       3、对整数类型数组进行冒泡排序 
  10.       4、将排序后的整数类型数组转换为字符串 
  11. */  
  12.   
  13. class  StringSort  
  14. {  
  15.     public static void main(String[] args)   
  16.     {  
  17.         String s="12 0 99 -7 30 4 100 13 -6";  
  18.         sop(s);  
  19.           
  20.   
  21.         sop(stringSort(s));  
  22.     }  
  23.   
  24.     public static String stringSort(String s)  
  25.     {  
  26.         //将字符串切割成字符串数组  
  27.         String[] str=s.split(" ");  
  28.   
  29.         //将字符串数组转换为整数类型数组  
  30.         int[] arr=stringToInt(str);  
  31.           
  32.         // 对整数类型数组进行冒泡排序  
  33.         bubbleSort(arr);  
  34.   
  35.         //将排序后的整数类型数组转换为字符串  
  36.         return intToString(arr).toString();  
  37.     }  
  38.   
  39.     // 将字符串数组转换为整数类型数组方法  
  40.     private static int[] stringToInt(String[] str)  
  41.     {  
  42.         int[] arr=new int[str.length];  
  43.         for(int x=0;x<str.length;x++)  
  44.         {     
  45.             arr[x]=Integer.parseInt(str[x]);  
  46. //          sop(arr[x]);  
  47.           
  48.         }  
  49.     //  sop(arr);  
  50.         return arr;  
  51.     }  
  52.       
  53.     //对数组进行冒泡排序  
  54.     private static void bubbleSort(int[] arr)  
  55.     {  
  56.         for (int x=0;x<arr.length ;x++ )  
  57.         {  
  58.             for (int y=0;y<arr.length-x-1; y++)  
  59.             {  
  60.                 if(arr[y]>arr[y+1])  
  61.                     swap(arr,y,y+1);  
  62.             }  
  63.         }  
  64.     //  sop(arr);  
  65.     }  
  66.   
  67.     //交换数组中的两元素  
  68.     private static void swap(int[] arr,int x,int y)  
  69.     {  
  70.         arr[x]=arr[x]^arr[y];  
  71.         arr[y]=arr[x]^arr[y];  
  72.         arr[x]=arr[x]^arr[y];  
  73. //      int temp=arr[x];  
  74. //      arr[x]=arr[y];  
  75. //      arr[y]=temp;  
  76.     }  
  77.       
  78.     //将整数类型数组存放到一个StringBuiler容器中  
  79.     private static StringBuilder intToString(int[] arr)  
  80.     {  
  81.         StringBuilder sb=new StringBuilder();  
  82.         for (int x=0;x<arr.length-1; x++)  
  83.         {     
  84.             sb.append(arr[x]+" ");  
  85.         }  
  86.         sb.append(arr[arr.length-1]+"");  
  87.   
  88.         return sb;  
  89.     }  
  90.   
  91.     //打印字符串  
  92.     private static void sop(Object obj)  
  93.     {  
  94.         System.out.println(obj);  
  95.     }  
  96.   
  97.     //遍历数组  
  98.     private static void sop(int[] arr)  
  99.     {  
  100.         for (int x=0; x<arr.length;x++ )  
  101.         {  
  102.             System.out.print(arr[x]+"\t");  
  103.         }  
  104.         System.out.println();  
  105.     }  
  106. }  



 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值