【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{ ...
随机推荐
- css 当文字过多时以....省略
<!-- 公告 --> <p class="rst-promotion">公告: {{shopInfo.rst.promotion_info}}</p ...
- hdu 2665 Kth number (poj 2104 K-th Number) 划分树
划分树的基本功能是,对一个给定的数组,求区间[l,r]内的第k大(小)数. 划分树的基本思想是分治,每次查询复杂度为O(log(n)),n是数组规模. 具体原理见http://baike.baidu. ...
- BestCoder Round #92 (hdu 6015 6016)
比赛链接 A题主要是map的使用,比赛的时候问了下队友,下次要记住了 #include<bits/stdc++.h> using namespace std; typedef long l ...
- 开源大数据生态下的 Flink 应用实践
过去十年,面向整个数字时代的关键技术接踵而至,从被人们接受,到开始步入应用.大数据与计算作为时代的关键词已被广泛认知,算力的重要性日渐凸显并发展成为企业新的增长点.Apache Flink(以下简称 ...
- keil c51 不能使用:Go to Definition of....的解决方法 STC51
keil c51 不能使用:Go to Definition of....的解决方法 达到的目标如下图所示: 解决方法为 :在工程栏右键单击进入Manage Components ,然后点确定,前提是 ...
- vue.js循环语句
vue.js循环语句 循环使用 v-for 指令. v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组, site 是数组元素迭代的别名. v-for 可以 ...
- GameObject.Find
代码演示: using System.Collections;using System.Collections.Generic;using UnityEngine; public class Game ...
- Codeforces Round #506 (Div. 3) E
Codeforces Round #506 (Div. 3) E dfs+贪心 #include<bits/stdc++.h> using namespace std; typedef l ...
- error C2664: “ATL::CStringT<BaseType,StringTraits>::Remove”: 不能将参数 1 从“const char [2]”转换为“char”
转自VC错误:http://www.vcerror.com/?p=1395 问题描述: 代码: CString str("asdfafda"); str.Remove(" ...
- 111、TensorFlow 初始化变量
# 显式的初始化时非常有用的 # 因为它可以让你不用重复进行繁重的初始化工作 # 当你重新从checkpoint文件中加载一个模型的时候 # 当随机初始化变量被配置在分布式的配置文件中 # 为了在开始 ...