黑马程序员——Java学习笔记 String类和基本数据类型对象包装类

时间:2023-02-19 13:14:55

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

                                               第一讲 String类

一、String 类的概述

    String 类代表字符串,Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。字符串是常量;它们的值在创建之后不能更改。
    String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。
    Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。
    问:String str = “abc”;和String str1 = new String(“abc”);有什么区别?
    答:s1在内存中有一个对象,s2在内存中有两个对象。

二、String类的常见操作

    String类适用于描述字符串事物,它就提供了多个方法对字符串进行操作。
1、获取
    1.1字符串中包含的字符数,也就是字符串的长度
    int length()://获取长度。
    1.2根据位置获取位置上的某个字符
    char charAt(int index)://当访问到字符串中不存在的角标时,会发生字符串角标越界的错误。
    1.3根据字符获取该字符存在字符串的位置
    int indexOf(int ch)://返回的是ch在字符串中第一次出现的位置。传入的是字符对应的ASCII码。如果没有找到,返回-1。
    int indexOf(int ch,int fromIndex)://从fromIndex指定位置开始,获取ch在字符串中出现的位置。
    int indexOf(String str)://返回的是str在字符串中第一次出现的位置。
    int indexOf(String str,int fromIndex)://从fromIndex指定位置开始,获取str在字符串中出现的位置。
    int lastIndexOf()://反向索引
2、判断
    2.1字符串中是否包含某一个子串
    boolean contains(str);
    特殊之处:indexOf(str)可以索引str第一次出现的位置,如果返回-1表示该str不在字符串中存在。所以,也可以用于对指定判断是否包含。如:if(str.indexOf(“aa”)!=-1)而且该方法既可以判断,又可以获取出现的位置。如果只为判断,用contains。
    2.2字符串中是否有内容
    boolean ifEmpty();//原理就是判断长度是否为0。
    2.3字符串是否是以指定内容开头
    boolean startsWith(str);
    2.4字符串是否是以指定内容结尾
    boolean endsWith(str);
    2.5判断字符串内容是否相同,复写了Object类中的equals方法
    boolean equals(str);
    2.6判断内容是否相同,并忽略大小写。
    boolean equalsIgnoreCase();
3、转换
    3.1将字符数组转成字符串
构造函数:

    String (char[]);
    String (char[],offset,count);//将字符数组中的一部分转成字符串。
静态方法:
    static String copyValueOf(char[]);
    static String copyValueOf(char[] data,int offset ,int count );
    static String valueOf(char[]);
    3.2将字符串转成字符数组
    char[] toCharArray();
    3.3将字节数组转成字符串
    String (byte[]);
    String (byte[],offset,count);//将字节数组中的一部分转成字符串。count表示个数。
    3.4将字符串转成字节数组
    byte[] getBytes();
    3.5将基本数据类型转成字符串
    String valueOf(int);
    String valueOf(double);
    特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
4、替换
    tringreplace(oldchar,newchar);//返回的是一个新字符串。如果要替换的字符不存在,返回的还是原字符串。
5、切割
    String[] split(regex);//涉及到正则表达式的点,不能作为切割字符串的regex。
6、子串,获取字符串中的一部分
    String substring(begin);//从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异常。
    String substring(begin,end);//包含头,不包含尾。
7、转换,去除空格,比较
    7.1将字符串转成大写或小写
    String toUpperCase();
    String toLowerCase();
    7.2将字符串两端的多个空格去除
    String trim();       
    7.3对两个字符串进行自然顺序的比较
    intcompareTo(String);

三、练习

    要求:获取两个字符串中最大相同子串。
    思路:
        1,将短的那个子串按照长度递减的方式获取到。
        2,将每获取到的子串去长串中判断是否包含。

<span style="font-size:14px;">
class StringTest
{
public static String getMaxSubString(String s1,String s2) //构造函数,返回值为字符串
{
String max = "",min = "";

max = (s1.length()>s2.length())?s1: s2; //将字符串长度大的赋值给max。
min = (max==s1)?s2: s1; //当max字符串长度等于s1时,将s2赋值给min。

sop("max="+max+"...min="+min); //调用函数sop,打印字符串。

for(int x=0; x<min.length(); x++) //遍历字符串min
{
for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)//设置子串的截取角标
{
String temp = min.substring(y,z); //设置临时字符串temp等于min子函数
sop(temp); //打印临时字符串temp
if(max.contains(temp)) //判断字符串max是否包含temp
//if(max.indexOf(temp)!=-1) //也可以判断长字符串中temp出现的位置
return temp;
}
}
return ""; //当没有相同子串时返回空
}

public static void main(String[] args)
{
String s1 = "ab";
String s2 = "cvhellobnm";
sop(getMaxSubString(s2,s1));
}

public static void sop(String str) //构造静态方法,打印字符串
{
System.out.println(str);
}
}

</span>

                                第二讲 StringBuffer

一、概述

     StringBuffer类和String一样,也用来代表字符串。在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。另外由于StringBuffer是线程安全的,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。

二、特点

    1、长度是可变化的。(数组是固定的)
    2、可以直接操作多个数据类型。(数组只能操作一个)
    3、可以通过toString方法变成字符串。

三、常见操作

1、存储
    StringBuffer append():将指定数据作为参数添加到已有数据的结尾处。
    StringBuffer insert(intoffset ,数据):可以将数据插入到指定offset位置。
2、删除
    StringBufferedelete(start,end):删除缓冲区中的数据,包含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、将缓冲区中指定数据存储到指定字符数组中
    void getChars(int srcBegin, int srcEnd,char[] dst,int dstBegin)

四、StringBulider

    在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); //xxx表示字符串的类型,需要向对应。
  如:int a=Integer.parseInt("123");
   
boolean b = Boolean.parseBoolean("true");
    Integer i=new Integer("123");
    int num =i.intValue();//跟上面的静态方式的结果一样,但这种属于对象调用方式。
注意:
    在使用时,Integer 
x = null;上面的代码就会出现NullPointerException。

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

    toBinaryString();//以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
    toHexString();   //以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
    toOctalString(); //以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。

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

    parseInt(String,radix);//使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
    如:int a= Intager.parseInt("3c",16);
JDK1.5版本以后出现的新特性。
    (1)Integer x=new Integer(4);
    等效于:Integer x=4;//自动装箱,将整数类型封装成整数类。
    (2)直接进行运算:

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

六、示例

    (1)Integer x=128;
    Integer y=128;
    x==y   (false)
    (2)Integer m=127;
    Integer n=127;
    m==n ( true)
原因:
    因为m和n指向了同一个Integer对象。当数值在byte范围内,对于新特性,如果该数组已经存在,则不会再开辟新的空间。