一、JDK API
什么是 JDK API
JDk中包含了大量的API类库,所谓API(Aplication Programming Interface,应用程序编程接口)就是一些已经写好的、可供直接调用的功能(在Java语言中,这些功能以类的形式封装)。
JDK API包含的类库功能强大,经常使用的有:字符串操作、集合操作、文件操作、输入输出操作、网络操作、多线程等等。
JDK 包结构
为了便于使用和维护,JDK类库按照包结构划分,不同的功能划分在不同的包中;
经常使用的包:
二、文档注释
以/开始,以/结束;
加在类和方法的开头,用于说明作者,时间,版本,要实现功能的详细描述等信息;
通过Javadoc工具,可以轻松将此注释转换为HTML文档说明;学习者和程序员主要通过文档了解API的功能;
文档注释不同于普通的注释(// / */ ),其用于程序员进行代码维护和和交流;
package apidoc;
/**
* 文档注释是功能性注释,只用在三个地方使用:类、方法、常量
* 文档注释在类使用时,说明当前类的功能
* @author 毛
*@version 1.0
*@see java.lang.String
*@since JDK 8.0
*/
public class DocDemo {
/**
* sayHello方法中的问候语
*/
public static final String INFO="你好!";
/**
* 对给定用户添加问候语
* @param name 给定的用户名
* @return 含有问候语的字符串
*/
public String sayHello(String name){
return "hay!"+name;
}
}
三、String
3.1 String是不可变对象
java.lang.String使用了final修饰,不能被继承。
字符串底层封装了字符数组以及针对字符数组的操作算法;
字符串一旦创立,对象永远无法改变,但字符串引用可以重新赋值;
Java字符串中任何一个字符对应16位(两个字节)的定长Unicode编码。
3.2 String 常量池
Java为了提高性能,静态字符串(字面量/常量/常量连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符;
对应重复出现的字符串直接量,JVM会首先在常量池中查找,如果存在立刻返回该对象。
package string;
/**
* String常量池,是JVM在堆中开辟的一块空间,用于缓存所有通过字面量
* 形式创建的字符串对象,那么当我们在使用已缓存的字面量创建字符串对象时
* 就会重用该对象,这样可以减少内存开销。
* @author 毛
*
*/
public class StringDemo {
public static void main(String[] args) {
String s1="123abc";
String s2="123abc";//s2重用了s1创建的对象
//s1和s2都是引用类型变量,保存的是对象地址,如果相同则说明指向同一对象
System.out.println("s1==s2:"+(s1==s2));//true
String s3 = "123abc";
System.out.println("s2==s3"+(s2==s3));//ture
//new 关键字创建时一定产生新的对象,Java不推荐这种形式创建字符串
String s4=new String("123abc");
System.out.println("s4:"+s4);
//new出来的字符串不会重用对象
System.out.println("s2==s4:"+(s2==s4));//false
/*
* String 是不变对象,即:
* String对象创建后内容不变,若改变内容则一定创建新对象
*/
System.out.println("s1:"+s1);//123abc
s1=s1+"!";//修改内容会创建新的对象
System.out.println("s1:"+s1);//123abc!
System.out.println("s2:"+s2);//123abc
//s1已经不再与s2、s3指向同一个对象了
System.out.println("s1==s2:"+(s1==s2));//false
/*
* 触发了编译器的一个特性
* 编译器在编译期间,如果发现一个计算表达式可以在编译期间
* 判定结果时,就会进行计算,并将计算结果编译到class文件
* 编译后的class文件,下面的代码改为:
* String s5 = "123abc";
*/
String s5="123"+"abc";
System.out.println("s5:"+s5);
System.out.println("s5==s2:"+(s5==s2));//true
String s="123";
String s6=s+"abc";
System.out.println("s6:"+s6);
System.out.println("s6==s2:"+(s6==s2));//false
}
}
3.3 内存编码以及长度
String在内存中采用Unicode编码,每个字符16位占用两个字节;任何一个字符(无论中文还是英文)都算1个char字符长度,占用两个字节
package string;
/**
* int length()
* 该方法可以返回当前字符串的长度(字符个数)
* @author 毛
*
*/
public class LengthDemo {
public static void main(String[] args){
String str = "I LOVE java";
int length = str.length();
System.out.println("len:"+length);
}
}
3.4 indexOf方法
indexOf方法用于实现在字符串中索引另外一个字符串
String提供了几个重载的indexOf方法
package string;
/**int indexof(String str)
* 检束给定的字符串在当前字符串中的位置,如果当前字符串不包含给定内容时
* 返回值为-1,如包含时返回位置下标
* @author 毛
*
*/
public class IndexofDemo {
public static void main(String[] args) {
// 01234567 89 1234
String str="thinking in java";//java编程思想
int index = str.indexOf("in");
System.out.println(index);//2(下标从零开始)
index = str.indexOf("IN");
System.out.println(index);//-1
/*
* 重载方法,允许从指定位置开始检索
*/
index=str.indexOf("in",3);
System.out.println(index);
/*
* lastIndexOf方法可以检索最后一个出现的位置
*/
index=str.lastIndexOf("in");
System.out.println(index);
}
}
3.5 substring方法
substring方法用于返回一个字符串的子字符串。
substring通常重载方法定义如下:
package string;
/**
* String substring(int start,int end)
* 截取当前字符串中指定范围内的字符串
* start是起始位置的下标,end是结束位置的下标(不包含该位置的字符)
* 注释:
* 通常在API中,用两个数字表示范围时,都是“含头不含尾”的;
* @author 毛
*
*/
public class SubstringDemo {
public static void main(String[] args) {
// 01234567891
String str = "www.tefu.cn";
//截取域名
String sub = str.substring(4,8);
System.out.println(sub);
//重载的substring方法是从指定位置取到末尾
sub = str.substring(4);
System.out.println(sub);
}
}
3.6 trim 方法
去掉一个字符串的前导和后继空字符
package string;
/**
* String trim()
* 取出当前字符串两边的空白字符
* @author 毛
*
*/
public class TrimDemo {
public static void main(String[] args) {
//左侧为三个空格,右侧为三个缩进字符tab
String str = " h e l l o " ;
System.out.println(str);
String trim=str.trim();//将去除后的字符串返回
System.out.println(trim);
System.out.println(str);//源字符串不受影响
}
}
3.7 charAt()方法
package string;
/**
* char charAt(int index)
* 获取当前字符串中指定位置上的字符
* @author 毛
*
*/
public class CharAtDemo {
public static void main(String[] args) {
// 0123456789012345
String str = "thinking in java";
//获取当前字符串中的第10个字符
char c = str.charAt(5);
char v = str.charAt(10);
System.out.println(c+","+v);
//遍历输出每一个字符
for(int i = 0;i<str.length();i++){
c=str.charAt(i);
System.out.println(c);
}
}
}
3.8 startsWith和endsWith 方法
检测一个字符串是否以指定字符串开头或结尾
package string;
/**
* boolean startsWith(String str)
* boolean endsWith(String str)
* 判断当前字符串是否是以给定的字符串开始或者结尾的
* @author 毛
*
*/
public class StartsWithDemo {
public static void main(String[] args) {
String str = "tinking in java";
boolean starts = str.startsWith("thi");
System.out.println("startsWith:"+starts);
boolean ends = str.endsWith("va");
boolean ends1 = str.endsWith("av");
System.out.println("endsWith:"+ends+";"+"ends1With:"+ends1);
}
}
练习
package string;
/**
* 实现截取域名的方法
* @author 毛
*
*/
public class Text01 {
public static void main(String[] args) {
String name1=getHoseName("http://www.baidu.com");
System.out.println("name1:"+name1);
String name2=getHoseName("www.tedu.com");
System.out.println("name2:"+name2);
String name3=getHoseName("doc.canglaoshi.com.cn");
System.out.println("name3:"+name3);
/**
* 根据给定的网站,返回其中的域名
* @param location 例如:http://www.tedu.cn
* @return 返回的就是location中的域名“tedu”
*/
}
public static String getHoseName(String location){
int index = location.indexOf(".");
int index1 = location.indexOf(".",index+1);
String str = location.substring(index+1, index1);
return str;
}
}
package string;
public class Text02 {
public static void main(String[] args) {
/*
* 检查一个字符串是否为回文?
* 回文:正反读都是一句话
*/
String str = "上海自来水来自海上";
for(int i=0;i<str.length()/2;i++){
if(str.charAt(i)!=str.charAt(str.length()-1-i)){
System.out.println("不");
break ;
}
}
System.out.println("是回文");
//无法直接判断两数组相等
//System.out.println(judge(str));
}
/*public static String judge(String sentence){
char[]str1=new char[sentence.length()];
char[]str2=new char[sentence.length()];
for(int i = 0;i<sentence.length()/2;i++){
char a =sentence.charAt(i);
char b =sentence.charAt(sentence.length()-i-1);
str1[i]=a;
str2[i]=b;
}
System.out.println(str1);
System.out.println(str2);
if(str1==str2){
return "是回文";
}else{
return "不是回文";
}
}*/
}