1、主讲人:倪红军主讲人:倪红军信息工程学院信息工程学院Java实用教程第六章:信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程本章内容 字符串相关类(String、StringBuffer、StringBuilder)基本数据类型包装类 Math类(不重要)File类 枚举类信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程String类 字符串是一个特殊的对象;字符串一旦初始化就不可以改变;String str=“abc”;str是一个类类型变量,所以“abc“是一个对象。String str1=new String(“abc”);有什么区别?String
2、 str=“abc”;String str1=new String(“abc”);System.out.println(s1=s2);System.out.println(s1.equals(s2);str在内存中有一个对象,str1在内存中有两个对象。String类复写了Object类中equals方法,该方法用于判断字符串内容是否相同。信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程String 类 java.lang.String 类代表不可变不可变的字符序列。“xxxxx”为该类的一个对象。String类是用于描述字符串事物,那么它就提供了多个方法对字符串进行操作。
3、String类的常见构造方法:String(String original)创建一个String对象为original的拷贝。String(char value)用一个字符数组创建一个String对象 String(char value,int offset,int count)用一个字符数组从offset项开始的count个字符序列创建一个String对象String类是final的,不可能有子类,也就不可能被重写等。信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程String类中常见的操作 获取 字符串中包含的字符数,也就是字符串的长度;int length();根据位
4、置获取位置上某个字符;char charAt(int index);根据字符获取该字符在字符中的位置;int indexof(int ch);返回的是ch在字符串中第一次出现的位置。int indexof(int ch,int fromIndex);返回的从fromIndex指定位置开始,获取ch在字符串出现的位置。lastIndexOf(String str);lastIndexOf(String str,int fromIndex)。判断 字符串中是否包含某一个子串;contains(CharSequence s)字符串是否有内容;isEmpty()字符串是否是以指定内容开头;starts
5、With(String prefix)字符串是否是以指定内容结尾;endsWith(String suffix)判断字符串内容是否相同,它复写了Object类中的equals方法;equals(Object anObject)判断内容是否相同,并忽略大小写;compareToIgnoreCase(String str);数组?思考:查找的指定字符不存在输出什么?查找的位置超出范围输出什么?信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程String类中常见的操作转换 将字符数组转成字符串;构造函数:String(char);String(char value,int off
6、set,int count),分配一个新的 String,它包含取自字符数组参数一个子数组的字符。静态方法:copyValueOf(char data);copyValueOf(char data,int offset,int count);返回指定数组中表示该字符序列的 String。将字符串转成字符数组;char toCharArray();将字节数组转成字符串;String(byte);将字符串转成字节数组;byte getBytes;将基本数据类型转成字符串;static String valueOf(int);3+“”等价于String.valueOf(3);特殊:字符串和字节数组在
7、转换的过程中,可以指定编码表。信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程String类练习信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程练习一、二答案分析两功能的异同信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程练习三、四答案思考:1、用indexof()的另一种方法实现;2、能用split()切来实现吗?(No)信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程String类中常见的操作替换和切割 replace(char oldChar,char newChar);返回一个新的字符串,它是通过用 new
8、Char 替换此字符串中出现的所有 oldChar 得到的;如果替换的字符串不存在,则返回的时原串;split(String regex);根据给定正则表达式的匹配拆分此字符串。String s=“hello java”;String s1=s.replace(a,n);System.out.println(s);System.out.println(s1);String s=“java,c,vb,c+”;String arr=s.split(“,”);for(int i=1;iarr.length;i+)System.out.println(arri);信息工程学院信息工程学院主讲人:倪红军
9、主讲人:倪红军Java实用教程String类中常见的操作其他 子串:substring(int beginIndex,int endIndex)返回一个新字符串,它是此字符串的一个子字符串。大小写转换:将字符串两端的多个空格去除 对两个字符串进行自然顺序比较信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程String 类举例(1)public class Test public static void main(String args)String s1=hello;String s2=world;String s3=hello;System.out.println(s1=
10、s3);/true s1=new String(hello);s2=new String(hello);System.out.println(s1=s2);/false System.out.println(s1.equals(s2);/true char c=s,u,n,j,a,v,a;String s4=new String(c);String s5=new String(c,4,4);System.out.println(s4);/sun java System.out.println(s5);/java 常量池中存在了字符串,就不需要再分配空间了。信息工程学院信息工程学院主讲人:倪红军
11、主讲人:倪红军Java实用教程String 类常用方法(1)public char charAt(int index)返回字符串中第返回字符串中第index个字符。个字符。public int length()返回字符串的长度。返回字符串的长度。public int indexOf(String str)返回字符串中出现返回字符串中出现str的第一个位置的第一个位置public int indexOf(String str,int fromIndex)返回字符串中从返回字符串中从fromIndex开始出现开始出现str的第一个位置的第一个位置public boolean equalsIgnor
12、eCase(String another)比较字符串与比较字符串与another是否一样(忽略大小写)是否一样(忽略大小写)public String replace(char oldChar,char newChar)在字符串中用在字符串中用newChar字符替换字符替换oldChar字符字符信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程String 类举例(2)public class Test public static void main(String args)String s1=sun java,s2=Sun Java;System.out.println(s
13、1.charAt(1);/u System.out.println(s2.length();/8 System.out.println(s1.indexOf(java);/4 System.out.println(s1.indexOf(Java);/-1 System.out.println(s1.equals(s2);/false System.out.println(s1.equalsIgnoreCase(s2);/true String s=我是程序员,我在学我是程序员,我在学java;String sr=s.replace(我我,你你);System.out.println(sr);/
14、你是程序员,你在学你是程序员,你在学java 信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程String 类常用方法(2)public boolean startsWith(String prefix)判断字符串是否以判断字符串是否以prefix字符串开头字符串开头public boolean endsWith(String suffix)判断字符串是否以判断字符串是否以prefix字符串结尾字符串结尾public String toUpperCase()返回一个字符串为该字符串的大写形式返回一个字符串为该字符串的大写形式public String toLowerCase
15、()返回一个字符串为该字符串的小写形式返回一个字符串为该字符串的小写形式public String substring(int beginIndex)返回该字符串从返回该字符串从beginIndex开始到结尾的子字符串开始到结尾的子字符串public String substring(int beginIndex,int endIndex)返回该字符串从返回该字符串从beginIndex开始到开始到endIndex结尾的子字符串结尾的子字符串public String trim()返回将该字符串去掉开头和结尾空格后的字符串返回将该字符串去掉开头和结尾空格后的字符串信息工程学院信息工程学院主讲人
16、:倪红军主讲人:倪红军Java实用教程String 类举例(3)public class Test public static void main(String args)String s=Welcome to Java World!;String s1=sun java ;System.out.println(s.startsWith(Welcome);/true System.out.println(s.endsWith(World);/false String sL=s.toLowerCase();String sU=s.toUpperCase();System.out.println(
17、sL);/welcome to java world!System.out.println(sU);/WELCOME TO JAVA WORLD!String subS=s.substring(11);System.out.println(subS);/Java World!String sp=s1.trim();System.out.println(sp);/sun java 信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程String 类常用方法(3)静态重载方法 public static String valueOf()可以将基本类型数据转换为字符串;例如:publ
18、ic static String valueOf(double d)public static String valueOf(int i)b+“”;方法 public String split(String regex)可以将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组。信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程String 类举例(4)public class Test public static void main(String args)int j=1234567;String sNumber=String.valueOf(j);/j+”System.
19、out.println (j 是是+sNumber.length()+位数。位数。);String s=Mary,F,1976;String sPlit=s.split(,);for(int i=0;isPlit.length;i+)System.out.println(sPliti);输出结果:输出结果:j 是是7位数。位数。MaryF1976信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程课堂练习课 堂 练 习 1:编写一个程序,输出一个字符串编写一个程序,输出一个字符串中的大写英文字母数,小写英文字母数中的大写英文字母数,小写英文字母数以及非英文字母数。以及非英文字母
20、数。2:编写一个方法,编写一个方法,输出在一个字符输出在一个字符串中,指定字符串出现的次数。串中,指定字符串出现的次数。TestString.java信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程Apache Commons public static int countMatches(String str,String sub)System.out.println(mons.lang.StringUtils.countMatches(s,java);信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程StringBuffer类 字符串的组成原理就是通过该
21、类实现的 StringBuffer可以对字符串内容进行增删 StringBuffer是一个容器 很多方法与String相同 StringBuffer是字符缓冲区,而且长度可变,可以字节操作多个数据类型,最终会通过toString()方法变为字符串信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程StringBuffer类中常见的操作 存储 StringBuffer append();将指定的数据作为参数添加到已有数据的结尾处;StringBuffer sb=new StringBuffer();StringBuffer sb1=sb.append(34);System.out
22、.println(sb.toString();System.out.println(sb1.toString();输出结果是:?System.out.println(sb=sb1);输出结果是:?sb.append(“abc”).append(true).append(34);sb.insert(1,”qq”);信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程StringBuffer类中常见的操作 删除 StringBuffer delete(start,end);删除缓冲区中的数据;包含start,不包含end;StringBuffer deleteCharAt(inde
23、x);删除指定位置的字符;/清空缓冲区 sb.delete(0,sb.length();信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程StringBuffer类中常见的操作 获取 charAt(int index);返回此序列中指定索引处的 char 值。修改 StringBuffer replace(int start,int end,String str);使用给定 String 中的字符替换此序列的子字符串中的字符。void setCharAt(int index,char ch);将给定索引处的字符设置为 ch。反转 reverse()将字符从此序列复制到目标字符
24、数组 dst getChars(int srcBegin,int srcEnd,char dst,int dstBegin)信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程StringBuffer 类 java.lang.StringBuffer 代表可变的字符序列。StringBuffer和String类似,但StringBuffer可以对其字符串进行改变。StringBuffer类的常见构造方法:StringBuffer()创建一个不包含字符序列的“空”的StringBuffer对象。StringBuffer(String str)创建一个StringBuffer对象,
25、包含与String对象str相同的字符序列。信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程StringBuffer常用方法(1)l重载方法重载方法 public StringBuffer append()可以为该可以为该StringBuffer 对象添加字符序列,返回添加后的该对象添加字符序列,返回添加后的该StringBuffer对对象引用,例如:象引用,例如:public StringBuffer append(String str)public StringBuffer append(StringBuffer sbuf)public StringBuffer app
26、end(char str)public StringBuffer append (char str,int offset,int len)public StringBuffer append(double d)public StringBuffer append(Object obj)信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程StringBuffer常用方法(2)重载方法重载方法 public StringBuffer insert()可以为该可以为该StringBuffer 对象对象在指定位置插入字符序列,返回修改后的该在指定位置插入字符序列,返回修改后的该Stri
27、ngBuffer对象引用,例如:对象引用,例如:public StringBuffer insert (int offset,String str)public StringBuffer insert (int offset,double d)方法方法 public StringBuffer delete(int start,int end)可以删除从可以删除从start开始到开始到end-1为止的一段字符序列,返回修改后的该为止的一段字符序列,返回修改后的该StringBuffer对象对象引用。引用。信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程StringBuffer
28、常用方法(3)和和 String 类含义类似的方法:类含义类似的方法:public int indexOf(String str)public int indexOf(String str,int fromIndex)public String substring(int start)public String substring(int start,int end)public int length()方法方法 public StringBuffer reverse()用于将字符序列逆序,返回修改后用于将字符序列逆序,返回修改后的该的该StringBuffer对象引用。对象引用。信息工程学院
29、信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程StringBuffer类举例public class Test public static void main(String args)String s=Mircosoft;char a=a,b,c;StringBuffer sb1=new StringBuffer(s);sb1.append(/).append(IBM).append(/).append(Sun);System.out.println(sb1);StringBuffer sb2=new StringBuffer(数字数字);for(int i=0;i角度 toRadi
30、ans(double angdeg)角度-弧度 信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程public class Test public static void main(String args)double a=Math.random();double b=Math.random();System.out.println(Math.sqrt(a*a+b*b);System.out.println(Math.pow(a,8);System.out.println(Math.round(b);System.out.println(Math.log(Math.pow(M
31、ath.E,15);double d=60.0,r=Math.PI/4;System.out.println(Math.toRadians(d);System.out.println(Math.toDegrees(r);输出结果:输出结果:0.227248547678212043.05976E-10015.01.6597645.0Math类举例信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程File 类java.io.File类代表系统文件名(路径或文件名)类代表系统文件名(路径或文件名)。File类的常见构造方法:类的常见构造方法:public pathname)以以pa
32、thname为路径创建为路径创建File对象,如果对象,如果pathname是相对路径,则默认的当前路径在系统属性是相对路径,则默认的当前路径在系统属性user.dir中存储。中存储。File的静态属性的静态属性String separator存储了当前系统的路径分隔符。存储了当前系统的路径分隔符。通过通过File对象可以访问文件的属性。对象可以访问文件的属性。public boolean canRead()public boolean canWrite()public boolean exists()public boolean isDirectory()public boolean isF
33、ile()public boolean isHidden()public long lastModified()public long length()public String getName()public String getPath()通过通过File对象创建空文件或目录(在该对象所指的文件或目录不存在的情况下)。对象创建空文件或目录(在该对象所指的文件或目录不存在的情况下)。public boolean createNewFile()throws IOException public boolean delete()public boolean mkdir()TestList信息工程
34、学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程课堂练习课 堂 练 习 编写一个程序,在命令行中以树状编写一个程序,在命令行中以树状结构展现特定的文件夹及其子文件结构展现特定的文件夹及其子文件(夹夹)信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程补充:补充:java.lang.Enum枚举类型枚举类型 枚举类型:只能够取特定值中的一个 使用enum关键字 是java.lang.Enum类型TestEnum.java信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程总结总结 String 正则表达式 基础类型包装类 Math File 递归 枚
35、举类型 Apache Commons主讲人:倪红军主讲人:倪红军信息工程学院信息工程学院Java实用教程第七章:容器/集合信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程本章内容 容器的概念 容器 API Collection 接口 Iterator 接口 增强的for循环 Set 接口 List 接口 和 Comparable 接口 Collections类 Map 接口 自动打包/解包 泛型(JDK1.5新增)信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程集合类 为什么出现集合类?面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操
36、作,就对对象进行存储,集合就是存储对象最常用的一种方式;数组和集合类同是容器,有何不同?数组虽然也可以存储对象,但长度是固定的,而集合长度是可变的;数组中可以存储基本数据类型,而集合只能存储对象;集合类的特点 集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象;信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程容器的概念阅读如下程序:阅读如下程序:public class Name private String firstName,lastName;public Name(String firstName,String lastName)this.firstNa
37、me=firstName;this.lastName=lastName;public String getFirstName()return firstName;public String getLastName()return lastName;public String toString()return firstName+lastName;public class Test public static void main(String arg)Name name1=new Name(f1,l1);Name name2=new Name(f2,l2);Name name3=new Name
38、(f3,l3);容器:Java API 所提供的一系列类的实例,用于在程序中存放对象。信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程容器 APIJ2SDK所提供的容器所提供的容器API位于位于 java.util 包内。包内。容器容器API的类图结构如下图所示:的类图结构如下图所示:1图1类3知识点6接口没有顺序不可重复有顺序可以重复信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程容器 API Collection 接口定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式。Set 中的数据对象没有顺序且不可以重复。中的数据对象没有顺序且
39、不可以重复。List 中的数据对象有顺序且可以重复。(即互相中的数据对象有顺序且可以重复。(即互相equals)Map 接口定义了存储“键(key)值(value)映射对”的方法。信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程Collection 接口Collection 接口中所定义的方法:接口中所定义的方法:int size();boolean isEmpty();void clear();boolean contains(Object element);/equalsboolean add(Object element);boolean remove(Object
40、element);Iterator iterator();boolean containsAll(Collection c);boolean addAll(Collection c);boolean removeAll(Collection c);boolean retainAll(Collection c);/求交集求交集Object toArray();信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程Collection 方法举例import java.util.*;public class Test public static void main(String arg
41、s)Collection c=new ArrayList();/可以放入不同类型的对象可以放入不同类型的对象 c.add(hello);c.add(new Name(f1,l1);c.add(new Integer(100);System.out.println(c.size();System.out.println(c);输出结果:输出结果:3hello,f1 l1,100TestArrayList.java信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程ArrayList为什么有两个remove方法?方法?ArrayList为什么有两个remove方法?remove(i
42、nt index)是子类新添加的!如果是父类引用指向子类对象,则找不到子类中新添加的方法。要想调用子类新添加的方法,需要先转型 是优先自动打包呢?还是先去匹配方法?信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程c“hello”信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程Map 接口 实现Map接口的类用来存储键值 对。Map 接口的实现类有HashMap和TreeMap等。Map类中存储的键值对通过键来标识,所以键值不能重复。Object put(Object key,Object value);Object get(Object key);Obj
43、ect remove(Object key);boolean containsKey(Object key);boolean containsValue(Object value);int size();boolean isEmpty();void putAll(Map t);void clear();TestMap.javaEquals!所以要比较hashcode信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程hashCode 一个对象被当作Map里面的key的时候,hashCode用来比较两个对象是不是相等 hashCode非常适合用来做索引 hashCode 的常规协
44、定 重写equals方法,通常需要重写hashCode方法.因为你的本意是想让他相等的.但hashCode如果不重写,不同的对象就不会相等 Hashcode被谁调用了?什么时候调用的?信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程Collection 方法举例import java.util.*;public class Test public static void main(String args)Collection c=new HashSet();c.add(hello);c.add(new Name(f1,l1);c.add(new Integer(100);c
45、.remove(hello);c.remove(new Integer(100);System.out.println (c.remove(new Name(f1,l1);System.out.println(c);输出结果:输出结果:falsef1 l1BasicContainer.java信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程 HashSet底层用HashMap来实现。往HashSet里面放对象,同样需要重写hashcode方法信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程Collection 方法举例public boolean equ
46、als(Object obj)if(obj instanceof Name)Name name=(Name)obj;return(firstName.equals(name.firstName)&(lastName.equals(name.lastName);return super.equals(obj);public int hashCode()return firstName.hashCode();l 容器类对象在调用remove、contains 等方法时需要比较对象是否相等,这会涉及到对象类型的 equals 方法和hashCode(hash容器)方法;对于自定义的类型,需要要重写e
47、quals 和 hashCode 方法以实现自定义的对象相等规则。l注意:相等的对象应该具有相等的 hash codes。l 增加Name类的equals和hashCode方法如下:信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程Collection 方法举例使用更新的使用更新的Name类,运行下列程序:类,运行下列程序:import java.util.*;public class Test public static void main(String args)Collection c=new Link
48、edList();c.add(new Name(f1,l1);c.add(new Name(f2,l2);System.out.println(c.contains (new Name(f2,l2);c.remove(new Name(f1,l1);System.out.println(c);输出结果:输出结果:truef2 l2信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程Iterator 接口所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。Iterator对象称作迭代器,用以方便的实现对容器内元素的遍
49、历操作。Iterator接口定义了如下方法:Enumeration ArrayList-Vectorboolean hasNext();/判断游标右边是否有元素判断游标右边是否有元素Object next();/返回游标右边的元素并将游标移动到下一个位置返回游标右边的元素并将游标移动到下一个位置void remove();/删除游标左面的元素,在执行完删除游标左面的元素,在执行完next之后该之后该 /操作只能执行一次操作只能执行一次游标游标Next()元素元素信息工程学院信息工程学院主讲人:倪红军主讲人:倪红军Java实用教程Iterator 方法举例import java.util.*;p
50、ublic class Test public static void main(String args)Collection c=new HashSet();c.add(new Name(f1,l1);c.add(new Name(f2,l2);c.add(new Name(f3,l3);Iterator i=c.iterator();while(i.hasNext()/next()的返回值为的返回值为Object类型,需要转换为相应类型类型,需要转换为相应类型 Name n=(Name)i.next();System.out.print(n.getFirstName()+);输出结果:输出