资源描述
Java基础,褚蕊蕊 2011-6-16,Agenda,Java初级 Java进阶 Q 输出a的ASCII码 97,基本数据类型的包装类,Java是一种面向对象语言,java中的类把方法与数据连接在一起,并构成了自包含式的处理单元。但在Java中不能定义基本类型(primitive type) ,为了能将基本类型视为对象来处理,并能连接相关的方法, Java为每个基本类型都提供了包装类。 包装类:Boolean,Byte,Short,Character,Integer,Long,Float,Double,注意,在Java语言中,字符串没有被当做数组,而是被当做对象来处理的,类String和StringBuffer都可以被用来表示一个字符串。 Java语言不支持C、C+中的指针类型、结构类型、枚举类型和联合类型。 Java语言中所有简单数据类型的所在内存位数都是固定的。 Java语言没有提供无符号整数类型。 Java语言的short数据类型很少使用,因为它限制数据有存储为先高字节,后低字节,这样在某些机器中会出错。 默认的浮点类型是双精度(double),要想要一个float必须在浮点数后面加F或者f。,注意,默认的整数类型是int型,要想使用长整型可在后面加“l”或“L”,如:1000L(小写l容易被误认为1,不推荐用) float可以精确到7位有效数字,第8位的数字是第9位数字四舍五入上取得的;double可以精确到16位有效数字,第17位的数字是第18位数字四舍五入上取得的。 如果要求精确的答案,请不要使用float和double,因为它们是为了在广域数值范围上提供较为精确的快速近似运算而精心设计的。然而,它们没有提供完全精确的结果。尤其是对货币计算尤为不适合,使用BigDecimal。 BigInteger支持任意精度的整数。BigDecimal支持任意精度的定点数。 浮点型转化为整型时,不进行四舍五入,直接截断小数点后面的数。,注意,Java为所有的成员变量提供了默认初始化:byte、short、 int、long-0 float-0.0f double-0.0 boolean-false char-“u0000,对象类型的引用全被初始化为null。 各种基本数据类型进行混合运算,结果会是表达能力最强的那种。如:int和long运算,结果是long,整型和浮点型运算结果是浮点型。特殊的一点是:只要类型比int小(如char、byte、short),那么在运算之前,这些值会自动地转换成int。如: byte b1 = 12; byte b2 = b1 + 1; /在编译时出错了!因为b1+1已经是 int型了!切记!,数值计算实例,常用类,String StringBuffer StringBuild BigDecimal,String,String是Java中的字符串,用双引号引起来的几个字符,不属于8种基本数据类型,它是一个对象。默认值为null 注:String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似. 创建String对象: String s1 = ABCD; String s2 = new String(ABCD); 注:new String()和new String(“”)都是申明一个新的空字符串,是空串不是null String str=”kvill”; String str=new String (“kvill”);的区别 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。,String,例1:String s0=”kvill”; String s1=”kvill”; String s2=”kv” + “ill”; System.out.println( s0=s1 ); System.out.println( s0=s2 ); 结果为:true,true 解析:首先Java会确保一个字符串常量只有一个拷贝。因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0=s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中 ”kvill”的一个引用。所以s0=s1=s2; 用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。 例2: String s0=”kvill”; String s1=new String(”kvill”); String s2=”kv” + new String(“ill”); System.out.println( s0=s1 ); false System.out.println( s1=s2 ); false System.out.println( s0=s2 ); false 解析:s0还是常量池中”kvill”的引用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的引用。因为每个字符串为一个对象,比较的是他们的引用地址,在堆分配的地址肯定是不一样的。,String,关于equals()和= 这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而=是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。 关于String是不可变的 String 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。看来似乎修改了 String 对象的方法实际上是返回一个包含修改内容的新 String 对象。 比如说:String str=”kv”+”ill”+” “+”ans”; 就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill “存在内存中,最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。 String的常用方法,见API,StringBuffer,Java.lang.StringBuffer线程安全的可变字符序列。 String和StringBuffer他们都可以存储和操作字符串,即包含多个字符的字符串数据。String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。 构造方法 public StringBuffer() 创建一个空的StringBuffer类的对象,默认构造器,由系统自动分配容量,默认是16个字符。 public StringBuffer( int length )创建一个长度为 参数length 的StringBuffer类的对象。如果参数length小于0,将触发NegativeArraySizeException异常。 public StringBuffer( String str )用一个已存在的字符串常量来创建StringBuffer类的对象。,StringBuffer类的方法,StringBuffer类的方法,StringBuffer类的方法,StringBuilder,一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。,BigDecimal,BigDecimal支持任意精度的定点数。用来对浮点数类型数据进行精确的运算。 常见方法见API BigDecimal的格式化 由于NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。 NumberFormatcurrency=NumberFormat.getCurrencyInstance(); NumberFormatpercent=NumberFormat.getPercentInstance(); currency.format(amount) percent.format(rate),异常处理,简介 Java异常类的层次结构 Java 异常处理的分类 Java异常的处理方式 Java 异常处理的原则和忌讳,Java异常及异常处理,Java 异常处理是使用 Java 语言进行软件开发和测试脚本开发时不容忽视的问题之一,是否进行异常处理直接关系到开发出的软件的稳定性和健壮性。 可将 Java 异常看作是一类消息,它传送一些系统问题、故障及未按规定执行的动作的相关信息。异常包含信息,以将信息从应用程序的一部分发送到另一部分。 编译语言为何要处理异常?为何不在异常出现位置随时处理具体故障?因为有时候我们需要在系统中交流错误消息,以便按照统一的方式处理问题,有时是因为有若干处理问题的可能方式,但您不知道使用哪一种,此时,可将处理异常的任务委托给调用方法的代码。调用者通常更能了解问题来源的上下文,能更好的确定恢复方式。,通用消息架构,从上图可以看出,必定在运行的 Java 应用程序的一些类或对象中产生异常。出现故障时,“发送者”将产生异常对象。异常可能代表 Java 代码出现的问题,也可能是 JVM 的相应错误,或基础硬件或操作系统的错误。 异常本身表示消息,指发送者传给接收者的数据“负荷”。首先,异常基于类的类型来传输有用信息。很多情况下,基于异常的类既能识别故障本因并能更正问题。其次,异常还带有可能有用的数据(如属性)。 在处理异常时,消息必须有接收者;否则将无法处理产生异常的底层问题。,Java异常类的层次结构,在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。 Throwable 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。 Exception(异常)是应用程序中可能的可预测、可恢复问题。一般大多数异常表示中度到轻度的问题。异常一般是在特定环境下产生的,通常出现在代码的特定方法和操作中。如:当试图调用 readLine 方法时,可能出现 IOException 异常。 Error(错误)表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。 Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。,Java 异常处理的分类,可检测异常 可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,例如:sqlExecption 这个异常就是一个检测异常。你连接 JDBC 时,不捕捉这个异常,编译器就通不过,不允许编译。 非检测异常 1、非检测异常不遵循处理或声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已解决了这样一个异常。例如:一个数组为 3 个长度,当你使用下标为时,就会产生数组下标越界异常。这个异常 JVM 不会进行检测,要靠程序员来判断。有两个主要类定义非检测异常:RuntimeException 和 Error。 自定义异常 自定义异常是为了表示应用程序的一些错误类型,为代码可能发生的一个或多个问题提供新含义。可以显示代码多个位置之间的错误的相似性,也可以区分代码运行时可能出现的相似问题的一个或者多个错误,或给出应用程序中一组错误的特定含义。例如,对队列进行操作时,有可能出现两种情况:空队列时试图删除一个元素;满队列时试图添加一个元素。则需要自定义两个异常来处理这两种情况。,Java异常的处理方式,在 Java 应用程序中,对异常的处理有两种方式:处理异常和声明异常。 处理异常:try、catch 和 finally 代码结构: try xxx; catch(Exception) finally 其中:try 块:将一个或者多个语句放入 try 时,则表示这些语句可能抛出异常。编译器知道可能要发生异常,于是用一个特殊结构评估块内所有语句。 catch 块:当问题出现时,一种选择是定义代码块来处理问题,catch 块的目的便在于此。catch 块是 try 块所产生异常的接收者。基本原理是:一旦生成异常,则 try 块的执行中止,JVM 将查找相应的 JVM。 finally 块:无论运行 try 块代码的结果如何,无论是否运行完,无论是否产生异常,也无论是否在 catch 块中得到处理,finally 块都将执行。,try-catch-finally 规则,必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。 必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。 catch 块与相应的异常类的类型相关 一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。 可嵌套 try-catch-finally 结构。 在 try-catch-finally 结构中,可重新抛出异常。 除了下列情况,总将执行 finally 做为结束:JVM 过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。,声明异常,若要声明异常,则必须将其添加到方法签名块的结束位置。 例:public void readMethod(int input) throws java.io.IOException 声明异常的规则如下: 1、必须声明方法可抛出的任何可检测异常(checked exception) 2、非检测性异常(unchecked exception)不是必须的,可声明,也可不声明。 3、调用方法必须遵循任何可检测异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。,Java 异常处理的原则,尽可能的处理异常 要尽可能的处理异常,如果条件确实不允许,无法在自己的代码中完成处理,就考虑声明异常。如果人为避免在代码中处理异常,仅作声明,则是一种错误和依赖的实践。 具体问题具体解决 异常的部分优点在于能为不同类型的问题提供不同的处理操作。有效异常处理的关键是识别特定故障场景,并开发解决此场景的特定相应行为。为了充分利用异常处理能力,需要为特定类型的问题构建特定的处理器块。 记录可能影响应用程序运行的异常 至少要采取一些永久的方式,记录下可能影响应用程序操作的异常。理想情况下,当然是在第一时间解决引发异常的基本问题。不过,无论采用哪种处理操作,一般总应记录下潜在的关键问题。别看这个操作很简单,但它可以帮助您用很少的时间来跟踪应用程序中复杂问题的起因。 根据情形将异常转化为业务上下文 若要通知一个应用程序特有的问题,有必要将应用程序转换为不同形式。若用业务特定状态表示异常,则代码更易维护。从某种意义上讲,无论何时将异常传到不同上下文(即另一技术层),都应将异常转换为对新上下文有意义的形式。,Java 异常处理的忌讳,一般不要忽略异常 try catch(IOException e) 不要使用覆盖式异常处理块 try catch(Exception e) 一般不要把特定的异常转化为更通用的异常 try catch(IOException e) throw new Exception(“”); 不要处理能够避免的异常 对于有些异常类型,实际上根本不必处理。通常运行时异常属于此类范畴。在处理空指针或者数据索引等问题时,不必求助于异常处理。,Java进阶,集合框架 格式化 排序,集合框架,Collections Framework,基于Java 2 平台,标准版,版本 1.2。 集合框架”提供了一组精心设计的接口和类,它们以单个单元即集合的形式存储和操作数据组。对于计算机科学数据结构课程中学到的许多抽象数据类型 如映射(map)、集(set)、列表(list)、树(tree)、数组(array)、散列表(hashtable)和其它集合来说,该框架提供了一个方便的 API。,集合接口和类,集合框架”由一组用来操作对象的接口组成。不同接口描述不同类型的组。 四个基本接口 Collection 接口是一组允许重复的对象 Set 接口继承 Collection,但不允许重复 List 接口继承 Collection,允许重复,并引入位置下标 Map 接口既不继承 Set 也不继承 Collection 集合实现,Collection 接口,Collection 接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。 基本操作 boolean add(Object element) boolean remove(Object element) int size() boolean isEmpty() boolean contains(Object element) Iterator iterator() 组操作 boolean containsAll(Collection collection) boolean addAll(Collection collection) void clear() void removeAll(Collection collection) void retainAll(Collection collection) 取交集,Collection 接口,AbstractCollection类,提供具体“集合框架”类的基本功能。虽然您可以自行实现 Collection 接口的所有方法,但是,除了iterator() 和 size() 方法在恰当的子类中实现以外,其它所有方法都由 AbstractCollection 类来提供实现。如果子类不覆盖某些方法,可选的如add() 之类的方法将抛出异常。 Iterator 接口,使用 Iterator 接口方法,您可以从头至尾遍历集合,并安全的从底层 Collection 中除去元素。 Collection collection = .; Iterator iterator = collection.iterator(); while (iterator.hasNext() Object element = iterator.next(); if (removalCheck(element) iterator.remove(); ,Set接口,Set 接口继承 Collection 接口,而且它不允许集合中存在重复项。所有原始方法都是现成的,没有引入新方法。具体的 Set 实现类依赖添加的对象的equals() 方法来检查等同性。 HashSet 类和 TreeSet 类 HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法,它使用了哈希码的算法。 TreeSet,是一个有序的Set,其底层是一颗树,放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator,Set接口,SortedSet接口,其中的元素一定是有序的,继承set接口,只有TreeSet这一个实现类。 根据“对象的比较顺序”,而不是“插入顺序”进行排序 方法说明 Comparator comparator():返回Set锁使用的Comparator对象,或者用null表示它使用Object自有的排序方法。 Object first():返回最小的元素 Object last():返回最大的元素 SortedSet subSet(fromElement, toElement):返回Set的子集,其中的元素从fromElement开始到toElement为止(包括fromElement,不包括toElement)。 SortedSet headSet(toElement):返回Set的子集,其中的元素都应小于toElement。 SortedSet tailSet(toElement):返回Set的子集,其中的元素都应大于fromElement。,Set接口-范例,List接口,List 接口继承了 Collection 接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。 面向位置的操作包括插入某个元素或 Collection 的功能,还包括获取、除去或更改元素的功能。 方法说明 void add(int index, Object element ) boolean addAll(int index, Collection collection) object get(int index) int indexOf(Object element) int lastIndexOf(Object element) object remove(int index) object set(int index, Object element) List subList(int fromIndex, int toIndex) ListIterator listIterator() ListIterator listIterator(int startIndex),List接口,ListIterator 接口,继承 Iterator 接口以支持添加或更改底层集合中的元素,还支持双向访问。 方法:previous()、next(); ArrayList 类和 LinkedList 类 ArrayList:采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦 LinkedList :采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始。还可以作为堆栈、队列。,List接口-范例,Map接口,Map 接口不是 Collection 接口的继承。而是从自己的用于维护键-值关联的接口层次结构入手。按定义,该接口描述了从不重复的键到值的映射。 三组操作:改变、查询和提供可选视图。 改变操作允许您从映射中添加和除去键-值对。键和值都可以为 null。但是,您不能把 Map 作为一个键或值添加给自身。 Object put(Object key, Object value) Object remove(Object key) void putAll(Map mapping) void clear() 查询操作允许您检查映射内容 Object get(Object key) boolean containsKey(Object key) boolean containsValue(Object value) int size() boolean isEmpty(),Map接口,可选视图允许您把键或值的组作为集合来处理。 public Set keySet() public Collection values() public Set entrySet() 因为映射中键的集合必须是唯一的,您用 Set 支持。因为映射中值的集合可能不唯一,您用 Collection 支持。最后一个方法返回一个实现 Map.Entry 接口的元素 Set Map.Entry 接口 Map 的 entrySet() 方法返回一个实现 Map.Entry 接口的对象集合。集合中每个对象都是底层 Map 中一个特定的键-值对。 通过这个集合迭代,您可以获得每一条目的键或值并对值进行更改。但是,如果底层 Map 在 Map.Entry 接口的 setValue() 方法外部被修改,此条目集就会变得无效,并导致迭代器行为未定义。 HashMap 类和 TreeMap 类 在 Map 中插入、删除和定位元素,HashMap 是最好的选择 按顺序遍历键,那么 TreeMap 会更好,Map接口,SortedMap接口,其中的键一定是有序的,继承map接口,只有TreeMap这一个实现类。 pair是按key的顺序存储的,由于TreeMap有顺序的概念,因此“位置”是有意义的,所以你可以去获取它的第一个和最后一个元素,以及它的子集。 方法说明 Comparator comparator():返回Map所使用的comparator,如果是用Object内置的方法的话,则返回null。 Object firstKey():返回第一个键。 Object lastKey():返回最后一个键 SortedMap subMap(fromKey, toKey):返回这个Map的一个子集,其键从fromKey开始到toKey为止,包括前者,不包括后者。 SortedMap headMap(toKey):返回这个Map的一愕嘎子集,其键均小于toKey 。 SortedMap tailMap(fromKey):返回这个Map的一个子集,其键均大于等于fromKey 。,Map接口实例,特殊集合的实现,只读集合 把所有必要的元素都添加到集合后,为避免意外的修改集合,以只读方式处理该集合会比较方便。Collections 类提供了六种工厂方法支持该功能,Collection、List、Map、Set、SortedMap 和 SortedSet 每个一种。 Collection unmodifiableCollection(Collection collection) List unmodifiableList(List list) 。 线程安全集合 历史集合类和“集合框架”中新的实现的差别在于新类不是线程安全的。设计者采用这种线程安全方法是让您只在需要时才使用同步,使每项工作快得多。但如果,您正将集合用于多个线程能够同步修改集合的多线程环境,修改就必须同步进行。 Collection synchronizedCollection(Collection collection)。 Set set = Collection.synchronizedSet(new HashSet(); 单元素集合 多副本集合,一张由相同元素的多个副本组成的不变的列表。 空集合, Collections 类还提供表示空集合的常数 List EMPTY_LIST Set EMPTY_SET Map EMPTY_MAP,历史集合类,数组 Vector 类和 Stack 类 Enumeration 接口 Dictionary 类、Hashtable 类和 Properties 类 BitSet 类,数组,数组被定义为同类型数据的定长集合 支持基本数据类型存储的唯一集合 可存储对象 创建数组时,需指定要存储对象的数量和类型。而且,在某个数组的生存期中,不能增加或存储一个不同的类型 高效 支持一维、二维、多维度定义 一维数组声明 type arrayName =value1,value2; type arrayName = new typearraySize; 二维数组声明 int a=new int23; int a=new int2; a0=new int3; a1=new int3; 初始化:int a=2,3,1,5,3,4;,Arrays类,Java.util.Arrays,包括了一组可用于数组的static方法 基本方法 equals () :比较两个数组是否相等 fill () :填充数组 sort () :数组比较 binarySearch () :在一个已排序的数组中查找特定元素 asList():它接受一个数组,然后把它转成一个List容器 复制一个数组: Java标准类库提供了一个System.arraycopy()的static方法。相比for循环,它能以更快的速度拷贝数组。System.arraycopy()对所有类型都作了重载。,Vector 类和 Stack 类,Vector 是个像可增大数组的历史集合类,但它可以存储不同类型的数据元素。Java 2 SDK,版本 2 中 Vector 类被改良到“集合框架”层次结构中以实现 List 接口。 从 Vector 转换为 ArrayList 时,一个关键的差别是 为了更改元素值的位置,参数的顺序被颠倒了。 从原始的 Vector 类:void setElementAt(Object element, int index) 从 List 接口中:void set(int index, Object element) Stack 类继承 Vector,通过 push() 和 pop() 方法以实现一个标准的后进先出(last-in-first-out(LIFO)堆栈。可是,我们要当心。因为 Stack 类继承 Vector 类,您仍然可以用被继承的 Vector 的方法访问或修改 Stack。,Enumeration 接口,Enumeration 接口允许您迭代集合中的所有元素。在“集合框架”中,该接口被 Iterator 接口替 Enumeration 不支持除去操作。 Enumeration enum = .; while (enum.hasNextElement() Object element = iterator.nextElement(); ,算法支持,对数组排序 List 的排序是通过 Collections 类中两种 sort() 方法进行排序 对基本数据类型的数组排序,只要把您的数组作为参数来调用 Arrays.sort() 对象数组的排序有一点棘手,因为编译器不会为您检查每样东西。如果数组里的对象实现 Comparable,如: void sort(Object array , Comparator comparator) 搜索 Collections 和 Arrays 类提供在 Collection 中查找最大值和最小值的机制,还提供对 List 或数组进行搜索的机制。 检查等同性 Arrays 类,检查任何基本数据类型数组或对象数组的等同性。如果两个数组包含顺序相同的相同元素,则这两个数组相等。检查对象数组的等同性依赖于每个要检查等同性对象的 equals() 方法。如: Arrays.equals(array1, array2) 元素的操作 Collections 和 Arrays 类提供了在 List 或数组中操作元素的一些方法。除此之外就再没有操作其它关键框架接口(Set 和 Map)的其它方法了。,格式化,DateFormat NumberFormat,DateFormat,SimpleDateFormat是DateFormat的子类,用于格式化日期 年代标志符 y:年;M:月;d:日;h:上午或下午(112);H:一天(023);m:分;s:秒;S:毫秒 将字符串转换为日期 Date date = new SimpleDateFormat(“yyyy-MM-dd”).parse(strDate); 将日期类型转换为字符串型 String strDate = new SimpleDateFormat(“yyyy-MM-dd”).format(date);,NumberFormat,DecimalFormat是 NumberFormat 的一个具体子类,用于格式化十进制数字。 构造 DecimalFormat test1 = new DecimalFormat(#,#.0000); test1.format(12345.78); DecimalFormat test2 = new DecimalFormat();test2.applyPattern(#,#.000);test2.format(12345.78); 要获取具体语言环境的 NumberFormat,可调用 NumberFormat 的某个工厂方法,如 getInstance()。通常不直接调用 DecimalFormat 的构造方法,因为 NumberFormat 的工厂方法可能返回不同DecimalFormat 的子类. NumberFormat.getPercentInstance() NumberFormat.getCurrencyInstance(); NumberFormat.getNumberInstance() NumberFormat.getIntegerInstance() NumberFormat.getScientificInstance(),Q & A,山东益信通科贸有限公司,Thank You !,
展开阅读全文