零基础学习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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net 下的集合

集合的操作在编码的时候很常见。但是由于经常使用几种集合。而忽略了一些不常用的集合。在这里我整理下。 首先先了解下接口&#xff1a; 1、IEnumerable&#xff0c;返回一个循环访问集合的枚举器。 2、IEnumerable<T>&#xff0c;返回一个循环访问指定集合T的枚举器。 …

aspects_具有Aspects的Java中的Mixin –用于Scala特性示例

aspectsScala特征允许将新行为混合到一个类中。 考虑两个特征&#xff0c;可以向JPA实体添加审核和与版本相关的字段&#xff1a; package mvcsample.domainimport javax.persistence.Version import scala.reflect.BeanProperty import java.util.Datetrait Versionable {Ver…

TCP服务端实现并发

socket 在 tcp 协议下通信 客户端 import socket ​ # 创建客户端TCP协议通信 c socket.socket() # 与指定服务端握手 c.connect((127.0.0.1, 8080)) ​ # 通信循环 while True:# 向服务端发送信息msg input(>>>)if len(msg) 0:continuec.send(msg.encode(utf-8))#…

问题 1052: [编程入门]链表合并

题目描述已有a、b两个链表&#xff0c;每个链表中的结点包括学号、成绩。要求把两个链表合并&#xff0c;按学号升序排列。 输入第一行&#xff0c;a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成 输出按照学号…

ssh 看apache_使用Apache KeyedObjectPool的ssh连接池

ssh 看apache我发现org.apache.commons.pool非常有用且健壮&#xff0c;但没有充分记录。 因此&#xff0c;我将在这里帮助您解释如何使用Apache KeyedObjectPool 。 什么是KeyedObjectPool &#xff1f; 它是一个映射&#xff0c;其中包含多种类型的实例池。 可以使用任意键访…

问题 1066: 2004年秋浙江省计算机等级考试二级C 编程题(2)

题目描述输入一个正数x和一个正整数n&#xff0c;求下列算式的值。要求定义两个调用函数&#xff1a;fact(n)计算n的阶乘&#xff1b;mypow(x,n)计算x的n次幂&#xff08;即xn&#xff09;&#xff0c;两个函数的返回值类型是double。 x - x2/2! x3/3! ... (-1)n-1xn/n! 输出…

Ubuntu16.04下安装多版本cuda和cudnn

Ubuntu16.04下安装多版本cuda和cudnn 原文 https://blog.csdn.net/tunhuzhuang1836/article/details/79545625 前言因为之前针对Pytorch&#xff0c;caffe&#xff0c;torch等&#xff0c;装了cuda8.0和对应cudnn5.1&#xff0c;但是最近在装MxNet的时候&#xff0c;发现官网上…

什么是javax.ws.rs.core.context? [ 第1部分 ]

如何使用Context批注 JAX-RS API提供了一种非常方便的机制&#xff0c;可以将各种有用的资源&#xff08;例如HTTP标头&#xff09;注入到端点中。 Context注释是一个通用注释&#xff0c;它注入以下对象的实例&#xff1a; HttpHeaders- > HTTP标头参数和值 UriInfo- >…

spring的事件

理论 异步的实现方式可以使用事件&#xff0c;或者异步执行&#xff1b; spring中自带了事件的支持&#xff0c;核心是ApplicationEventPublisher; 事件包括三个要点&#xff1a; 事件的定义&#xff1b;事件监听的定义&#xff1b;发布事件&#xff1b;实战 代码路径&#xff…

[多项式算法]多项式求逆 学习笔记

多项式求逆 和整数的乘法逆元定义类似&#xff0c;对于多项式\(A(x)B(x)1\)&#xff0c;则称\(A(x),B(x)\)互为乘法逆元。 \(A(x)\)存在乘法逆元的充要条件是\([x^0]A(x)\)存在乘法逆元。 现在思考如何用\(O(n\log n)\)的时间计算\(A(x)\)的乘法逆元&#xff1a; 考虑倍增&…

java jax-rs_在Java EE 6中将Bean验证与JAX-RS集成

java jax-rsJavaBeans验证&#xff08;Bean验证&#xff09;是Java EE 6平台的一部分提供的新验证模型。 约束通过以JavaBeans组件&#xff08;例如托管Bean&#xff09;的字段&#xff0c;方法或类上的注释形式的约束来支持Bean验证模型。 javax.validation.constraints包中提…

ubuntu16.04+cuda9.0_cudnn7.5+tensorflow-gpu==1.12.0

1、查找可用的tensorflow源&#xff0c;该命令运行后终端会输出所有可用的源 anaconda search -t conda tensorflow2、这里name是上一步中输出源的tensorflow name栏的名称&#xff0c;show命令会在终端输出该源具体的信息和下载需要的指令,执行后如图&#xff1a; anaconda sh…

介绍OpenHub框架

本文介绍了OpenHub框架 -基于Apache Camel的新的开源集成解决方案。 本文回答了一些问题&#xff0c;为什么您应该关心另一个集成框架&#xff0c;强弱属性以及如何使用OpenHub启动新项目。 OpenHub框架是Apache Camel&#xff0c;但经过改进…… 当然&#xff0c;您只能使用A…

问题 1072: 汽水瓶

题目描述有这样一道智力题&#xff1a;“某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶&#xff0c;她最多可以换多少瓶汽水喝&#xff1f;”答案是5瓶&#xff0c;方法如下&#xff1a;先用9个空瓶子换3瓶汽水&#xff0c;喝掉3瓶满的&#xff0…

呼叫我或异步REST

本文是使用Spring Boot Java 8创建的工作正常的异步REST应用程序的非常简单的示例。SpringBoot使得开发Web应用程序几乎非常容易&#xff0c;但是为了简化任务&#xff0c;我从Spring存储库中举了一个例子&#xff0c;称为rest- service &#xff0c;将其分叉到我自己的存储库…

NOIP模拟测试22「位运算」

范围n-----$100000$ m $30$ 输出方案 这是一个很好的$dp$题 首先我们应该看出来一条性质只要你最后有方案达到$n$个$1$&#xff0c;那么你可以达到任何一种$n$个$1$的情况 例如 你最后可以达到$3$个$1$ 那么你可以达到$11100 $ $ 01110$ $01011$ $01101$等方案 证明&a…

系统测试集成测试单元测试_等待正确的时刻–集成测试

系统测试集成测试单元测试当您必须测试多线程程序时&#xff0c;总是需要等到系统达到特定状态为止&#xff0c;此时测试可以验证是否已达到正确的状态。 这样做的通常方法是在系统中插入一个“探针”&#xff0c;该探针将向同步原语发出信号 &#xff08;例如Semaphore &…

Apollo的基本概念和集成实战

基本概念 使用场景 是一个分布式的配置中心。适用于微服务&#xff1b; 核心功能 集中管理不同环境&#xff0c;不同集群的配置&#xff1b;配置修改后可以实时推送到应用端&#xff1b;具备规范的权限&#xff0c;流程治理特性&#xff1b;开发技术 服务端使用springboot,spri…

flatMap()和事件顺序– RxJava常见问题解答

正如我们已经发现的&#xff0c; flatMap()不会保留原始流的顺序。 让我们使用上一篇文章的GeoNames API示例进行说明 &#xff1a; public interface GeoNames {Flowable<Long> populationOf(String city);}通过使用flatMap()请求多个城市的人口&#xff0c;我们不能保…

技术管理规划-从哪入手?

前言 最近在学习技术管理课程&#xff0c;对学习的内容做一些笔记&#xff0c;结合当前的工作环境在对应的知识点上做一些思考&#xff0c;慢慢建立自己的团队管理方法论。 学习方法 早上骑单车的时候或者跑步的时候听音频&#xff0c;熟悉课程内容&#xff1b;仔细阅读文字&am…