ok了家人们前几天学了一些知识,接下来一起看看吧
一.API
Java 的 API ( API: Application( 应用 ) Programming( 程序 )
Interface(接口 ) )
Java API 就是 JDK 中提供给我们使用的类,这些类将底层
的代码实现封装了起来,我们不需要关心这些类是如何
实现的,只需要学习这些类如何使用即可。
我们在每次查看类中的方法时,都打开源代码进行查
看,这种方式过于麻烦。其实,我们可以通过查帮助文
档的方式,来了解 Java 提供的 API 如何使用。
- 打开API帮助文档。
- 点击显示,找到索引,看到输入框。
- 在输入框里输入,然后回车。
- 看包。java.lang下的类不需要导包,其他需要。
- 看类的解释和说明。
- 看构造方法。
- 看成员方法
二.Object类
2.1 Object类概述
java.lang.Object 类是 Java 语言中的根类,每个类都使用
Object 作为超类。所有对象(包括数组)都实现这个类
的方法。
如果一个类没有特别指定父类,那么默认则继承自
Object 类。例如:
public class DemoTest/*extends Object*/{ // ... }
2.2 toString()方法
方法声明: public String toString() :返回该对象的字符
串表示。
public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this. Age = age;}// 省略 getXXX() 和 setXXX() }
public class DemoTest {public static void main(String[] args) {Person p=new Person("张三",23);// String str = p.toString();// System.out.println(str);System.out.println(p.toString());//源码中println()方法默认调用了 toString()System.out.println(p); }}
由于 toString 方法返回的结果是内存地址,而在开发中,
内存地址并没有实际的应用价值,经常需要按照对象的
属性得到相应的字符串表现形式,因此也需要重写它。
public class Person {private String name;private int age;public Person() { }public Person(String name, int age) {this.name = name; this. Age = age;}// 省略 getXXX() 和 setXXX()@Overridepublic String toString() { return name+"..."+age; } }
public class DemoTest {public static void main(String[] args) {Person p=new Person("张三",23);System.out.println(p.toString());System.out.println(p);}}
在 IntelliJ IDEA 中,可以点击 Code 菜单中的
Generate... ,也可以使用快捷键 alt+insert ,点击
toString() 选项。选择需要包含的成员变量并确定。
public class Person {private String name;private int age;public Person() { }public Person(String name, int age) { this.name = name; this. Age = age; }// 省略 getXXX() 和 setXXX()@Overridepublic String toString() {return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';}}
2.3 equals()方法
方法声明: public boolean equals(Object obj) :指示其
他某个对象是否与此对象 “ 相等 ” 。
equals 方法默认比较两个对象的内存地址是否相同,相
同则返回 true 。
Object 类 equals() 方法源码:
public boolean equals(Object obj) {return (this == obj);}
- this是当前对象,哪个对象调用的equals方法就表示哪个对象
- obj 表述传递的参数,参数类型 Object ,可以传递任意类型对象。
- this==obj 比较两个对象的内存地址是否相同
public class Person {private String name;private int age;public Person() { }public Person(String name, int age) { this.name = name;this.age = age; }// 省略 getXXX() 和 setXXX()@Overridepublic String toString() {return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }}
* ==: 既可以比较基本数据类型 , 也可以比较引用数据类型
* 比较基本数据类型 : 比较值是否相等
* 比较引用数据类型 : 比较地址值是否相等
*
* public boolean equals(Object obj) :指示其
他某个对象是否与此对象 “ 相等 ” 。
*/
public class DemoTest {
public static void main ( String [] args ) {
// 比较基本数据类型
int a = 10 ;
int b = 20 ; System . out . println ( a == b ); //false
// 比较引用数据类型
Person p01 = new Person ( " 张三 " , 23 );
Person p02 = new Person ( " 张三 " , 23 );
System . out . println ( p01 == p02 ); //false
//Object 类的 equals() 方法
System . out . println ( p01 . equals ( p02 )); //false
}
}
实际应用中,比较内存地址是否相同并没有意义,我们
可以定义对象自己的比较方式,比较对象中成员变量的
值是否相同。需要对方法进行重写。
需求:重写 equals() 方法,比较两个对象中姓名和年龄是
否相同,如果姓名和年龄都相同返回 true ,否则返回
false 。
public class Person {
private String name ;
private int age ;
public Person () {
}
public Person ( String name , int age ) {
this . name = name ;
this . age = age ;
}
// 省略 getXXX() 和 setXXX()
@Override
public boolean equals ( Object obj ) {
// 判断两个对象地址弱相同,即为同一个对象
if ( this == obj ){
return true ;
}
//obj 对象为空,无需比较,返回 false
if ( obj == null ){
return false ;
}
// 如果 Obj 是 Person 类型 则强制转换
if ( obj instanceof Person ){
Person person = ( Person ) obj ;
return
this . name . equals ( person . name ) &&
this . age == person . age ;
}
return false ;
}
@Override
public String toString () {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}' ;
}
public class DemoTest {
public static void main ( String [] args ) {
Person p01 = new Person ( " 张三 " , 23 );
Person p02 = new Person ( " 张三 " , 23 );
System . out . println ( p01 . equals ( p02 )); //true
}
}
在 IntelliJ IDEA 中,可以使用 Code 菜单中的 Generate…
选项,也可以使用快捷 alt+insert ,并选择 equals() and
hashCode() 进行自动代码生成。
三.String类
3.1 String类概述
String 类代表字符串, Java 程序中的所有字符串文字
(例如 “abc” )都被实现为此类的实例。
Java 程序中所有的双引号字符串,都是 String 类的对
象。
String 类在 java.lang 包下,所以使用的时候不需要
导包!
3.2 String类的构造方法
public String() 创建一个空字符串对象
public String(String original) 通过给定的内容创建一
个 String 对象
public String(char[] value) 根据 char 数组中的内容 , 来
创建对应的字符串对象
public String(byte[] bytes) 根据 byte 数组中的内容 , 来
创建对应的字符串对象
public String(byte[] bytes, int offset, int length) 指
定 byte 数组的范围 , 根据指定范围中的内容 , 来创建对应
的字符串对象
直接写字符串字面值也是 String 类对象 例如 : String
str = "abc";
public class DemoTest {
public static void main ( String [] args ) {
//public String() :创建一个空白字符串对象,不含有任何内容
String str01 = new String ();
System . out . println ( "str01=" + str01 );
//public String(String original) 通过给定的内容创建一个 String 对象
String str02 = new String ( "abc" );
System . out . println ( "str02=" + str02 );
//public String(char[] value) 根据char数组中的内容 , 来创建对应的字符串对象
char [] cs = { 'a' , 'b' , 'c' , 'd' };
String str03 = new String ( cs );
System . out . println ( "str03=" + str03 );
//public String(byte[] bytes) 根据byte数组中的内容 , 来创建对应的字符串对象
byte [] bs = { 97 , 98 , 99 , 100 , 101 };
String str04 = new String ( bs );
System . out . println ( "str04=" + str04 );
//public String(byte[] bytes, int offset, int length)
// 指定 byte 数组的范围 , 根据指定范围中的内容, 来创建对应的字符串对象
String str05 = new String ( bs , 1 , 3 );
System . out . println ( "str05=" + str05 );
// 直接写字符串字面值也是 String 类对象
String str06 = "hello" ;
System . out . println ( "Str06=" + str06 );
}
}
3.3 两种方式创建字符串的区别
通过 new 创建的字符串对象,每一次 new 都会申请
一个内存空间,虽然字符串内容相同,但是地址值不
同
public class DemoTest {
public static void main ( String [] args ) {
String str01 = new String ( "hello" );
String str02 = new String ( "hello" );
System . out . println ( str01 == str02 ); //false 地址值不同
}
}
以 “ ” 方式给出的字符串,只要字符序列相同 ( 顺序和大
小写 ) ,无论在程序代码中出现几次,都只会建立一个
String 对象
public class DemoTest {
public static void main ( String [] args ) {
String str01 = "hello" ;
String str02 = "hello" ;
System . out . println ( str01 == str02 ); //true
}
}
3.4 字符串常用方法
public int length (): 返回此字符串的长度。
public boolean equals(String s): 比较两个字符串内容
是否相同、区分大小写
public boolean equalsIgnoreCase (String
anotherString) :将此字符串与指定对象进行比较,
忽略大小写。
public String concat (String str): 将指定的字符串连接
到该字符串的末尾。
public char charAt (int index): 返回指定索引处的
char 值。
public int indexOf (String str): 返回指定子字符串第一
次出现在该字符串内的索引。
public String substring (int beginIndex): 返回一个子
字符串,从 beginIndex 开始截取字符串到字符串结
尾。
public String substring (int beginIndex, int
endIndex): 返回一个子字符串 , 从 beginIndex 到
endIndex 截取字符串。含 beginIndex, 不含
endIndex 。
public class DemoTest {
public static void main ( String [] args ) {
String str = "woaijava" ;
//public int length (): 返回此字符串的 长度。
int len = str . length ();
System . out . println ( len ); //8
//public boolean equals(String s): 比较两个字符串内容是否相同、区分大小写
boolean lean01 = str . equals ( "woaiJava" ); //false
System . out . println ( lean01 );
//public boolean equalsIgnoreCase(String anotherString)
// 将此字符串与指定对象进行比较,忽略大小写。
boolean lean02 = str . equalsIgnoreCase ( "woaiJava" );
System . out . println ( lean02 ); //true
//public String concat (String str):
将指定的字符串连接到该字符串的末尾。
String newStr = str . concat ( "haha" );
System . out . println ( newStr ); //woaijavahaha
//public char charAt (int index): 返回指定索引处的 char 值。
char c = str . charAt ( 3 );
System . out . println ( c ); //i
// 遍历字符串 w o a i j a
v a
for ( int i = 0 ; i < str . length (); i ++ ){
System . out . print ( str . charAt ( i ) + "\t" );
}
System . out . println ();
//public int indexOf (String str):
// 返回指定子字符串第一次出现在该字符串内的
索引。
beginIndex 开始截
取字符串到字符串结尾。
String sub01 = str . substring ( 4 );
System . out . println ( sub01 ); //java
//public String substring (int beginIndex, int endIndex):
// 返回一个子字符串 , 从 beginIndex 到 endIndex截取字符串。
// 含 beginIndex, 不含 endIndex 。
String sub02 = str . substring ( 2 , 6 );
System . out . println ( sub02 ); //aija
}
}
3.5 其他方法
public class DemoTest {
public static void main ( String [] args ) {
//boolean isEmpty() 判断字符串是否为空(长度为 0 返回 true ,不为 0 返回 false)
String str01 = null ; // 空 表示什么都没有
String str02 = "" ; // 空字符串对象
String str03 = " " ; // 有一个空格字符的字符 串对象
System . out . println ( "---------------------" );
//System.out.println(str01.isEmpty());//Nul
lPointerException
System . out . println ( str02 . isEmpty ()); //true System . out . println ( str03 . isEmpty ()); //false
System . out . println ( "---------------------" );
//boolean contains(CharSequence s) 判
断字符串中是否包含 给定的字符串
String str04 = "helloworld" ;
System . out . println ( str04 . contains ( "Hello" ))
; //false
System . out . println ( str04 . contains ( "world" ))
; //true
System . out . println ( "---------------------" );
//boolean startsWith(String prefix) 判断字符串是否以 给定的字符串开头
//boolean endsWith(String suffix) 判断字符串是否以 给定的字符串 结尾。
String str05 = "helloworld.java" ;
System . out . println ( str05 . startsWith ( "world" )); //false
System . out . println ( str05 . startsWith ( "he" )); //true
System . out . println ( str05 . endsWith ( ".java" )) ; //true
System . out . println ( str05 . endsWith ( ".html" )) ; //false
System . out . println ( "---------------------" );
//String toLowerCase() 把字母都转成其对应的小写形式
//String toUpperCase() 把字母都转成其对应的大写形式
String str06 = "AbCdEf" ;
System . out . println ( str06 . toLowerCase ()); //abcdef
System . out . println ( str06 . toUpperCase ()); //ABCDEF
System . out . println ( "---------------------" );
//String replace(char oldChar, char newChar)用新内容替代旧内容,返回新的字符串
String str07 = " 小学生放假了 , 小学生打游戏 了" ; String str08 = str07 . replace ( " 小学生" , "***" );
System . out . println ( str08 ); //*** 放假了,*** 打游戏了
System . out . println ( "---------------------" );
//char[] toCharArray() 将此字符串转换为一个新的字符数组
String str09 = "abcd" ;
char [] cs = str09 . toCharArray ();
System . out . println ( Arrays . toString ( cs )); //[ a, b, c, d]
System . out . println ( "---------------------" );
//byte[] getBytes() 把字符串转换为字节数组
String str10 = "hello" ;
byte [] bs = str10 . getBytes ();
System . out . println ( Arrays . toString ( bs )); //[
104, 101, 108, 108, 111]
System . out . println ( "---------------------" );
// String trim() 移除首尾空格
String str11 = " zhangsan " ;
String str12 = str11 . trim ();
System . out . println ( str12 );
System . out . println ( "---------------------" );
//String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
// 传入一个普通的字符串 , 没有特殊含义
String str13 = "a,b,c,d,e" ;
String [] sp01 = str13 . split ( "," );
System . out . println ( Arrays . toString ( sp01 )); //[a, b, c, d, e]
// 高级用法 : 传入有特殊含义的字符串 , 其实就是正则表达式
// 正则表达式 : . 匹配任何单字符
String str14 = "a.b.c.d.e" ;
String [] sp02 = str14 . split ( "\\." );
System . out . println ( Arrays . toString ( sp02 ));
}
}
四.StringBuilder类
4.1 String类字符串拼接问题
public static void main ( String [] args ) {
String str = "hello" ;
str += "world" ;
System . out . println ( str );
}
}
在 API 中对 String 类有这样的描述:字符串是常量,它们
的值在创建后不能被更改。
根据这句话分析我们的代码,其实总共产生了三个字符
串 : Hello 、 World 和 HelloWorld 。
String 类的字符串拼接 , 每一次拼接完都会得到一个新的
字符串对象 , 所以比较耗时 , 也浪费空间。
4.2 StringBuilder类概述
StringBuilder 是一个可变的字符串类 ,我们可以把它
看成是一个容器,这里的可变指的是 StringBuilder 对象
中的内容是可变的。
StringBuilder 类和 String 类的区别
String 类:内容是不可变的
StringBuilder 类:内容是可变的
4.3 StringBuilder类的构造方法
public StringBuilder() 创建一个空白可变字符串对
象,不含有任何内容
public StringBuilder(String str) 根据字符串的内容,
来创建可变字符串对象
public class DemoTest {
public static void main ( String [] args ) {
//public StringBuilder() :创建一个空白可变字符串对象,不含有任何内容
StringBuilder sb01 = new StringBuilder ();
System . out . println ( "sb01=" + sb01 );
System . out . println ( " 长度=" + sb01 . length ());
//public StringBuilder(String str) :根据字符串的内容,来创建可变字符串对象
StringBuilder sb02 = new StringBuilder ( "hello" );
System . out . println ( "sb02=" + sb02 );
System . out . println ( " 长度 =" + sb02 . length ());
}
}
4.4 StringBuilder类常用方法
public StringBuilder append( 任意类型 ) 拼接数据,
并返回对象本身
public StringBuilder insert(int offset, 任意类型 ) 在
指定位置插入数据 , 并返回对象本身
public StringBuilder reverse() 反转字符串 , 并返回对
象本身
public class DemoTest {
public static void main ( String [] args ) {
StringBuilder sb01 = new
StringBuilder ();
//public StringBuilder append( 任意类
型 ) 拼接数据,并返回对象本身
// StringBuilder sb02 = sb01.append("hello");
System.out.println(sb02==sb01);//true
// sb01.append(123);
// System.out.println(sb01);
//public StringBuilder insert(int offset, 任意类型 )
// 在指定位置插入数据 , 并返回对象本身
// sb01.insert(5,"world");
// System.out.println(sb01)
//public StringBuilder reverse() 反转字符串, 并返回对象本身
// StringBuilder sb03 = sb01.reverse();
// System.out.println(sb01==sb03);
// System.out.println(sb01);
// 链式编程
sb01 . append ( "hello" ). append ( 123 ). insert ( 5 , "world" ). reverse ();
System . out . println ( sb01 );
}
}
4.5 StringBuilder和String相互转换
StringBuilder 转换为 String
public String toString() :通过 StringBuilder 类中的
toString() 就可以实现把 StringBuilder 转换为 String
String 转换为 StringBuilder
public StringBuilder(String s) :通过 StringBuilder 的构
造方法就可以实现把 String 转换为 StringBuilder
public class DemoTest {
public static void main ( String [] args ) {
//String -->StringBuilder
String str01 = "hello" ;
StringBuilder sb = new StringBuilder ( str01 );
sb . append ( "world" );
//StringBuilder --> String
String s = sb . toString ();
System . out . println ( s );
}
}
ok了家人们睡了明天见