API全名:Application Programming Interface,API是应用程序编程接口,指一些预先定义好的类。
例如我们想要一台电脑,并不需要自己生产每个零件,只要从各个厂商买到组装电脑的零件就可以,然后根据说明书学会使用,将零件安装在一起就得到了电脑。电脑就像是我们要的程序,而零件就是API,说明书就是帮助文档。
Java API就是Sun公司提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。
我们可以通过查帮助文档来了解Java提供的API如何使用
String类
对字符串进行操作通常我们使用String类,相关的还有StringBuffer和StringBuilder
集合类
集合是一种容器,用来存取对象(Collection、Map)
包装类
Java定义了一组包装类对基本数据类型进行了包装(Integer、Double、Boolean)
时间对象
Java定义了一些类方便用户对时间、日期进行处理(Date、Calendar)
系统类
Java定义了一些类针对系统进行操作(System、Runtime)
IO流
Java定义了一些类对数据传输进行了封装(输入输出流、File文件对象)
Socket
Java定义了一些类方便用户进行网络编程(Socket、DatagramSocket)
字符串是常量,一旦创建不能被修改。
字符串在程序中经常使用,虚拟机会将其缓存在String池中。
了解 String s = “abc” 和 String s = new String(“abc”) 的区别。
class StringDemo
{
public static void main(String[] args)
{
/*
String s1 = "abc";//s1是一个类类型变量, "abc"是一个对象。
//字符串最大特点:一旦被初始化就不可以被改变。
String s2 = new String("abc");
//s1和s2有什么区别?
//s1在内存中有一个对象。
//s2在内存中有两个对象。
System.out.println(s1==s2);
System.out.println(s1.equals(s2));//String类复写了Object类中equals方法,
//该方法用于判断字符串是否相同。
*/
String s = "abcde";
method_1(s);
}
/*
String类是对字符串事物的描述。
该类定义了专门用于操作字符串的方法。
"abc":
*/
public static void method_1(String s)
{
char ch = s.charAt(3);
System.out.println("ch="+ch);
int num = s.codePointAt(3);
System.out.println("num="+num);
String s1 = "qq";
s1 = s1.concat("mm");
System.out.println("s1="+s1);
System.out.println("qq"+"mm");
String a = "opq";
String b = "opq";
System.out.println("a==b:"+(a==b));
}
}
String(byte[] bytes)
通过指定字节数组构建字符串。
String(byte[] bytes, int offset, int length)
通过指定字节数组、数组元素偏移量和元素个数构建字符串。
String(byte[] bytes, String charsetName)
通过指定字节数组和指定码表构建字符串。
String(byte[] bytes, int offset, int length, String charsetName)
通过指定字节数组、数组元素偏移量、元素个数和指定码表构建字符串。
String(char[] value)
通过指定字符数组构建字符串。
String(char[] value, int offset, int count)
通过指定字符数组、数组元素偏移量和元素个数构建字符串。
String(StringBuffer buffer)
通过指定StringBuffer构建字符串。
String(StringBuilder builder)
通过指定StringBuffer构建字符串。
import java.io.UnsupportedEncodingException;
public class StringConstructor {
public static void main(String[] args) throws UnsupportedEncodingException {
// test1(); // alt + shift + m
// test2();
// test3();
// test4();
// test5();
// test6();
}
private static void test6() {
String s1 = "abc";
Person p1 = new Person();
String s2 = s1 + p1; // 使用字符串和一个对象相加的时候, 是和该对象的toString()返回值相加
System.out.println(s2);
}
private static void test5() {
StringBuilder sb = new StringBuilder(); // StringBuffer 线程安全, StringBuilder 速度快
sb.append("abc");
sb.append("xxx");
String s = new String(sb);
System.out.println(s);
}
private static void test4() {
String s1 = "abc中文";
char[] arr = s1.toCharArray(); // 将字符串转为字符数组
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
String s2 = new String(arr, 3, 2);
System.out.println(s2);
}
private static void test3() throws UnsupportedEncodingException {
byte[] arr = { -28, -72, -83, -26, -106, -121 };
String s = new String(arr, 3, 3, "UTF-8"); // 从字节数组中使用一部分字节转为字符串
System.out.println(s);
}
private static void test2() throws UnsupportedEncodingException {
String s1 = "中文";
byte[] arr = s1.getBytes("UTF-8"); // 使用指定码表转为byte数组
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
String s2 = new String(arr, "UTF-8"); // 使用指定码表将byte数组转为String
System.out.println(s2);
}
private static void test1() {
String s1 = "abc";
String s2 = new String("abc");
byte[] arr = s1.getBytes(); // 使用平台默认码表将字符串转为字节数组
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
String s3 = new String(arr); // 使用平台默认码表将字节数组转为字符串
System.out.println(s3);
}
}
class Person {
public String toString() {
return "重写的toString";
}
}
public class StringMethod {
public static void main(String[] args) {
// test1(); // 查找某个位置的字符
// test2(); // 查找字符所在位置
// test3(); // 字典顺序比较
// test4(); // 截取子串
// test5(); // 分割
// test6(); // 替换
// test7(); // 去掉前后空白
// test8(); // 连接
// test9(); // 包含
// test10(); // 开始和结尾
// test11(); // 长度
// test12(); // 大小写转换
// test13();
}
private static void test13() {
String s = "abc";
System.out.println(s.replace("a", "x"));
System.out.println(s.concat("def"));
System.out.println(s.substring(0, 1));
System.out.println(s); // String类的所有方法, 都不会改变原有字符串
}
private static void test12() {
System.out.println("aBc".toLowerCase());
System.out.println("aBc".toUpperCase());
}
private static void test11() {
// System.out.println("abc".isEmpty()); // JDK6
// System.out.println("".isEmpty());
System.out.println("abc".length());
System.out.println("".length());
}
private static void test10() {
System.out.println("test.java".endsWith(".java"));
System.out.println("test.java.txt".endsWith(".java"));
System.out.println("test.java".startsWith("test"));
System.out.println("test.java".startsWith("t"));
}
private static void test9() {
System.out.println("abc".contains("bc"));
System.out.println("abc".contains("bca"));
System.out.println("abc".contains("abc"));
System.out.println("abc".contains("abcd"));
System.out.println("abc".contains("a"));
System.out.println("abc".contains("aa"));
}
private static void test8() {
System.out.println("abc".concat("def"));
}
private static void test7() {
String s = " ab c ";
System.out.println("--" + s + "--");
System.out.println("--" + s.trim() + "--");
}
private static void test6() {
String s = "abcabc";
System.out.println(s.replace('a', 'A'));
System.out.println(s.replace("ab", "xx"));
StringBuilder sb = new StringBuilder();
sb.append("xyz");
System.out.println(s.replace("a", sb));
}
private static void test5() {
String s1 = "abc,def,xx,oo";
String[] arr = s1.split(","); // 正则表达式
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
}
private static void test4() {
String s1 = "abcdefghijklmnopqrstuvwxyz";
System.out.println(s1.substring(3));
System.out.println(s1.substring(3, 6)); // 截取子串, 开始索引包括, 结束索引不包括
System.out.println(s1.substring(25, 26));
}
private static void test3() {
String s1 = "acd";
String s2 = "abc";
System.out.println(s1.compareTo(s2)); // 按照码表值比较, 以第一个不同的字符为准
String s3 = "abcccc";
String s4 = "ab";
System.out.println(s3.compareTo(s4)); // 如果是包含关系, 那么返回长度差值
System.out.println("abc".compareToIgnoreCase("Abc")); // 忽略大小写
}
private static void test2() {
String s = "abcdefabcdef";
int findIndex = s.indexOf('b'); // 找到'b'在字符串s中第一次出现的位置
System.out.println(findIndex);
System.out.println(s.indexOf('b', findIndex + 1)); // 从findIndex+1的位置继续找
System.out.println(s.lastIndexOf('b')); // 查找最后一次出现的位置
}
private static void test1() {
String s = "abcdef";
System.out.println(s.charAt(5)); // 查找字符串s中5号索引上的字符
}
}
查找两个字符串中最大相同子串.
public class Test6 {
public static void main(String[] args) {
findMaxSubstring("XXXabcdXXX", "X abc d");
}
/*
* 查找两个字符串的最大相同子串
*
* 找出s2中的所有子串
*/
private static void findMaxSubstring(String s1, String s2) {
for (int i = 0; i < s2.length(); i++) { // 循环s2.length()次
for (int j = 0; j < i + 1; j++) {
String substring = s2.substring(j, s2.length() - i + j);
if(s1.contains(substring)){
System.out.println(substring);
return;
}
}
}
}
}
char charAt(int index)
查找指定位置的字符
int indexOf(String str)
判断字符串出现的位置
int compareTo(String anotherString)
按字典顺序比较两个字符串
String substring(int beginIndex, int endIndex)
截取子字符串
String[] split(String regex)
字符分割
String replace(CharSequence target, CharSequence replacement)
替换字符串
String trim()
去掉字符串前后空白
字符串练习
设计一个方法, 获取一个已知文件名的扩展名.
Person.java的扩展名是.java,Person.java.txt的扩展名是.txt
public class Test1 {
public static void main(String[] args) {
System.out.println(getExtname("Person.java"));
System.out.println(getExtname("Person.java.txt"));
}
/*
* 接收一个文件名, 返回扩展名
* Person.java --> java
* Person.java.txt --> txt
*/
private static String getExtname(String filename) {
// 查找最后一个"."
int index = filename.lastIndexOf(".");
// 从这个位置后面开始截取
return filename.substring(index + 1);
}
}
设计一个方法, 查找一个字符串中子字符串出现的所有位置.
public class Test2 {
public static void main(String[] args) {
indexOf("abcxxabc", "abc");
}
/*
* 在s1中查找s2出现的所有位置
*/
private static void indexOf(String s1, String s2) {
// 开始查找的位置
int startIndex = 0;
while (true) {
// 从这个位置开始找
int findIndex = s1.indexOf(s2, startIndex);
// 如果没找到就结束循环
if (findIndex == -1)
break;
// 如果找到了, 就打印, 并且将开始位置赋值为这个找到的位置
System.out.println(findIndex);
startIndex = findIndex + s2.length(); // 字符串的长度是length()方法, 数组的长度是length属性
}
}
}
查找一个字符串中出现最多的字符.
“hello world”中L出现了3次
public class Test3 {
public static void main(String[] args) { // alt + shift + m
System.out.println(findMostChar1("hello world"));
System.out.println(findMostChar1("hello world aaaa"));
System.out.println(findMostChar1("hello world xxxxxx"));
}
private static ReturnValue findMostChar1(String s) {
int mostTimes = 0; // 用来记住出现次数最多得字符的次数
char mostChar = 0; // 用来记住出现次数最多的字符
while (s.length() > mostTimes) {
char c = s.charAt(0); // 获取第一个字符
int times = 0; // 用来记住这个字符的次数
for (int i = 0; i < s.length(); i++)
// 再循环遍历字符串每一个字符
if (c == s.charAt(i)) // 如果找到相同的
times++; // 就将次数加1
if (times > mostTimes) { // 如果当前的次数是否大于最多的次数
mostTimes = times; // 记住这个次数
mostChar = c; // 记住这个字符
}
s = s.replace(c + "", ""); // 将当前字符替换为空, 也就是将这个字符从字符串中删除
}
return new ReturnValue(mostChar, mostTimes); // 循环结束之后, 返回最多的字符和次数
}
/*
* 查找s字符串中出现次数最多的字符
* “hello world”中L出现了3次
*/
private static char findMostChar(String s) {
int mostTimes = 0; // 用来记住出现次数最多得字符的次数
char mostChar = 0; // 用来记住出现次数最多的字符
for (int j = 0; j < s.length(); j++) { // 循环遍历每一个字符
char c = s.charAt(j); // 获取其中一个字符
int times = 0; // 用来记住这个字符的次数
for (int i = 0; i < s.length(); i++)
// 再循环遍历字符串每一个字符
if (c == s.charAt(i)) // 如果找到相同的
times++; // 就将次数加1
if (times > mostTimes) { // 如果当前的次数是否大于最多的次数
mostTimes = times; // 记住这个次数
mostChar = c; // 记住这个字符
}
}
return mostChar; // 循环结束之后, mostChar将记住最多的字符
}
}
class ReturnValue {
private char c;
private int times;
public ReturnValue(char c, int times) {
this.c = c;
this.times = times;
}
public String toString() {
return "次数最多的字符是: " + c + ", 次数为: " + times;
}
}
设计方法,使用System.in.read()读取一行.
import java.io.IOException;
public class Test4 {
public static void main(String[] args) throws IOException {
while (true) {
String line = readLine();
System.out.println(line);
if ("bye".equals(line))
break;
}
}
/*
* 使用System.in.read()读取键盘输入的一行字符串
*/
private static String readLine() throws IOException {
StringBuilder sb = new StringBuilder(); // 定义一个容器
while (true) {
byte b = (byte) System.in.read(); // 从键盘输入读一个字节
if (b == '\n') // 如果是\n, 代表行末尾, 结束循环
break;
if (b == '\r') // 如果是\r, 不存
continue;
if (b < 0) { // 小于0代表遇到了中文
byte b1 = (byte) System.in.read(); // 再读一个
byte[] arr = {b, b1}; // 把两个字节转为数组
String s = new String(arr); // 将数组转为字符串
sb.append(s); // 添加到容器
} else
sb.append((char) b); // 其他字符则存入容器
}
return sb.toString(); // 将容器中内容转回字符串返回
}
}
循环读取一个字节,读取到\r\n结束。考虑中文问题
设计一个方法,可以从一个字符串中打印n个字节. 但不能打印出半个中文.
短信一次发送字节140个,如果超过140字节就会分为两条。这时如果第140个字节是中文的前半,那么第一条短信应该发送139字节。
public class Test5 {
public static void main(String[] args) {
print1("abc中文", 3);
print1("abc中文", 4);
print1("abc中文", 5);
}
/*
* 从字符串s中打印n个字节, 如果最后一个字节是中文的前一半, 则不打印
* GBK码表中, 中文第一个字节是负数, 第二个字节可正可负
*
* 我们需要判断要打印的最后一个字节是否是中文的前一半, 如果是则将count-1
* 如果当前的字节是负数, 并且前一个不是中文前一半, 那么当前的就是中文前一半
*/
private static void print(String s, int count) {
byte[] arr = s.getBytes(); // 将字符串转为字节数组
boolean isCnBegin = false; // 代表前一个字节是否是中文的前一半
for (int i = 0; i < count; i++)
isCnBegin = arr[i] < 0 && !isCnBegin;
System.out.println(new String(arr, 0, isCnBegin ? count - 1 : count)); // 将字节数组转为字符串
}
// 判断字符串中指定索引处是否是中文的前一半
// 0号字节如果小于0, 那么就是中文前一半
// 如果查找的是第一个字节, 那么就判断第一个字节是否小于0
// 如果查找的不是第一个字节, 就看 当前字节是否小于0 并且 前一个字节是否不是中文前半
private static boolean isCnBegin(String s, int index) {
return index == 0 ? s.getBytes()[0] < 0 : (s.getBytes()[index] < 0 && !isCnBegin(s, index - 1));
}
private static void print1(String s, int count) {
System.out.println(new String(s.getBytes(), 0, isCnBegin(s, count - 1) ? count-1 : count));
}
}
/*
String类适用于描述字符串事物。
那么它就提供了多个方法对字符串进行操作。
常见的操作有哪些?
"abcd"
1,获取。
1.1 字符串中的包含的字符数,也就是字符串的长度。
int length():获取长度。
1.2 根据位置获取位置上某个字符。
char charAt(int index):
1.3 根据字符获取该字符在字符串中位置。
int indexOf(int ch):返回的是ch在字符串中第一次出现的位置。
int indexOf(int ch, int fromIndex) :从fromIndex指定位置开始,获取ch在字符串中出现的位置。
int indexOf(String str):返回的是str在字符串中第一次出现的位置。
int indexOf(String str, int fromIndex) :从fromIndex指定位置开始,获取str在字符串中出现的位置。
int lastIndexOf(int ch) :
2,判断。
2.1 字符串中是否包含某一个子串。
boolean contains(str):
特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1.表示该str不在字符串中存在。
所以,也可以用于对指定判断是否包含。
if(str.indexOf("aa")!=-1)
而且该方法即可以判断,有可以获取出现的位置。
2.2 字符中是否有内容。
boolean isEmpty(): 原理就是判断长度是否为0.
2.3 字符串是否是以指定内容开头。
boolean startsWith(str);
2.4 字符串是否是以指定内容结尾。
boolean endsWith(str);
2.5 判断字符串内容是否相同。复写了Object类中的equals方法。
boolean equals(str);
2.6 判断内容是否相同,并忽略大小写。
boolean equalsIgnoreCase();
3,转换。
3.1 将字符数组转成字符串。
构造函数:String(char[])
String(char[],offset,count):将字符数组中的一部分转成字符串。
静态方法:
static String copyValueOf(char[]);
static String copyValueOf(char[] data, int offset, int count)
static String valueOf(char[]):
3.2 将字符串转成字符数组。**
char[] toCharArray():
3.3 将字节数组转成字符串。
String(byte[])
String(byte[],offset,count):将字节数组中的一部分转成字符串。
3.4 将字符串转成字节数组。
byte[] getBytes():
3.5 将基本数据类型转成字符串。
static String valueOf(int)
static String valueOf(double)
//3+"";//String.valueOf(3);
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
4,替换
String replace(oldchar,newchar);
5,切割
String[] split(regex);
6,子串。获取字符串中的一部分。
String substring(begin);
String substring(begin,end);
7,转换,去除空格,比较。
7.1 将字符串转成大写或则小写。
String toUpperCase();
String toLowerCase();
7.2 将字符串两端的多个空格去除。
String trim();
7.3 对两个字符串进行自然顺序的比较。
int compareTo(string);
*/
class StringMethodDemo
{
public static void method_7()
{
String s = " Hello Java ";
sop(s.toLowerCase());
sop(s.toUpperCase());
sop(s.trim());
String s1 = "a1c";
String s2 = "aaa";
sop(s1.compareTo(s2));
}
public static void method_sub()
{
String s = "abcdef";
sop(s.substring(2));//从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异常。
sop(s.substring(2,4));//包含头,不包含尾。s.substring(0,s.length());
}
public static void method_split()
{
String s = "zhagnsa,lisi,wangwu";
String[] arr = s.split(",");
for(int x = 0; x
sop(arr[x]);
}
}
public static void method_replace()
{
String s = "hello java";
//String s1 = s.replace('q','n');//如果要替换的字符不存在,返回的还是原串。
String s1 = s.replace("java","world");
sop("s="+s);
sop("s1="+s1);
}
public static void method_trans()
{
char[] arr = {'a','b','c','d','e','f'};
String s= new String(arr,1,3);
sop("s="+s);
String s1 = "zxcvbnm";
char[] chs = s1.toCharArray();
for(int x=0; x
sop("ch="+chs[x]);
}
}
public static void method_is()
{
String str = "ArrayDemo.java";
//判断文件名称是否是Array单词开头。
sop(str.startsWith("Array"));
//判断文件名称是否是.java的文件。
sop(str.endsWith(".java"));
//判断文件中是否包含Demo
sop(str.contains(".java"));
}
public static void method_get()
{
String str = "abcdeakpf";
//长度
sop(str.length());
//根据索引获取字符。
sop(str.charAt(4));//当访问到字符串中不存在的角标时会发生StringIndexOutOfBoundsException。
//根据字符获取索引
sop(str.indexOf('m',3));//如果没有找到,返回-1.
//反向索引一个字符出现位置。
sop(str.lastIndexOf("a"));
}
public static void main(String[] args)
{
method_7();
// method_trans();
// method_is();
// method_get();
/*
String s1 = "abc";
String s2 = new String("abc");
String s3 = "abc";
System.out.println(s1==s2);
System.out.println(s1==s3);
*/
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}