前言:
JAVA语言中针对数字、数学运算、字符、字符串有专门的类,分别是Number、Math、Character和String.
1.数字:
JAVA对数字处理的相关方法被封装在java.lang包中.
1-1.Numbers数字包装器类(wrapper):
JAVA平台为每一个原始数据类型提供了"包装器(wrapper)类".这些包装器类负责把原始数据包装成对象.
Numbers数字包装器类有:Byte、Short、Integer、Long、Float、Double.通俗点讲,就是说,我们要定义一个
原始数据时,可以把它用包装器去定义成一个对象.这样除了我们定义的原始数据本身之外,JAVA还为我们添加
了一些默认的"服务"--这种服务通常是对这个原始数据比较常用的操作方法,比如数字和字符之间的转换.下
面给出两个示例,它们的输出结果是一样的,只是对原始数据的定义方式不一样.示例一是int类型,示例二是Integer
对象.
示例一:
public class IntegerApp { public static void main(String[] args) { int x,y; x = 17; y = 25; System.out.println(x + y); } }示例二:
public class IntegerApp { public static void main(String[] args) { Integer x,y; x = 17; y = 25; System.out.println(x + y); } }
上述中我们通过函数print()和println()将字符打印到标准的输出终端(System.out).对于输出有关数字时,
比如说按16进制输出等动作,JAVA为这些个性化操作定制了很好的类及方法来帮助我们实现个性化操作.这
些类及操作方法被封装在java.io包里面PrintStream类,这个类下的两个方法:format()和printf()可以帮我们实
现数字的个性化输出.下面给出一个示例:
示例三:
import java.util.Calendar; import java.util.Locale; public class TestFormat { public static void main(String[] args) { long n = 382112; System.out.format("%d%n", n); System.out.format("%08d%n", n); System.out.format("%+8d%n", n); System.out.format("%,8d%n", n); System.out.format("%+,8d%n%n", n); double pi = Math.PI; System.out.format("%f%n", pi); System.out.format("%.3f%n", pi); System.out.format("%10.3f%n", pi); System.out.format("%-10.3f%n", pi); System.out.format(Locale.FRANCE, "%-10.4f%n%n", pi); Calendar c = Calendar.getInstance(); System.out.format("%tB %te, %tY%n", c, c, c); System.out.format("%tl:%tM %tp%n", c, c, c); System.out.format("%tD%n", c); } }输出结果:
382112 00382112 +382112 382,112 +382,112 3.141593 3.142 3.142 3.142 3,1416 June 16, 2013 1:44 pm 06/16/13
更精准地控制输出数字的格式,比如控制数字开头和结尾的0、前缀后缀、千分位分隔符、十进制分隔符等显示.
JAVA平台提供了java.text.DecimalFormat类来帮助实现这些操作.如下面的示例四:
示例四:
import java.text.*; public class DecimalFormatDemo { static public void customFormat(String pattern, double value ) { DecimalFormat myFormatter = new DecimalFormat(pattern); String output = myFormatter.format(value); System.out.println(value + " " + pattern + " " + output); } static public void main(String[] args) { customFormat("###,###.###", 1123456.7891); customFormat("###.##", 123456.789); customFormat("00.000", 123.78); customFormat("$###,###.###", 12345.67); } }
输出结果:
1123456.7891 ###,###.### 1,123,456.789 123456.789 ###.## 123456.79 123.78 00.000 123.780 12345.67 $###,###.### $12,345.67
下面对输出结果作简要分析:
1).符号#表示一个数字;
2).逗号用于千分位的一个占位符;
3).字符0和字符#一样,充当占位符.
1123456.7891被要求用"###,###.###"格式(pattern)输出:DecimalFormat()类会根据这个pattern实现处理输出.根据这个pattern,DecimalFormat()类就知道了:
1).千分位要用逗号隔开;
2).千分位以上要完全保留(而不是因为有三个"#"而只保留三个有效数字),不能导致数据丢失;小数点后面保留三位数,被丢弃位按四舍五入的原则来取舍.
因此,输出结果为:1,123,456.789
第二个分析和第一个同理;
123.78被要求用"00.000"格式(pattern)输出.DecimalFormat()类会根据这个pattern实现处理输出.根据这个pattern.DecimalFormat()类就知道了:
输出结果用0开头用0结束:当0的位数不够时,保留原有数据,不能因此而导致数据丢失;当0的位数有多的时候,直接补0即可.
因此,输出结果为:
123.780
最后一个输出,小数点后面的"#"比原来的数据要多一个.直接舍弃"#"号.不像符号0要补在输出数据后面.
1-4:Math数学运算处理类
我们在编程中常用的数学运算有加、减、乘、除、除模、求绝对值等运算.这些运算JAVA平台都帮我们实现好了.在java.lang包中的Math类.
Math类中的方法都是静态的,可以直接通过类来进行调用.这个类包括了常用常量和方法.如Math.PI、Math.abs()等.
下面给出一个示例来看一下Math类:
示例五:
public class BasicMathDemo { public static void main(String[] args) { double a = -191.635; double b = 41.94; int c = 27, d = 65; System.out.printf("%.3f abs = %.3f%n", a, Math.abs(a)); System.out.printf("Larger Than %.2f Is %.0f.%n", b, Math.ceil(b)); System.out.printf("Smaller Than %.2f Is %.0f.%n", b, Math.floor(b)); System.out.printf("Most Reach %.2f Is %.0f.%n", b, Math.rint(b)); System.out.printf("Between %d And %d,%d Is Larger.%n",c, d, Math.max(c, d)); System.out.printf("Between %d And %d,%d Is Smaller.%n",c, d, Math.min(c, d)); } }
-191.635 abs = 191.635 Larger Than 41.94 Is 42. Smaller Than 41.94 Is 41. Most Reach 41.94 Is 42. Between 27 And 65,65 Is Larger. Between 27 And 65,27 Is Smaller.
Math类的方法当然远不止这些,它还包括了求指数、对数、三角函数、随机数等方法.具体可以参考相关Math类的方法手册.
2.字符
字符是指用单引号引起来的单个字母.和C语言一样,JAVA也是用char来表示字符的,不同的是JAVA的一个char占16位
大小的空间(2个字节).
2-1.和上述的数字类相似,JAVA平台对字符处理也有"包装(wrapper)器"类--Character类.也就是说,我们既可以用char去定义
一个字符变量,也可以用Character定义一个字符对象.例如:
Character ch_sex = new Character ('男');
[注:]Charater类是不可变的,所以一旦一个Charater对象被创建,它就不能被改变.
3.字符串类
JAVA平台中,字符串类(String)作为对象来存储.
3-1.定义一个字符串对象:
String 字符串变量名称;
例如,定义一个保存学生姓名的字符串变量如下:
String studentName;
3-2.字符串对象的初始化:
JAVA平台对字符串对象的初始化有三种方式:
3-2-1.使用new运算符,如:
String studentName = new String("张小明");
3-2-2.直接赋初值,如:
String studentName = "张小明";
3-2-3.初始化为null,如:
String studentName = null;
studentName = "张小明";
3-3.字符串对象的方法
当我们定义一个字符串对象时,JAVA平台为我们准备了很多对这个对象操作的方法.比如:
3-3-1.求字符串的长度:length()
String hello = "hello,my name is Jack!";
int len = hello.length();
3-3-2.连接字符串:concat()
String string1 = "hello,";
String string2 = "I am Seven;
String string3 = string1.concat(string2);
当然,实现字符串的连接还可以用符号"+"拼接起来.如:
System.out.println(string1 + string2);
用"+"拼接字符串时,如果存在各种数据类型的运算,按照从左到右进行运算.JAVA会根据"+"运算符
两边的操作数类型来决定进行算术运算还是字符串连接的运算.对比下面的例子:
System.out.println(100 + 32.5 + "RMB"); //算术运算优先
输出:132.5RMB
System.out.println("RMB" + 100 + 32.5); //字符串运算优先
输出:RMB10032.5
3-4.字符串与字符数组转换
字符数组转换为字符串:
char[ ] helloArray = {'h','e','l','l','o','.'};
String helloString = new String(helloArray);
System.out.println(helloString);
字符串转换为字符数组:
String helloString = "hello!";
char[ ] helloArray = helloString.toCharArray();
示例一:toCharArray方法
public class StringToCharDemo{ public static void main(String[ ] args){ String helloString = "hello!"; //声明一个字符串变量并赋初值 char[ ] helloArray = helloString.toCharArray( );//将字符串转换为字符数组 for(int i=0;i<helloArray.length;i++){ //循环遍历字符数组,并输出数组当中每一个字符元素 System.out.println(helloArray[i]); } } }
示例二:
// 统计一行字符中字母、数字以及其它字符的个数 public class CountCharDemo{ public static void main(String[ ] args){ String string1 = "hello,my name is Jack,I am 18 years!"; int count1 = 0,count2 = 0,count3 = 0; //分别用来存放字母、数字和其它字符的个数 char[ ] charArray = string1.toCharArray( ); //将字符串变量转换为字符数组 for(int i=0;i< charArray.length;i++){ //遍历字符数组 //判断字符数组中每一个字符元素的类型 if(charArray[i]<='z' && charArray[i]>='a' || charArray[i]<='Z' && charArray[i]>='A') count1++; //如果是字母字符,count1增1 else if(charArray[i]<='9' && charArray[i]>='0') //如果是数字字符 count2++; //计数变量count2增1 else //如果既不是字母又不是数字 count3++; //计数变量count3增1 } System.out.println("含有字母数量:" + count1); //输出字母字符的个数 System.out.println("含有数字数量:" + count2); //输出数字字符的个数 System.out.println("含有其它字符数量:" + count3); //输出其它字符的个数 } }
3-5.在一个字符串中操作字符
3-5-1.获取指定位置的字符:
String string1 = "Java programming!";
char aChar = string1.charAt(7);
3-5-2.获取指定位置起连续的几个字符:
String string1 = "Java programming!";
char aChar = string1.substring(8.12);
示例一:originalString.split()方法
public class StringMethods{ public static void main(String[ ] args){ String originalString = "hello,my name is Jack,I am 18 years!"; System.out.println("原始字符串为:\"" + originalString + "\""); String[ ] splitedString = originalString.split(","); //使用逗号分隔符拆分字符串 System.out.print("按逗号(,)分隔以后的字符串数组元素为:"); for(int i=0;i<splitedString.length;i++){ //循环输出拆分后的字符串中的元素 System.out.print("[" + splitedString[i] + "]"); } System.out.println(); splitedString = originalString.split("m"); //使用字符’m’拆分字符串 System.out.print("按字母'm'分隔以后的字符串数组元素为:"); for(int i=0;i<splitedString.length;i++){ //循环输出拆分后的字符串中的元素 System.out.print("[" + splitedString[i] + "]"); } System.out.println(); System.out.print("原始字符串从第2个到第5个的字符序列为:"); System.out.println("\"" + originalString.subSequence(2,6) + "\"");//输出子字符串 System.out.print("原始字符串转换为大写字母以后:"); System.out.println("\"" + originalString.toUpperCase() + "\""); //将原字符串全部转换为大写 System.out.print("原始字符串转换为小写字母以后:"); System.out.println("\"" + originalString.toLowerCase() + "\""); //将原字符串全部转换为小写 } }
JAVA平台为字符串对象提供了很多操作方法.如分隔字符串、清除字符空格、查找子字符串、替换子字符串、
比较子字符串等.详细可参考相关手册.
4.StringBuilder类
StringBuilder类可以实现字符串内容和容量的动态修改.
4-1.StringBuilder类和String类的区别:
1).本质特性:
String对象长度固定、内容不可修改;
StringBuilder对象可以实现字符串内容和容量的动态修改.
2).内存开销:
String是不可变对象,每次对String类型改变的时候都相当于生成一个新的String对象,然后将指针指向新对象;
StringBuilder是可变的,每次对其修改都是操作其本身.
小结:
一般情况下推荐使用StringBuilder类型,尤其字符串对象频繁改动的情况下,这样可以使代码执行效率大大提高.
4-2.StringBuilder类常用的操作方法:
append():追加字符;
toString():把StringBuilder类型转换为String类型;
相关方法参考API手册.下面给出两个示例:
示例一:
public class StringDemo { public static void main(String[] args) { String palindrome = "香莲碧水动风凉 水动风凉夏日长"; int len = palindrome.length(); //获得字符串对象的长度 char[] tempCharArray = new char[len]; //创建字符数组 char[] charArray = new char[len]; //创建字符数组 //将原始字符串中的字符放到字符数组中 for (int i = 0; i < len; i++) { tempCharArray[i] = palindrome.charAt(i); } // 反转字符数组中的字符 for (int j = 0; j < len; j++) { charArray[j] = tempCharArray[len - 1 - j]; } String reversePalindrome = new String(charArray); //使用反转后的字符数组创建新的字符串 System.out.println(palindrome); System.out.println(reversePalindrome); } }
示例二:
public class StringBuilderDemo { public static void main(String[] args) { String palindrome = "香莲碧水动风凉 水动风凉夏日长"; StringBuilder sb = new StringBuilder(palindrome); //创建StringBuilder对象 sb.reverse(); //翻转字符串 System.out.println(palindrome); System.out.println(sb); } }