第一讲 String类
简述
String类是字符串的类类型,用于描述字符串事物,字符串是一个特殊的对象。 该类被final修饰,代表着该类不能有子类。也就是说String类
里面操作字符串的功能是不能被复写的。
一、String类自身的特点
- 字符串是对象
- String s = new String();
- String s1 = "";
上面两条语句等效。一般情况下第一种方式不多见,常用第二种方式。String s1 = "abc"; s1是一个类类型变量,因为类类型变量一定指向对象,所以"abc"是一个对象。
- 字符串最大的特点是一旦被初始化就不可以被改变。
String s1 = "abc";s1 = "kk";System.out.println(s1);打印结果:kk
此时: 不是"abc"变化了,是s1变了。 s1先前指向"abc"这个对象,现在指向"kk"这个对象。s1的内存地址变化了,但是"abc"对象的内容没有变化过。 这叫做一旦被初始化,就不会被改变。
- s1和s2的区别
此时:s1==s2结果是false,因为"abc"是一个对象,s2是一个new的新对象。
※s1与s2有什么区别呢?
String s2 = new String("abc"); // new是创建一个对象,"abc"是一个对象,所以s2在内存中有两个对象。s1在内存中有一个对象。 s2在内存中有两个对象。
原因: s1指向一个字符串,s3指向一个字符串。 因为"abc"这个对象已经在内存中存在了,作为字符串这种特殊的对象,在常量池中存在的数据。 s3在初始化的时候发现"abc"已经在内存中存在了,它就不会再独立开辟空间了。因为再开辟空间的话 会比较浪费空间,"abc"已经在内存中存在, 且不会被改变,就不需要再开辟空间来分配。
- 为了节约内存,在字符串这个对象当中,只要字符串相同的话,那么s1和s3指向着同一个对象。
- String类中的equals()方法
- s1.equals(s2) 结果是true。 equals()方法:比较的是内存地址值。那么 s1,s2不相等,为什么equals后便相等了呢?
- 因为:String类复写了Object类的equals()方法。复写完以后String类建立了自己对象独特的判断相同的内容。该方法用于判断字符串是否相同。s1和s2的内容都是"abc",所以结果为true。
- 字符串在内存当中有一个常量池,池里面是个数组,里面存放的是'a','b','c'这样的字符。字符串是由字符组成,当你组成一个字符串"abc"时,会到常量池中找到a字符,b字符,c字符,拼成一个新的字符串对象,存放在数组当中。
- 获取
- 字符串中包含的字符数,也就是字符串的长度。
- int length();获取长度。
- 数组也有长度,但是其length是属性,字符串也有长度,但是是靠方法来完成的。
- 根据位置获取位置上的某个字符。
- char charAt(int index);
- 根据字符获取该字符在字符串中位置。
- int indexOf(int ch);返回的是ch在字符串中第一次出现的位置。
- int indexOf(int ch,int fromIndex);从fromIndex指定位置开始,获取ch在字符串中出现的位置。
- int indexOf(String str);返回的是str在字符串中第一次出现的位置。
- int indexOf(String str,int fromIndex);从fromIndex指定位置开始,获取str在字符串中出现的位置。
- int lastIndexOf(int ch);反向索引一个字符出现的位置。
- 字符串中包含的字符数,也就是字符串的长度。
- 判断
- 字符串中是否包含某一个子串。
- boolean contains(str);
- 特殊之处:indexOf(str):可以索引str第一次出现的位置,如果返回-1,
- 表示该str不在字符串中,所以,也可以用于对指定字符串的判断是否包含。
- if(str.indexOf("aa")!=-1)
- 而且该方法既可以判断又可以获取出现的位置。
- 如果只为判断是否包含用contains(str);
- 如果既要判断又要拿位置的话用indexOf(str);
- 字符串中是否有内容。
- boolean isEmpty();原理就是判断长度是否为0。
- 字符串是否以指定内容开头。
- boolean startsWith(str);
- 字符串是否以指定内容结尾。
- boolean endsWith(str);
- 判断字符串内容是否相同。复写了Object类中的equals方法。
- boolean equals(str);
- 判断内容是否相同,并忽略大小写。
- boolean equalsIgnoreCase();
- 字符串中是否包含某一个子串。
- 转换
- 将字符数组转成字符串。
- 构造函数:
- String(char[]);
- String(char[],offest,count);将字符数组中的一部分转成字符串。
- 静态方法:
- static String copyValueOf(char[]);
- static String copyValueOf(char[],int offest, int count);
- static String valueOf(char[]);
- 构造函数:
- 将字符数组转成字符串。
- 将字符串转成字符数组。
- char[] toCharArray(); 不需要参数的原因:对象就是字符串。里面用的是this。
- 将字节数组转成字符串。
- String(byte[]);
- String(byte[],offest,count);将字节数组中的一部分转成字符串。
- 将字符串转成字节数组。
- byte[] getBytes();
- 将基本数据类型转成字符串。
- static String valueOf(int);
- static String valueOf(double);
- //3+"";//String.valueOf(3);字符串长度是1,里面是3
- 特殊:字符串和字节数组在转换过程中是可以指定编码表的。但凡想做编码操作的时候,得把他变成字节数组才可以,字符不行。
- 替换
- String replace(oldchar,newchar);
- String replace(CharSequence target,CharSequence replacemenr);
- 切割
- String[] split(regex);
- s.split(",")当中","作为切割点,是不会被包含在切割完的字符串部分的。
- 子串,获取字符串中的一部分。
- String substring(begin);
- String substring(begin,end);
- 转换,去除空格,比较
- 将字符串转成大写或者小写。
- String toUpperCase();
- String toLowerCase();
- 将字符串两端的多个空格去除。
- String trim();
- 对两个字符串进行自然顺序的比较。
- int compareTo(string);
- 如果参数字符串等于此字符串,则返回值0,
- 如果此字符串按字典顺序小于字符串参数,则返回负数,
- 如果此字符串按字典顺序大于字符串参数,则返回正数。
- 将字符串转成大写或者小写。
- 字符串为什么能忽略大小写比较?
- 原理:把参与比较的字符串全都变小写,然后再用equals方法比较就可以了。
第二讲 StringBuffer
简述
StringBuffer
是一个容器,字符串的组成原理就是通过该类实现的。
StringBuffer
可以对字符串内容进行增删改查等操作,很多方法和
String
相同。当数据类型不确定,而且最终要变成字符串的时候,数据的个数不确定的时候缓冲区用起来是最方便的。
一、特点:
- 长度是可变化的。
- 可以直接操作多个数据类型。
- 最终会通过toString方法变成字符串。
二、常用方法
- 存储
- StringBuffer append():将指定数据作为参数添加到已有数据结尾处。返回原缓冲区对象
- StringBuffer insert(index,数据):可以将数据插入到指定index位置。
输出结果说明sb和sb1指向同一个对象。
sb.append("abc").append(true).append(34);
方法调用链:sb.append("abc")返回的是本类对象,所以还可以调用本类方法。
- 删除
- StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
- StringBuffer deleteCharAt(index):删除指定位置的字符。
- 获取
- char charAt(int index) ;
- int indexOf(String str) ;
- int lastIndexOf(String str);
- int length() ;
- String substring(int start, int end);** 返回是String类对象 。
- 修改
- StringBuffer replace(start,end,string);替换缓冲区中的数据,包含start,不包含end。
- void setCharAt(int index, char ch) ; 替换缓冲区index位置上的字符。返回值类型不是StringBuffer,替换完不返回。
- 反转
- StringBuffer reverse();
- 将缓冲区中指定数据存储到指定字符数组中。
- void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) ;包含srcBegin,不包含srcBegin。
三、JDK1.5 版本之后出现了StringBuilder.
- StringBuffer是线程同步。有锁。效率低。
- StringBuilder是线程不同步。无锁。效率高。
以后开发,建议使用 StringBuilder 。如遇多线程,使用 StringBuffer 或自己加锁。
升级三个因素:
- 提高效率。
- 简化书写。
- 提高安全性。
第三讲 基本数据类型包装类
简述
按照Java面向对象的原则,Java将万事万物都视为对象。包括基本数据类型。一个int型有多种表现形式,怎么将一个十进制的int型,变成其他进制表现形式呢?这这变化整数自己最清楚,那么要把整数变成对象,里面如果定义了进制转换功能的话,这样指挥起整数就非常方便了。
将基本数据类型封装成对象的好处,在于可以在对象中定义更多的功能方法操作该数据。基本数据类型对象包装类的最常见作用,就是用于基本数据类型和字符串类型之间做转换。
一、基本数据类型对象包装类
基本数据类型 引用数据类型byte Byteshort shortint Integerlong longboolean Booleanfloat Floatdouble Doublechar Character
二、应用
- 基本数据类型对象包装类的常见作用,就是用于基本数据类型和字符串类型之间做转换。
- 基本数据类型转成字符串。
- 基本数据类型+""
- 基本数据类型.toString(基本数据类型值);
- 如:Integer.toString(34);//将34整数变成"34";
- 基本数据类型转成字符串。
- 字符串转成基本数据类型。
- 静态调用方式:
- 基本数据类型 基本数据类型值 = 基本数据类型对应的引用数据类型.parse基本数据类型(String);
- xxx a = Xxx.parseXxx(String);
- 静态调用方式:
例如:int num = Integer.parseInt("123");long x = long.parseInt("123");double b = Double.parseDouble("123");boolean b = Boolean.parseBoolean("false");
- 对象调用方式:
- Integer i = new Integer("123");
- int num = i.intValue();
- 十进制转成其他进制。
- toBinaryString(); 转成二进制。
- toOctalString(); 转成八进制。
- toHexString(); 转成十六进制。
- 其他进制转成十进制。
- parseInt(String radix); String,进制表现形式, radix,对应的进制。
- Integer类的equals方法:
- Integer类复写了Object类里面的equals方法。建立了自己比较相同的特有方式,比较的是数值是否相同。
x==y:false 原因:x,y是两个对象。
三、JDK1.5版本以后出现的新特性, 自动装箱和自动拆箱 。
- 示例:
- Integer x = new Integer(4);
- Integer x = 4;//自动装箱。// 4相当于 new Integer(4).;
- x= x/*x.intValue()*/ + 2;//x+2: 进行自动拆箱。将x变成了int类型和2进行了加法运算,再将和进行装箱赋给x。
- 作用:简化书写,方便于运算。
- 注:Integer x 中x除了取整数值外 还多了一个值null。如果x要进行数据运算,先要判断值是否为null,如果值为空,就不能调用intVaule方法。 否则运行时会出现空指针异常。
当数值在byte范围内时(-128~127),对于新特性 ,如果该数值已经存在,则不会再开辟新的内存空间。