【Java学习笔记】百度面试问题回顾(一)
今天回顾了部分百度面试时被问到的问题:
1.常见的包装类有哪些,他们与基本类型的区别,有哪些方法?
Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。
| 基本类型 | byte | boolean | short | char | int | long | float | double |
| 包装类 | Byte | Boolean | Short | Character | Integer | Long | Float | Double |
| 方法 | int str.parseInt() | String i.toString() | int I.intValue() | Integer(int i) | I.Valueof(String s) |
| 类型变换 | String → int | Integer → String | Integer → int | int→Integer | String,int→Integer |
double dou;
int i = (int)dou;
实际上等价于
Double dou_obj = new Double(dou);
int i = dou_obj.intValue();
2.String中的equals()和“==”有区别吗?请解释
不同,前者比较引用,后者比较内容。String重写了Object类中的equals()方法,比较的是字符串的内容,而“==”只有在引用指向同一个String对象时才返回true,“==”比equals()更严格。
可以看到String类中重写equals()的例子如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
3.Object类有哪些方法?
- toString(): 返回对象的 类名@哈希码 。一般建议重载。
getClass().getName() + "@" + getHexString(HashCode());
- hashCode(): 返回对象的 哈希编码 。
Java中的每一个对象都由一个hashCode表示,JVM维护一个哈希表(hashTable),然后由JVM通过表中的哈希码可以进行寻址,因此哈希码代表的对象也可以用于寻找对象
- equals(): 比较对象是否相等。
传统的“==”比较,是比较对象的引用是否相等,引用里是对象的hashCode(),因此一般不等,但是我们如果想比较两个对象本身呢,这里Object类提供一种对象本身是否相等的方法,在Object类本身的equals()里它的写法是下面这种:
public boolean equals(Object obj){
return (this == obj);
}
它实际上和我们写的“==”比较方法是一样的,那有人就会问equals()还有啥用啊? 实际上,我感觉Java设计者为我们提供了一种自定义的对象的比较方法,在API中也说道Object类的 equals 方法实现对象上差别可能性最大的相等关系:当且仅当两个非空引用x,y引用同一个对象时,才返回true。 那么我们其实可以重写这个方法,从而比较他们的内容。
另外,注意到API文档中说道,如果我们重写equals()方法,最好重写hashCode()方法;因为如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果,如果根据 equals(Object) 方法,两个对象不相等,那么他们调用 hashCode 方法不要求不等,但是为了哈希表性能最好不相等。因此,我们最好重写。
前面提到了String类重写了equals()方法,其实String类也重写了hashCode()方法,它是根据字符串内容生成的hashCode();
//hash是哈希码
//count是string长度
//offset是偏移量
//value是字符串的字符数组值
public int hashCode() {
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
因此有以下结论:
①两个obj,如果equals()相等,hashCode()一定相等
②两个obj,如果hashCode()相等,equals()不一定相等
往后还有:
4.Set、List、Map是什么?他们的特点以及有哪些方法。
5.String、StringBuffer、StringBuilder的区别?
to be Continue...
【Java学习笔记】百度面试问题回顾(一)的更多相关文章
- 20145330第五周《Java学习笔记》
20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- 20145316许心远《Java学习笔记》第三周总结
20145316许心远<Java程序设计>第3周学习总结 教材学习内容总结 一.定义类: 类定义时使用class关键字 如果要将x绑定到新建的对象上,可以使用"="制定 ...
- java学习笔记系列整理说明
java学习笔记系列整理说明 陆陆续续也巩固学习java基础也有一段时间了,这里整理了一些我认为比较的重要的知识点,供自己或者读者以后回顾和学习.这是一个学习笔记系列,有自己的整理重新撰写的部分, ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
随机推荐
- html5 图片360旋转
test.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 我们为什么选择Ceph来建立块存储
我们为什么选择Ceph来建立块存储?国内知名黑客组织东方联盟是这样回答的,卷管理器的大小和增长受到管理程序的驱动器补充的限制,与其他Droplet共享.一旦Droplet被摧毁,储存就会被释放.术语“ ...
- find命令进阶(二):对找到的文件执行操作exec
以下面的命令为例: find ~ -type f -name 'foo*' -exec ls -l '{}' ';' 分面两部分,第一部分: find ~ -type f -name 'foo*' 即 ...
- shell脚本条件测试与比较
1.条件测试常用语法 test 测试表达式 利用test命令进行条件测试表达式,test命令与测试表达式之间至少有一个空格 [ 测试表达式 ] 通过[ ]中括号进行条件测试表达式,[]中括号边界与测试 ...
- 基于oracle 的PL/SQL编程 - 存储过程
接上篇,游标使用的语句,相当于一段匿名的函数,窗口关闭了就不存在了.如果想要窗口关闭了,还能继续执行那段代码,就需要存储过程了: PLSQL是指一个个PLSQL的业务处理过程存储起来进行复用,这些被存 ...
- SQL SERVER视图对查询效率的提高
SQL SERVER视图不仅可以实现许多我们需要的功能,而且对于SQL SERVER查询效率的提高也有帮助,下面一起来了解一下. 有两张数据表:A和B,其中A的记录为2万条左右,而B中的数据为200万 ...
- java使用开源类库Tesseract实现图片识别
Tesseract-OCR支持中文识别,并且开源和提供全套的训练工具,是快速低成本开发的首选. Tess4J则是Tesseract在Java PC上的应用 Tesseract的OCR引擎最先由HP实验 ...
- sonarqube6.7.1使用
1.插件安装 方法1.登入sonarqube-web安装 admin/admin 配置--应用市场--全部 英文片:administration--configuration--marketplace ...
- jmeter添加自定义扩展函数之MD5加密
1,打开eclipse,新建maven工程,在pom中引用jmeter核心jar包,具体请看---https://www.cnblogs.com/guanyf/p/10863033.html---,这 ...
- HEAD请求
平时用的最多的无外乎POST GET 很少用的HEAD 这次HEAD请求使用场景:判断资源是否存在