零基础学习java------day11------常用API
API概述
API(application Programming Interface, 應用程序編程接口),是一些預先定義的函數(shù)。目的是提供應用程序與開發(fā)人員基于某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內(nèi)部工作機制的細節(jié)
比如我需要在一個程序里面嵌入語音識別交互功能,那么這個功能如果讓我們自己從零開始實現(xiàn),肯定是不現(xiàn)實的,所以市場上面就出現(xiàn)了提供這個語音識別功能的公司,這些公司會提供給應用程序編程的接口,大家把這些類稱為Xxx Voice API. 我們只需要調(diào)用相應的方法就可以實現(xiàn)我們想做的事情,底層實現(xiàn)不需要我們關注。本章涉及的java API指的就是JDK中提供的各種功能的java類
一? ?Object
1. 構造方法:
public Object()
2. 成員方法
2.1? 方法介紹
public int hashCode()? ?返回對象的hashCode值(默認地址值根據(jù)特定算法運算得到的一個整數(shù)值),可重寫(源碼不可見,此方法是用native修飾,用native修飾的方法一般都是用其他語言實現(xiàn)(C),效率高)
public final Class getClass()? ?返回字節(jié)碼對象(Class對象),里面包含了類中的所有信息,不能被重寫(此方法使用final修飾)
public String toString():? 返回對象的字符串形式(默認是全類名+地址值),可重寫
public boolean equals(Object obj):? ?判斷兩個對象是否是同一個對象,默認用==實現(xiàn),可重寫
1. hashCode:
一般用hashCode判斷兩個對象是不是同一個對象,如果hashCode不相等,則肯定不是一個對象,如果hashCode相等,則一定是同一個對象
public class ObjectClass {public static void main(String[] args) {Person p = new Person();Person p1 = new Person();System.out.println(p.hashCode()); //804564176System.out.println(p1.hashCode()); // 1421795058 } } class Person{String name; }可見對象p和對象p1不是同一個對象(注釋為得到的hashCode值)
?
2. getClass:
其余代碼同上
Class clazz = p.getClass(); // 獲取p的字節(jié)碼對象 Person類的字節(jié)碼對象 System.out.println(clazz); // class com._51doit.javase.day11.Person System.out.println(clazz.getSimpleName()); // Person System.out.println(clazz.getName()); // com._51doit.javase.day11.Person System.out.println(clazz.getPackage()); // package com._51doit.javase.day113. toString:
System.out.println(p.toString()); //com._51doit.javase.day11.Person@2ff4acd0 全類名+@+hashcode值的16進制(hashcode值是10進制) System.out.println(p); //com._51doit.javase.day11.Person@2ff4acd0println()內(nèi)部實現(xiàn)是toString,toString源碼如下,由此可理解打印的結果
4. equals
格式:對象1.equals(對象2)
?(1)equals和? ==??
equals:判斷兩個對象是否是同一個對象(默認是==實現(xiàn)的,可重寫)
==:連接基本數(shù)據(jù)類型(比較的是值)
連接引用數(shù)據(jù)類型(比較的是地址值)
?(2)equals和hashCode的用法
一般我們在比較對象是否是同一個對象的時候,是同時使用hashCode和equals
?
a. 先用hashCode 作比較:
如果hashCode 不同: 一定不是同一個對象
如果hashCode 相同: 不一定,繼續(xù)比較equals:(?這樣比較的原因:hashCode方法的實現(xiàn)是C語言,效率高)
equals:
true 說明是同一個對象
false: 不是同一個對象
?
b. 為了保證equals 和hashCode 結果的一致性
我們在重寫equals 方法的同時,也要重寫hashCode,約定俗稱(即當equals定義相等的條件改變時,hashCode也要改變)
自動重寫:右鍵-->source-->generate hashCode and equals
?
?練習??
?定義一個Teacher類,并創(chuàng)建2個對象,如果兩個對象的屬性值相同,就認定為同一個對象,打印對象:System.out.println(t),打印的格式為(姓名:張三,年齡:18,工資:20000)
public class Exer1 {public static void main(String[] args) {Teacher t1 = new Teacher();Teacher t2 = new Teacher();System.out.println(t1);if(t1.hashCode() == t2.hashCode()) {if(t1.equals(t2)) {System.out.println("true");}else {System.out.println("false");}}else {System.out.println("false");}} }class Teacher{String name="張三";int age = 18;double salary = 20000;public String toString() {return "姓名:"+name+",年齡:"+age+",工資:"+salary;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());long temp;temp = Double.doubleToLongBits(salary);result = prime * result + (int) (temp ^ (temp >>> 32));return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Teacher other = (Teacher) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;if (Double.doubleToLongBits(salary) != Double.doubleToLongBits(other.salary))return false;return true;}} View Code?
二 Scanner
scanner表示鍵盤錄入,但若輸入的數(shù)據(jù)類型與表達式不同則會報錯,以int為例
Scanner sc = new Scanner(System.in); int a = sc.nextInt(); // 此處a若輸入一個非int值時就會報錯解決方法
//加個條件判斷 Scanner sc= new Scanner(System.in); if(sc.hasNextInt()){int a = sc.nextInt(); }?
三. String
1. String類概述:
字符串是由多個字符組成的一串數(shù)據(jù)(字符序列,字符串可以看成是字符數(shù)組)
2. 構造方法
(1)public String()
(2)public String(byte[ ] bytes)
(3)public String(byte[ ] bytes, int offset, int length)
(4)public String(byte[ ] value)
(5)public String(char[ ] value, int offset, int count)
(6)public String(String original)
案例
public class StringDemo {public static void main(String[] args) {} }方法體中添內(nèi)容
a 構造方法1
String str = new String(); System.out.println(str);// 打印結果為空,所以第一個構造方法對應空字符串
其構造方法源碼如下
b 構造方法2(byte數(shù)組轉(zhuǎn)為字符串)
byte[] bs = new byte[] {97,98,99}; String str1 = new String(bs); System.out.println(str1); // 運行的結果為abc此處構建字符串是用數(shù)組中編碼所代表的字符來構建字符串,編碼97在ascii碼中代表a
?c 構造方法3(byte類型轉(zhuǎn)換的字符串進行切片)
String str2 = new String(bs,1,2);//offset=1,length=2表示從數(shù)組索引為1的編碼開始取2位 System.out.println(str2); // 運行結果:bcd 構造方法4(char類型數(shù)組轉(zhuǎn)為字符串)
char[] chs = new char[] {'哈','哈', '大','笑','哭','笑','不','得'};//右邊可以省略new char String str3 = new String(chs);System.out.println(str3); // 運行結果:哈哈大笑哭笑不得
e 構造方法5(帶偏移量以及count的char數(shù)組轉(zhuǎn)為字符串)
System.out.println(new String(chs,3,3)); // 運行結果:笑哭笑f 構造方法6(字符串轉(zhuǎn)字符串,即賦值)
String str4 = new String("你好,世界");System.out.println(str4);相當于將“你好,世界”賦值給了str4
?
3 此種賦值方式(str4)與直接賦值(str=“你好,世界”)有什么區(qū)別?
? 存放位置不一樣,直接賦值的str存放在常量池,而str4的形式是創(chuàng)建了一個新對象,其存放位置為堆。
?案例
public class StringDemo2 {public static void main(String[] args) {String str = "你好,世界"; // 存放在常量池(jdk1.6位置為方法區(qū),1.7為堆內(nèi)存中,1.8以后放在一個元空間)String str1 = new String("你好,世界");System.out.println(str == str1);} } // 運行結果:false若另外創(chuàng)建一個內(nèi)容相同的常量字符串str2,其地址值是否和ste一樣?答案:一樣
String str2 = "你好,世界"; System.out.println(str == str2); //運行結果:true?
?注意字符串中的equals比較的是字符串內(nèi)容是否相等
System.out.println(str.equals(str1)); 運行結果是true同理,equals重寫了,相應的hashCode方法也被重寫了,str和str1的hashCode值也相等
System.out.println(str.hashCode() == str1.hashCode()); // 運行結果:true?
?4. String內(nèi)存分配
?(1)直接賦值:存放在常量池中,先在常量池中找該字符是否存在,如果存在,直接用這個字符串,如果沒有,則創(chuàng)建一個新的,相同的內(nèi)容,只有一份
?(2)new:存放在堆內(nèi)存中,new幾個就開辟幾塊空間,也就是幾個地址值
?
5. 面試題
第4行代碼中的s存在那一塊?
1 public class StringDemo3 { 2 public static void main(String[] args) { 3 String s = "hello"; // 常量池 4 s += "world"; // s = s+ world 堆內(nèi)存 5 } 6 }為了弄清第4行代碼是怎么運行的,找到這個文件的.class,進行反編譯(將計算機能看懂的文件轉(zhuǎn)換成人能看懂的內(nèi)容),用XJAD軟件打開即可
在eclipse上找.java文件的.class文件的流程
特定.java文件上右鍵--->show In----->System Explorer,即可得到.java文件所在的目錄,如下
在地址欄那一塊點擊src上一層的javase,即可出現(xiàn)如下界面
這個時候點擊bin文件夾,即可找到相應的.class文件
利用xjad進行反編譯可得:
由19行可知,s存在堆內(nèi)存中
?
5. String的判斷功能
String
(1)boolean equals(Object obj):比較字符串的內(nèi)容是否一樣
(2)boolean equalsIgnoreCase(String str):忽略大小寫比較字符串的內(nèi)容
(3)boolean contains(String str):某個字符串是否包含另一內(nèi)容
(4)boolean startsWith(String str):是否以。。。開頭
(5)boolean endsWith(String str):是否以。。。結尾
(6)boolean isEmpty():判斷字符串是否為空
案例
public class StringDemo4 {public static void main(String[] args) {String str = "abc";String str1 = "abc";System.out.println(str.equals(str1)); // true,equals判斷的是字符串的內(nèi)容是否相同System.out.println("abc".equalsIgnoreCase("ABc")); // trueSystem.out.println("abcdefgh".contains("def")); //trueSystem.out.println("Abcsd".startsWith("Ab")); //trueSystem.out.println("Abcsd".endsWith("sd")); // trueSystem.out.println("abc".isEmpty()); // false } }練習
模擬登陸,給三次機會,并提示還有幾次機會
public class Login {public static void main(String[] args) {String name = "老王";String pwd = "123456";Scanner sc = new Scanner(System.in);for(int i=0;i<3;i++) {// 請輸入您的姓名System.out.println("請輸入您的姓名");String userName = sc.nextLine();// 請輸入您的密碼System.out.println("請輸入您的密碼");String userPwd = sc.nextLine();if(userName.equals(name) && userPwd.equals(pwd)) {System.out.println("登陸成功");break;}else {if(i<2) {System.out.println("用戶名或密碼錯誤,您還有"+(2-i)+"次機會");}else {System.out.println("今日機會已用完");}}}} }?
6. 字符串的獲取功能
(1)int length():? 獲取字符串的長度
(2)char charAt(int index)? : 返回index對應的字符
(3)int indexOf(int ch):? 返回ch對應的字符,第一次出現(xiàn)的索引值
(4)int intdexOf(String str): 返回str第一次出現(xiàn)的索引值
(5)int indexOf(int ch, int fromIndex)
(6)int indexOf(String str, int fromIndex)
(7)String substring(int start): 字符串的截取從start到最后
(8)String substring(int start, int end):? 包含start,不包含end
?
轉(zhuǎn)載于:https://www.cnblogs.com/jj1106/p/11349199.html
總結
以上是生活随笔為你收集整理的零基础学习java------day11------常用API的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对联从左往右读还是从右往左读(读对联的正
- 下一篇: .net 下的集合