1. API文档
1.1. JDK API
1.1.1. 什么是 JDK API
API文档是我们用来了解JDK中提供的类库,我们可以先通过索引输入并找到我们需要了解的类,而后我们就可以方便的了解该类的作用,常量的作用,以及该类提供的所有方法的作用,以及方法的参数及返回值的含义。
1.1.2. JDK包结构
JDK包是由sun开发的一组已经实现的类库,里面有非常丰富的功能类。可以为我们的开发提供各种支持。
JDK根据提供的功能不同,将类库划分为若干个包,比如用于操作输入输出的java.io包,java程序语言设计基础类的java.lang包,提供各种数学运算的java.math包,基于网络应用的java.net包,以及一些共用程序类所在的java.util包等等。
1.2. 文档注释规范
1.2.1. 文档注释
通过注释提高Java源程序代码的可读性;使得Java程序条理清晰,易于区分代码行与注释行。另外通常在程序开头加入作者,时间,版本,要实现的功能等内容注释,方便后来的维护以及程序员的交流。
1.2.2. 文档注释规范
常用的文档注释规范有:
1、@author
用来标注该类的作者信息,例如:
- /**
- * 这个是一个类
- * @author Xiloer
- *
- */
2、@deprecated
用来标注一个类、方法、变量已过时,不再建议使用。
- /**
- * 这是一个普通方法,该方法具有设计缺陷,不建议再使用。
- * @deprecated
- */
- public String sayHello(String name){
- return null;
- }
3、@since
用来标注从哪个版本开始启用,例如:
- /**
- * 这是一个普通方法
- * @since 1.5.1
- */
4、@param
用来标注方法的参数说明,例如:
- /**
- * 这是一个普通方法
- * @param name 该参数用来设置当前用户的名字
- */
- public void setName(String name){
- .....
- }
5、@return
用来标注方法的返回值说明,例如:
- /**
- * 获取当前用户的用户名
- * @return 当前用户的用户名
- */
- public String getName(){....}
1.2.3. javadoc命令生成文档
通过使用javadoc命令,可以将已经编写好的带有文档注释的类,或某个包下的所有类对应的生成一个API文档
2. 字符串基本操作
2.1. String及其常见API
2.1.1. String是不可变对象
由于字符串在实际开发中被广泛使用,那么在频繁使用某个字符串时,会出现频繁创建一个字符串对象的现象,java为此对字符串的使用采用了一个优化措施,使得String对象为不可变对象,一旦在内存中创建,内容不能发生变化,若要对字符串内容改变,那么就会创建新对象。这样做的目的是可以最大程度的重用相同内容的字符串以减小系统资源的开销。那么字符串对象是如何做到重用的?我们通过2.1.2来了解
2.1.2. String常量池
上一节我们已经知道,JVM对字符串有一个限制,让字符串作为不变对象,这样就可以做到重用。事实上,当我们通过字面量,常量来初始化一个字符串时,JVM首先会从字符串的常量池(一个JVM内部维护的内存区域,用来保存已经创建过的字符串对象)中查询用来保存该字符串的对象是否存在,若存在则直接引用,若不存在则创建该字符串对象并存入常量池,然后引用它。因为字符串内容不能改变,所以我们可以放心的重用他们。
2.1.3. 内存编码及长度
java存储每一个字符均使用2个字节保存,使用的是Unicode编码。并且任何一个字符(无论是英文还是汉字)每个字符的长度都是1。所以字符串的长度就是该字符串所有的字符个数。
int length():返回当前字符串的长度。
例如:
- String str = "HelloWorld";
- System.out.println(str.length());//10
2.1.4. 使用indexOf实现检索
int indexOf(int ch):用来检查给定的一个字符在当前字符串中第一次出现的下标位置。这里的下标和数组的下标意思相近,0表示该字符串的第1个字符,以此类推。当该字符串中并不包含给定的字符时,那么该方法返回-1。
例如:
- String str = "HelloWorld";
- System.out.println(str.indexOf('W'));//5
- System.out.println(str.indexOf('h'))//-1
2.1.5. 使用substring获取子串
String substring(int begin,int end):用来截取当前字符串的部分内容以获取这个子字符串。我们只需要传入两个整数,一个用来表示从哪里开始,另一个用来表示截取到哪里。这里的位置要使用字符串的下标来表示,并且要注意,这两个数字表示的范围是“含头不含尾的”,换句话说就是包含开始下标的字符,但是不包含结束下标的字符。
例如:
- String str = "HelloWorld";
- String subStr = str.substring(0,5);
- System.out.println(subStr)//Hello
2.1.6. trim
String trim():将字符串两边的空白(空白有很多种,空格是其中之一)去除掉,并将去除后的新字符串返回给我们。
例如:
- String str =" Hello World ";
- String trim = str.trim();
- System.out.println(trim);// Hello World
2.1.7. charAt
char charAt(int index):用于给定一个下标位置,来获取该字符串中这个位置的字符。
例如:
- String str = "HelloWorld";
- char chr = str.charAt(5);
- System.out.println(chr);//W
2.1.8. startsWith和endsWith
boolean startsWith(String suffix):用来判断当前字符串是否是以给定的字符串开始的。这里要注意大小写是敏感的。
boolean endsWith(String suffix):用来判断当前字符串是否是以给定的字符串结尾的。
例如我们可以使用endsWith()就可以根据一个文件的名字来判断它是否是以".jpg",".gif"等字符串结尾来得知该文件是否为图片。
例如:
- String str = "java.jpg";
- if(str.endsWith(".jpg")){
- System.out.println("是一张图片");
- }else{
- System.out.println("不是一张图片");
- }
2.1.9. 大小写变换
String toUpperCase():用来将当前字符串中的英文部分的字符全部变为大写后再将新的字符串返回
String toLowerCase():用来将当前字符串中的英文部分的字符全部变为小写后再将新的字符串返回
例如,我们上网时常会要求我们输入验证码,图片中的英文可能是大写的,但我们输入时并不需要严格按照大小写输入却依旧可以验证成功。这就得力于该方法。我们可以将输入的验证码全部转换为大写,在将图片中显示的内容也全部转换为大写后再比较即可。
例如:
- String str = "HelloWorld";
- String lower = str.toLowerCase();
- String upper = str.toUpperCase();
- System.out.println("lower:"+lower);//helloworld
- System.out.println("upper:"+upper);//HELLOWORLD
2.1.10. valueOf
字符串提供了很多重载的valueOf()方法,可以将其他基本类型的值以字符串的形式描述。
- static String valueOf(int i): 返回 int 参数的字符串表示形式
- static String valueOf(boolean b): 返回 boolean 参数的字符串表示形式
- static String valueOf(char c): 返回 char 参数的字符串表示形式
- static String valueOf(double d): 返回 double 参数的字符串表示形式
- static String valueOf(char[] c): 返回 char 数组参数的字符串表示形式
- static String valueOf(char[] c,int offset,int count): 返回 char 数组参数的特定子数组的字符串表示形式。
- static String valueOf(float): 返回 float 参数的字符串表示形式
- static String valueOf(long l): 返回 long 参数的字符串表示形式
- static String valueOf(Object o): 返回 Object 参数的字符串表示形式
例如:
- double pi = 3.1415926;
- int value = 123;
- boolean flag = true;
- char[] charArr = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' };
- String str = String.valueOf(pi);
- System.out.println(str);
- str = String.valueOf(value);
- System.out.println(str);
- str = String.valueOf(flag);
- System.out.println(str);
- str = String.valueOf(charArr);
- System.out.println(str);
2.2. StringBuilder及其常用API
2.2.1. StringBuilder封装可变字符串
String类我们已经得知,它是不变对象,那么每当对内容修改时都会引发新对象的创建。那么当我们有一个需求是需要频繁修改字符串时,这样不仅不能减少内存的开销,反而会增加内存的开销。为此java为我们提供了一个专门用于修改字符串内容的类:StringBuilder.
该类封装了可变的字符串,换句话说,当我们需要改变字符串内容时,并不会创建新对象,而是在原对象基础上进行修改。从而减小了内存的开销。
2.2.2. StringBuilder常用方法
StringBuilder类的常用方法有:
- append(String str):追加字符串;
- insert (int dstOffset,String s):插入字符串;
- delete(int start,int end):删除字符串;
- replace(int start,int end,String str): 替换字符串;
- reverse():字符串反转。
2.2.3. StringBuilder
StringBuilder的很多方法的返回值均为StringBuilder类型。这些方法的返回语句均为:return this。
由于改变封装的字符序列后又返回了该对象的引用。可以按照如下简洁的方式书写代码:
- buf.append("ibm").append("java").insert(3, "oracle").replace(9, 13, "JAVA");
- System.out.println(buf.toString());
2.2.4. 使用append实现追加
StringBuilder append(String):用于将给定的字符串追加到当前字符串末尾。
例如:
- StringBuilder builder = new StringBuilder("Hello");
- builder.append("World");
- System.out.println(builder);//HelloWorld
2.2.5. 使用insert实现插入
StringBuilder insert(int offset, String str):用于将给定的字符串插入到指定的位置。这个位置也是字符串的下标。
例如:
- StringBuilder builder = new StringBuilder("HelloWorld");
- builder.insert(5,"!");
- System.out.println(builder);//Hello!World
2.2.6. 使用delete实现删除
StringBuilder delete(int start,int end):用于删除给定字符串中的部分内容。需要传入两个参数,描述要删除的字符串的范围,同样这个范围是"含头不含尾的"
例如:
- StringBuilder builder = new StringBuilder("HelloWorld");
- builder.delete(0,5);
- System.out.println(builder);// World
2.2.7. StringBuilder 总结
StringBuilder是可变字符串。字符串的内容计算,建议采用StringBuilder实现,这样性能会好一些。
java的字符串连接的过程是利用StringBuilder实现的,代码如下所示:
- String s = "AB"; String s1 = s + "DE"+1;
- String s1 =
- new StringBuilder(s).append("DE").append(1).toString();
StringBuffer 和StringBuilder的区别:
- StringBuffer是线程安全的,同步处理的,性能稍慢;
- StringBuilder是非线程安全的,并发处理的,性能稍快。