字符串类:
查找子串在字符串中出现的位置,或从头开始查找,或从某个位置开始。
一个重要的方法:
判断字符串是否为空,即长度是否为0,即是否为空字符串:
空字符串的几种方式:(Test02.java)
1、 String str=””;
2、 String str = new String();
空串与null的区别:
如果一个字符串的内容为空,它同样可以进行字符串所能进行的任何操作,即类中的所有方法都可以调用;
但如果一个字符串初始化为null,则它不能调用类中的任何方法,即没有任何实际作用;
String s1 = null; System.out.println(s1.length()); |
如果一个引用为null,则调用方法时会出现“空指针异常”。
如果这么定义了,它只能直接输出,输出为null;
因此,如果一个字符串类型的变量作为方法参数,通常情况下需要讨论这个形参是否为null值。当两个字符串进行比较时(比较是否相等或大小),要让非null字符串在前。
字符串替换功能:
重要的获取子串的方法:
字符串的剪切方法:
去除内容两端的空白:空格,制表符,换行符
在字符串类中,有一个将对象转换为字符串的静态方法valueOf();
使用此方法得到字符串的优势在无论对象是什么值,哪怕是null,照常能得到字符串;
Object obj = null; String str = String.valueOf(obj); System.out.println(str); |
同样在转换对象到字符串时,可以使用toString(),但要求对象为非null。
课下练习1:
有一种机器配件进行编号,以KH-开头,从0000001-9999999,将所有编号进行显示。
课下练习2:
找规律,定义一个方法,能够生成这样的随机字符串;
能够修改的字符串类:StringBuffer
需要掌握这个类的
append()方法
length()方法
一个剪切内存的方法:
字符串的反转方法:
课下练习3:
如果一个正整数,正着读和倒着读大小相同,如101,12021等,这样的数称为“回文数”,如果这个回文数同时又是素数,称为“回文式素数”,要求显示1000000以内的回文式素数。
StringBuffer类的应用场合:
当需要字符串进行不断连接操作时,如果使用String类,则会生成大量中间字符串,多数都会被丢弃,变为不可访问的垃圾,当连接较多的数据时,会极大影响效率;
因为StringBuffer是线程安全的,而且可变,如果是连接大量数据,或者对字符串进行修改时,这种场合用它比较方便;
两者的联系:当连接或修改完毕,可以直接调用toString()生成一个String对象;
StringBuilder类的应用场合:
因为该类不是线程安全的,从理论上来说,在连接或修改的效率上会低于StringBuffer,经过简单测试,效率提高也不明显。
如果某个操作需要连接或修改,那么两种字符串如何选择?
如果是局部的操作,使用不是线程安全的StringBuilder类;
如果是变量做为类字段,则使用线程安全的StringBuffer类;
思考题:罗列出你所知道的所有的final类?
String,StringBuffer,StringBuilder,Math,System,Scanner…
在Java中编写代码,如果某个文件中,需要引用其他包中的文件,要使用import关键字将其他包中的类导入到当前包的当前文件中来,才能使用(当然是在访问级别允许的情况下),为了操作的方便,JVM预先将java.lang包中的所有类都会自动导入进来。
除了java.lang包外,编程中使用其他包中的类时,必须要显式导入。
这里说的java.lang包,编程时会隐式导入所有的类,但不包括子包中的类;
java.lang包中某些类中方法的静态导入;//完全没有意义啊
在Java中数据的输入和输出,都是通过标准类库中的类来实现的;
控制台输入: Scanner scanf()
窗体输入:
例程:例子程序
文本扫描类:java.util.Scanner
从控制台输入数据的方法:
输入字符串:
输入整数:
一个综合点的读取例程:从控制台上输入一个学生的信息,id,name,age
Scanner sc = new Scanner(System.in); System.out.print("Input your id: "); int id = sc.nextInt(); sc.nextLine(); // 用来接受回车键转换为的编码值为0的字符 System.out.print("Input your name: "); String name = sc.nextLine(); System.out.print("Input your sex: "); String sex = sc.nextLine(); System.out.print("Input your age: "); int age = sc.nextInt(); String msg = String.format("[%s,%s,%s,%s]", id, name, sex, age); System.out.println(msg); sc.close(); // 手动释放非堆区和非栈区资源 |
包装类:
Java和C#称为“完全面向对象的编程语言”;
是否是“真正意义上的完全”?语法只支持对象,没有内置类型存在!
因为在java和C#中,都仍然支持内置基本类型的编程,如Java中有8种基本类型,在C#中,有十几种基本类型;从这个要求上来说,两者都不是完全面向对象;
符合这项要求的编程语言:smalltalk
这种语言没有大量用于开发中,一个问题就是“效率”问题。
为了解决在程序开发时,使用内置类型数据的效率问题,Java和C#对于语言本身内置类型的设计采用了不同的方法。
对于java来说,
对于内置类型,它是完全支持的;
但为了达到“面向对象编程”的要求,将每种内置类型,作为其基类型进行了包装,一个基本类型对应一个类,这样的类称为“包装类”。
byte -> Byte
char -> Character
boolean -> Boolean
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double
分析Integer这个具有代表性的包装类:
静态信息:
System.out.println("max: " + Integer.MAX_VALUE); System.out.println("min: " + Integer.MIN_VALUE); System.out.println("size: " + Integer.SIZE); System.out.println("type: " + Integer.TYPE); |
构造器new Integer(int);以整数为参数,构造一个对象;
调用对象的intValue(),可将对象转换为整数;
Integer类中最重要的方法:将整型字符串 =》为整数;
int balance = 5000; System.out.println("取款前的余额:" + balance); Scanner sc = new Scanner(System.in); System.out.print("输入取款数目:"); String moneyString = sc.nextLine(); System.out.println("你要取" + moneyString + "元!"); int money = Integer.parseInt(moneyString); balance -= money; sc.close(); System.out.println("取款后的余额:" + balance); |
将整数转换为2进制、8进制和16进制的方法:
int number = 100; System.out.println("2进制:" + Integer.toBinaryString(number)); System.out.println("8进制:" + Integer.toOctalString(number)); System.out.println("10进制:" + number); System.out.println("16进制:" + Integer.toHexString(number)); System.out.println(); number = -number; System.out.println("2进制:" + Integer.toBinaryString(number)); System.out.println("8进制:" + Integer.toOctalString(number)); System.out.println("10进制:" + number); System.out.println("16进制:" + Integer.toHexString(number)); |
课下练习4:
从5到1050,使用包装类Integer的toBinaryString()方法,转换为二进制表示,要求每个数都保证32位;
Integer类中带参数的toString()为方法:
上述的操作都是基于jdk4.0的基础上进行操作,5.0版本之后,对于包装类提供更加方便的操作,“自动装箱”和“自动拆箱”的功能。
课下练习5:
将包装类Byte,Short,Long的四个静态属性,进行查询。
要注意到每个类都有parseType(String)的方法;
课下练习6:
预习实数的两个包装类Float和Double,注意它们的众多静态字段,这两个类中提供了计算单精度和双精度数据在内存中的存储形式。