------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
5.1 API
5.1.1 什么是API?
API全名:application(应用) programming(程序) interface(接口)
API是应用程序编程接口
如果我们想实现一个机器人的功能,有的时候不需要我们自己造一个机器人,我们可以从生产机器人的厂家购买一个,这时我们只需要学会如何操作这个机器人就可以了。
机器人厂商将机器人具体的实现隐藏起来,对外提供操作机器人的按钮,或者遥控器,这些控制机器人向前向后的按钮就是我们说的API
5.1.2 Java API
Java API就是sun公司提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。
我们可以通过查帮助文档来了解Java提供的API如何使用
5.1.3 Java中的常用API
1. String类
对字符串进行操作通常我们使用String类,相关的还有StringBuffer和StringBuilder
2. 集合类
集合是一种容器,用来存取对象(Collection、Map)
3. 包装类
Java定义了一组包装类对基本数据类型进行了包装(Integer、Double、Boolean)
4. 时间对象
Java定义了一些类方便用户对时间、日期进行处理(Date、Calendar)
5. 系统类
Java定义了一些类针对系统进行操作(System、Runtime)
6. IO流
Java定义了一些类对数据传输进行了封装(输入输出流、File文件对象)
7. Socket
Java定义了一些类方便用户进行网络编程(Socket、DatagramSocket)
5.2 String 类 – 不可修改
String类是一个不可变类。
字符串是一个特殊的对象,字符串一旦初始化就不可以被改变。
5.2.1 String类面试题
1.判断定义为String类型的s1和s2是否相等
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
//true 先去常量池里找有没有abc这个对象,如果没有,就创建一个,如果有,就不创建了
System.out.pritnln(s1.equals(s2));
//true 因为String重写了Object里的equals方法,比较是对象的内容,只要他们内容一模一样就为true
2.下面这句话在内存中创建了几个对象?
String s1 = new String("abc");
//单独写这句话就是创建两个对象,先在常量池里创建一个,然后将常量池副本拷贝一份给堆内存的对象里
3.判断定义为String类型的s1和s2是否相等
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2); ?
//false s1是记录的堆内存的地址值,s2记录的是常量池中的地址值
System.out.pritnln(s1.equals(s2)); ?
//true 因为String重写了Object里的equals方法,比较是对象的内容,只要他们内容一模一样就为true
4.判断定义为String类型的s1和s2是否相等
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2); ?
//true 因为java编译器有常量优化机制,在编译的时候就把"a","b","c"三个常量看成了一个常量"abc"
System.out.pritnln(s1.equals(s2)); ?
//true 因为String重写了Object里的equals方法,比较是对象的内容,只要他们内容一模一样就为true
5.判断定义为String类型的s1和s2是否相等
String s1 = "ab";
String s2 = "abc";
System.out.println((s1 + "c") == s2); ?
//false 字符串与其他的类型用+相连接的时候,其实底层是调用StringBuffer的append方法,相当于在堆内存创建了一StringBuffer对象
System.out.pritnln((s1 + "c").equals(s2)); ?
//true 因为String重写了Object里的equals方法,比较是对象的内容,只要他们内容一模一样就为true
5.2.2 String类的构造函数
1.字节数组
String(byte[])
//用默认的码表编码,编码意思就是编完了我们能看懂
String(byte[], String)
//用指定的码表编码
String(byte[], int, int, String)
//根据指定索引值和长度,进行默认的码表编码
2.字符数组
String(char[])
//将字符数组转成字符串
String(char[], int, int)
//根据指定索引值和个数,进行转成字符串
5.2.3 String类的常用方法
5.2.3.1 判断
1.1 boolean equals(Object);
//String类重写了Object类中的equals方法,比较两个对象的内容,如果内容一模一样就返回true
1.2 boolean equalsIgnoreCase(string);
//比较两个对象的内容,忽略大小写
1.3 boolean contains(string);
//判断调用此方法的字符串是否包含传入的字符串,如果包含就返回true
1.4 boolean startsWith(string);
//判断调用此方法的字符串是否以传入的字符串开头
1.5 boolean endsWith(string);
//判断调用此方法的字符串是否以传入的字符串结尾
1.6 boolean isEmpty();
//判断字符串里是否有内容,依赖的字符串的长度,如果长度为零就返回true
5.2.3.2 获取
2.1 int length();
//获取字符串的长度
2.2 char charAt(index);
//通过传入的角标值获取对应的字符,如果传入的角标不存在,会抛出StringIndexOutOfBoundsException
2.3 int indexOf(int ch);
//通过传入的字符或字符对应的int值,获取对应的角标,如果传入的不存在就返回-1
int idnexOf(int ch,fromIndex);
//通过传入的字符或字符对应的int值,并指定索引的角标开始位置
2.4 int indexOf(string str);
//通过传入的字符串,返回字符串中第一个字符的角标位置
int idnexOf(string str,fromIndex);
//通过传入的字符串,指定索引的开始位置
2.5 int lastIndexOf(ch);
//通过传入的字符或字符对应的int值,从后向前遍历,找到在后面第一次出现的位置
int lastIndexOf(ch,fromIndex):
//通过传入的字符或字符对应的int值,指定从后面哪个位置开始索引
2.6 int lastIndexOf(string);
//通过传入的字符串,从后面向前遍历,找到在后面第一次出现的字符串的位置,返回
int lastIndexOf(string,fromIndex):
//通过传入的字符串,从指定位置后面向前遍历,在指定位置向前的第一个出现字符串的位置
2.7 String substring(start);
//截取子串,从传入的角标位置开始,一直到length()
String substring(start,end);
//截取子串,包含头不包含尾
5.2.3.3 转换
3.1 byte[] getBytes();
//用默认编码变解码,让计算机看懂
3.2 char[] toCharArray();
//将字符串转换成字符数组
3.3 static String copyValueOf(char[]);
//将传入的字符数组转换成字符串
static String copyValueOf(char[] data, int offset, int count);
//将传入的字符数组转换字符串,从offset开始,转换count个字符成字符串
3.4 static String valueOf(char[]);
//将传入的字符数组转换成字符串
static String valueOf(char[] data, int offset, int count);
//将传入的字符数组转换字符串,从offset开始,转换count个字符成字符串
3.5 static String valueOf(int);
//将一个int数转换成字符串
static String valueOf(double);
static String valueOf(boolean);
3.6 static String valueOf(object);
//传入一个对象,和对象调用toString方法一样和object.toString():结果是一样的。
3.7 String toLowerCase():
//将字符串转换成小写
String toUpperCase():
//将字符串转换成大写
3.8 "abc".concat("kk");
//将传入的字符串和调用的字符相连接,和+的结果一样,但是比+速度快
5.2.3.4 替换
4.1 String replace(oldChar,newChar);
// 替换,新的字符替换已有字符,如果oldChar不存在,返回原来的那个字符串
4.2 String replace(string,string);
//新的字符串替换已有的字符串,如果oldString不存在,返回原来的那个字符串
5.2.3.5 切割
String[] split(regex);
例:
String s = "金三胖 郭美美 李天一";
String[] arr = s.split(" ");
// 通过regex(正则表达是)切割,切割后生成字符串
5.2.3.6 去除字符串两空格
String trim();
// 去除字符串前导和尾部空格
//注意转义
5.2.3.7 比较
String str = "ab";
String str1 = "bc";
int num = str.compareTo(str1);
//-1, 记忆为:首个不同,前面的减后面的。
//按照字典顺序(按照码表对应值比较),如果前面的是大的,返回正数(前面对应的码表值减去后面对应的码表值)
//如果后面的是大的,返回负数(前面对应的码表值减去后面对应的码表值)
//如果前后相等,返回零。
//前面是一个字母,后面是3个和前面一样的字母,那么返回负数,是前面的长度减去后面的长度。
5.3 StringBuffer 类 – 可修改 – 线程安全
5.3.1 概述
1. 字符串的组成原理就是通过该类实现的。
2. StringBuffer:可以对字符串内容进行增删。
3. StringBuffer:字符串缓冲区,用于存储数据,所以它也称之为容器.
4. 很多方法与String相同。
5. StingBuffer是可变长度的。
5.3.2 缓冲区
1. 可以添加基本数据和引用数据。添加数据完毕,其实底层都是将其转成字符串进行使用。通过toString方法转成字符串。
2. 该容器和数组不一样,数组是固定长度的,而且只能添加同一类型。而StringBuffer长度是可变的,可以添加不同类型。类型一致的数据,可以使用数组,也可以StringBuffer。
但是数组添加元素,可以保证数据的类型不变。而StringBuffer添加完数据,全变成字符串。
3. StringBuffer可以对字符串进行修改,而String不行。
5.3.3 StringBuffer 特有方法
1. 添加
1.1 StringBuffer append(int x);
//创建一个StringBuffer容器,向里面添加元素,如果里面没有直接添加,如果里面有,在已有的元素尾部添加。
1.2 StringBuffer insert(int index,String str);
//在制定的角标位置添加。
注意:
StringBuffer append(int x);可以将基本数据类型和引用类型数据添加到缓冲区,将数据添加到缓冲区的末尾,数据追加,其实底层是把所有的数据类型转换成了字符存储到缓冲区
没有添加short,byte,的方法也就是说如果你添加的是byte或short会自动提升为int
这个方法返回的还是原来的缓冲区对象,举例调制鸡尾酒
2. 删除
2.1 StringBuffer delete(int start, int end);
//包含头,不包含尾。
2.2 StringBuffer delete(0,sb.length);
// 清空缓冲区
2.3 StringBuffer deleteCharAt(int index);
//根据指定的角标删除对应的字符
3. 修改
3.1 StringBuffer replace(int start,int end,string);
//替换,指定要被替换的头角标和尾角标,(包含头,不包含尾),用传入的字符串替换。
3.2 void setCharAt(int index ,char);
//修改指定角标位置的字符
3.3 StringBuffer reverse();
//将缓冲区的字符反转
3.4 void setLength(int len);
//设置缓冲区的长度,也可以理解为截取
4. 查找
4.1 int indexOf(str);
//根据传入的字符串查从前面找,如果找到则返回字符串中第一个字符的角标位置,如果找不到则返回-1.
4.2 int lastIndexOf(str);
//根据传入的字符串查从后面找,如果找到则返回字符串中第一个字符的角标位置,如果找不到则返回-1.
5.3.4 String、StringBuffer、StringBuilder
1. 对于String来说,相对于其他两者来说是慢很多的,并且产生比较多的垃圾,这是很多好的程序都不想得到的结果。因为产生垃圾之后,GC会在一定的条件情况下出来进行垃圾清理,从而拖慢速度。
2. StringBuffer 字符串变量(线程安全)
3. StringBuilder 字符串变量(非线程安全)jdk1.5的新特性
在开发中建议使用StringBuilder,因为没有加同步,所以运算速度较快。