零基础学习java------day11------常用API
API概述
API(application Programming Interface, 应用程序编程接口),是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节
比如我需要在一个程序里面嵌入语音识别交互功能,那么这个功能如果让我们自己从零开始实现,肯定是不现实的,所以市场上面就出现了提供这个语音识别功能的公司,这些公司会提供给应用程序编程的接口,大家把这些类称为Xxx Voice API. 我们只需要调用相应的方法就可以实现我们想做的事情,底层实现不需要我们关注。本章涉及的java API指的就是JDK中提供的各种功能的java类
一 Object
1. 构造方法:
public Object()
2. 成员方法
2.1 方法介绍
public int hashCode() 返回对象的hashCode值(默认地址值根据特定算法运算得到的一个整数值),可重写(源码不可见,此方法是用native修饰,用native修饰的方法一般都是用其他语言实现(C),效率高)
public final Class getClass() 返回字节码对象(Class对象),里面包含了类中的所有信息,不能被重写(此方法使用final修饰)
public String toString(): 返回对象的字符串形式(默认是全类名+地址值),可重写
public boolean equals(Object obj): 判断两个对象是否是同一个对象,默认用==实现,可重写
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的字节码对象 Person类的字节码对象 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.day11
3. 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@2ff4acd0
println()内部实现是toString,toString源码如下,由此可理解打印的结果
4. equals
格式:对象1.equals(对象2)
(1)equals和 ==
equals:判断两个对象是否是同一个对象(默认是==实现的,可重写)
==:连接基本数据类型(比较的是值)
连接引用数据类型(比较的是地址值)
(2)equals和hashCode的用法
一般我们在比较对象是否是同一个对象的时候,是同时使用hashCode和equals
a. 先用hashCode 作比较:
如果hashCode 不同: 一定不是同一个对象
如果hashCode 相同: 不一定,继续比较equals:( 这样比较的原因:hashCode方法的实现是C语言,效率高)
equals:
true 说明是同一个对象
false: 不是同一个对象
b. 为了保证equals 和hashCode 结果的一致性
我们在重写equals 方法的同时,也要重写hashCode,约定俗称(即当equals定义相等的条件改变时,hashCode也要改变)
自动重写:右键-->source-->generate hashCode and equals
练习
定义一个Teacher类,并创建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表示键盘录入,但若输入的数据类型与表达式不同则会报错,以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类概述:
字符串是由多个字符组成的一串数据(字符序列,字符串可以看成是字符数组)
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) {} }
方法体中添内容
a 构造方法1
String str = new String(); System.out.println(str);// 打印结果为空,所以第一个构造方法对应空字符串
其构造方法源码如下
b 构造方法2(byte数组转为字符串)
byte[] bs = new byte[] {97,98,99}; String str1 = new String(bs); System.out.println(str1); // 运行的结果为abc
此处构建字符串是用数组中编码所代表的字符来构建字符串,编码97在ascii码中代表a
c 构造方法3(byte类型转换的字符串进行切片)
String str2 = new String(bs,1,2);//offset=1,length=2表示从数组索引为1的编码开始取2位 System.out.println(str2); // 运行结果:bc
d 构造方法4(char类型数组转为字符串)
char[] chs = new char[] {'哈','哈', '大','笑','哭','笑','不','得'};//右边可以省略new char String str3 = new String(chs);System.out.println(str3); // 运行结果:哈哈大笑哭笑不得
e 构造方法5(带偏移量以及count的char数组转为字符串)
System.out.println(new String(chs,3,3)); // 运行结果:笑哭笑
f 构造方法6(字符串转字符串,即赋值)
String str4 = new String("你好,世界");System.out.println(str4);
相当于将“你好,世界”赋值给了str4
3 此种赋值方式(str4)与直接赋值(str=“你好,世界”)有什么区别?
存放位置不一样,直接赋值的str存放在常量池,而str4的形式是创建了一个新对象,其存放位置为堆。
案例
public class StringDemo2 {public static void main(String[] args) {String str = "你好,世界"; // 存放在常量池(jdk1.6位置为方法区,1.7为堆内存中,1.8以后放在一个元空间)String str1 = new String("你好,世界");System.out.println(str == str1);} } // 运行结果:false
若另外创建一个内容相同的常量字符串str2,其地址值是否和ste一样?答案:一样
String str2 = "你好,世界"; System.out.println(str == str2); //运行结果:true
注意字符串中的equals比较的是字符串内容是否相等
System.out.println(str.equals(str1)); 运行结果是true
同理,equals重写了,相应的hashCode方法也被重写了,str和str1的hashCode值也相等
System.out.println(str.hashCode() == str1.hashCode()); // 运行结果:true
4. String内存分配
(1)直接赋值:存放在常量池中,先在常量池中找该字符是否存在,如果存在,直接用这个字符串,如果没有,则创建一个新的,相同的内容,只有一份
(2)new:存放在堆内存中,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 堆内存 5 } 6 }
为了弄清第4行代码是怎么运行的,找到这个文件的.class,进行反编译(将计算机能看懂的文件转换成人能看懂的内容),用XJAD软件打开即可
在eclipse上找.java文件的.class文件的流程
特定.java文件上右键--->show In----->System Explorer,即可得到.java文件所在的目录,如下
在地址栏那一块点击src上一层的javase,即可出现如下界面
这个时候点击bin文件夹,即可找到相应的.class文件
利用xjad进行反编译可得:
由19行可知,s存在堆内存中
5. String的判断功能
String
(1)boolean equals(Object obj):比较字符串的内容是否一样
(2)boolean equalsIgnoreCase(String str):忽略大小写比较字符串的内容
(3)boolean contains(String str):某个字符串是否包含另一内容
(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判断的是字符串的内容是否相同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对应的字符,第一次出现的索引值
(4)int intdexOf(String str): 返回str第一次出现的索引值
(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
转载于:https://www.cnblogs.com/jj1106/p/11349199.html
零基础学习java------day11------常用API相关推荐
- 零基础学习Java开发,这些学习笔记送给你!
因为Java具备很多特点,并且在企业中被广泛应用为此很多小伙伴选择学习Java基础开发,但是零基础学习Java技术开发需要我们制定Java学习路线图对于我们之后的学习会非常有帮助. 零基础学习Java ...
- 零基础学习Java开发,这些学习笔记送给你
因为Java具备很多特点,并且在企业中被广泛应用为此很多小伙伴选择学习Java基础开发,但是零基础学习Java技术开发需要我们制定Java学习路线图对于我们之后的学习会非常有帮助. 零基础学习Java ...
- 零基础学习java,这些书一定要看!
学习java技术除了看视频,看书也是非常重要的,尤其是零基础同学,本文包含学习Java各个阶段的书籍推荐,史上最全,学习Java,没有书籍怎么行,就好比出征没带兵器一个道理,这些书籍整理出来给大家作为 ...
- 零基础学习Java培训有什么攻略
零基础学习Java培训有什么攻略?java是主流编程语言之一,我们在学习Java的时候需要制定Java学习路线图,Java涉及到的知识点非常的多,我们该从何学起呢?怎么系统的学习呢?来看看下面的详细介 ...
- 翁恺《零基础学习Java语言》作业答案 第1周到第7周
翁恺<零基础学习Java语言>作业答案 第1周到第7周全部 文章目录 前言 一.第1周 计算 1.温度转换 二.第2周 判断 1.时间换算 2.信号报告 二.第3周 循环 1.奇偶个数 2 ...
- 零基础学习java编程,真的很难吗?手把手将你带入编程世界。
零基础学习java真的很难吗?本人脑袋比较笨,从接触java到职业生涯已经小有4年了.怎么说呢,就是现在我依然能够保持着当年的那份不断学习的热情,是不是很不可思议.我告诉你,这是最基本最基础从事编程行 ...
- java基础知识点_零基础学习Java语言,各个阶段需要掌握的知识点
随社会的脚步的不断发展,Java技术在不断的与时俱进,这也是Java一直长盛不衰的原因之一.Java技术的学习,永远没有早晚之分,技不压身,对于21世纪的我们80后,90后,甚至00后,尤其适用! 那 ...
- 零基础学习java必须要了解的学习路线
Java开发目前热火朝天,但是有传言说Java将被取代,当然那只是传言.今天小编来谈谈零基础学习Java必须了解的学习路线. 第一阶段:HTML+CSS 静态布局开始 有人肯能会说我是做后端的,前端的 ...
- 零基础学习Java真的很难?初学者必须了解的Java基础知识梳理
作为最受欢迎的编程语言之一,Java是很多人转行的首选.对于零基础而言,在学习Java前要了解哪些语言特征和常识呢?下面,小编就来分享一下零基础学习Java者必须了解的Java语言常识以及知识. 从1 ...
- 小白零基础学习Java编程好学吗?
Java作为一门基础性编程语言,伴随着IT行业的兴起.目前,学习Java的人变得越来越多,但是想要学好Java通过自学可没有那么容易,尤其是对于初学者而言.那么小白零基础学习Java编程好学吗? IT ...
最新文章
- 18 款顶级代码生成器平台!
- Java 多线程(二)线程间的通信应用--生产者消费者(未完)
- 比RNN快136倍!上交大提出SRNN,现在RNN也能做并行计算了
- Java与嵌入式数据库SQLite的结合
- ad 原理图差分线_Altium差分线如何从原理图到PCB布线?
- 光纤中继器的安装调试
- 技术回归本位:海尔引领空调产业重构格局
- go语言 mysql卡死_一次mysql死锁的排查过程-Go语言中文社区
- 【注】【精】【火】博主考研去了,现在的博文都是以前的笔记或者算法。
- Jboss启动报错——DailyRollingFileAppender无法转换异常
- Promise 源码:静态方法
- vue.3.0 dom赋值_Vue 3.0 快速入门
- [交互设计工具/原型创作工具]Axure RP Pro 5.0新特性 破解版 注册码
- ios safari 模拟器_Safari调试iOS应用
- ios越狱c语言编译器,IT之家学院:iOS越狱插件利器之Flex — App UI修改篇
- 计算机ps基础知识教案范文,计算机制图软件ps教案内页.doc
- eyoucms添加附属栏目功能
- MongoDB分片存储集群支撑海量数据
- 《咸鱼分享》DNS反向解析
- 【学习OpenCV4】案例1:Windows OpenCV C++语言开发环境搭建
热门文章
- .bash_profile vs .bashrc
- Linux 如何查看命令所在位置/查看命令文件所在位置
- MyEclipse或者Eclipse的小图标含义详解
- 自定义报错返回_MybatisPlus基础篇学习笔记(五)------自定义sql及分页查询
- 高通写号工具_高通推出桌面平台新ARM处理器并认为我们的电脑性能没必要那么高...
- python基础论文_北大博士Python学习笔记,Python基础语法总结,一篇文章带你入门...
- LeetCode 344 反转字符串
- int类型存小数 mysql_MySQL基本数据类型
- C 11 实现的 100行 线程池
- 1024到了,默默给自己点个赞!