java面试学习
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java面试学习,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含11067字,纯文字阅读大概需要16分钟。
内容图文
java面试学习
- java面试学习(内容来自网络拼凑 部分内容自己改写)
java面试学习(内容来自网络拼凑 部分内容自己改写)
Day_01
- jdk 和 jre的区别
JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。
- == 和 equals的区别
== 的比较类型有两种:值比较和引用比较。
基本类型的值是固定的 引用地址也应该是一样的;
引用比较会因为不同的地址空间而做出判断
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x == y); // true
System.out.println(x == z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
实际上equals的作用一直都是==的比较,但由于现在String integer等方法都重新改写了equals,本来应该是引用比较却给我们的印象一直是值比较。
-
equals和hashcode的联系
说通俗一点:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值
hashCode值相等只能说指向对象是一致的但是不能代表值也相等 值相等需要equals方法再去验证
即:hashcode相等 equals不一定相等
equals相等 hashcode一定要相等
一般来说 hashcode应当要与equals效果保持一致。 -
三集合 hashSet hashMap hashTable
- hashMap
是个键值对数据类型
一个是键 一个是键值(引用)
键组成数组 数组的元素引用键值 键值由链表的形式表现 键值的替换并非是删除覆盖 而是通过链表的形式 将新的键值放在链头 旧值向后延申
- hashMap
数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;
链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。
哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。
/**
* The table, resized as necessary. Length MUST Always be a power of two.
*/
transient Entry[] table;
static class Entry<K,V> implements Map.Entry<K,V> {
final K key; // 键无法更改
V value; //键值可以
Entry<K,V> next; // 每一个entry都有指向下一个entry的指针next
final int hash; //每次计算的hash是一定的
……
}
–hashMap的元素储存put方法
public V put(K key, V value) {
// HashMap允许存放null键和null值。
// 当key为null时,调用putForNullKey方法,将value放置在数组第一个位置。
if (key == null)
return putForNullKey(value);
// 根据key的keyCode重新计算hash值。
int hash = hash(key.hashCode());
// 搜索指定hash值在对应table中的索引。
int i = indexFor(hash, table.length);
// 如果 i 索引处的 Entry 不为 null,证明根据hash值找到的索引数组中已经存在一个键值对,通过循环不断遍历 e 元素的下一个元素,展开链表。
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
// 确认数组中i处的旧元素 哈希值和key值保持一致 确认找到准确位置
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
// 将本来存在的第一个键值储存下来
V oldValue = e.value;
//将要储存的键值替换到链表的第一个位置
e.value = value;
e.recordAccess(this);
//返回这个旧值 以此类推可以将本来存在的链表都向后延申一位
//达到新加入的元素处于链头 旧元素依次向后一位
return oldValue;
}
}
// 如果i索引处的Entry为null,表明此处还没有Entry。
modCount++;
// 将key、value添加到i索引处。
addEntry(hash, key, value, i);
return null;
}
储存实现过程:拿到新的键值对以后先通过键的hashcode去计算新的哈希值,带着这个哈希值再去找数组中应该存放的位置也就是索引i ,找到以后先判断索引i处是否存在元素 如果不存在直接储存 存在的话就将链表延申 新元素加入表头。
addEntry是hashMap提供的一个包访问工具 将数据放入table并指向新的entry
void addEntry(int hash, K key, V value, int bucketIndex) {
// 获取指定 bucketIndex 索引处的 Entry
Entry<K,V> e = table[bucketIndex];
// 将新创建的 Entry 放入 bucketIndex 索引处,并让新的 Entry 指向原来的 Entry (这里的指向可以理解将entry的元素放入数组)
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
// 如果 Map 中的 key-value 对的数量超过了极限
if (size++ >= threshold)
// 把 table 对象的长度扩充到原来的2倍 table长度应当是2的整数倍。
resize(2 * table.length);
}
另外,hashTable一般都为2的整数倍,目的是为了每个元素可以均匀的储存在数组中而不是挤在同一位置的链表中,少了查询链表的步骤可以减少查询时间,同时也可以保证数组的每一个位置都可以有储存的机会。
hashMap储存(put方法)总结:
根据上面 put 方法的源代码可以看出,当程序试图将一个key-value对放入HashMap中时,程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry 的 value,但key不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部。
–hashMap的读取get()方法
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
学习了put方法后,get方法看起来就很容易理解了。hashCode获取entry位置 遍历位置处的链表 key与查询key一致,返回key的键值 。
hashMap和hashTable大体上是一致的,有一些细节是有区别的这里先放下。
–hashSet
Day_02
final 在java中的作用(final 类 方法 变量固定不可变)
1、final修饰的类是最终类,不能被继承。
2、final修饰的变量是常量且必须初始化,初始化后不能修改。
3、final修饰的方法不能重写。
math.round(-1.5) == -1
无论正数或者负数或者负数,运算规则相同,都是在给出数值的基础上+0.5,然后向下取整。
String属于数据类型吗?
不属于,数据类型有八种:int shot long char float boolean double byte。
String 属于对象。
操作字符串有哪些类?它们有那些区别?
三种类:String StringBuilder StringBuffer。
String对象每申请一次需要创建新的内存空间,指针重新指向新的内存空间。
而 StringBuilder 和 StringBuffer 每次对象申请是将之前对象的内容修改 但指针仍然指向之前的内存空间,后两者多应用于字符串需要多次改变。
StringBuider 和 StringBuffer 前者为非线程安全 后者为线程安全 。线程安全需要多线程同步安全进行,因此StringBuilder在性能上(单线程)可以选择。
String str = “i” 和 String str = new String(“i”)不同吗
前者为常量申请 后者为对象申请。
前者会被jvm虚拟机分配到常量池,后者被分配到堆内存中。
如何将字符串反转?
用 StringBuilder 或 StringBuffer 的reverse()。
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer. append("abcdefg");
System. out. println(stringBuffer. reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder. append("abcdefg");
System. out. println(stringBuilder. reverse()); // gfedcba
String类的常用方法有哪些?
indexOf():返回字符在字符串中的索引
charAt():返回索引处的字符
split():分割字符串
toUpperCase():大写
toLowperlCase():小写
trim():消除字符串两边空白
replace():替换字符串
getBytes():得到字节类型的字符串
length():得到字符串长度
substring():得到字串
equals():字符串比较
抽象类 抽象方法 abstract
很多时候我们可以提前构造功能函数,写好方法,其他类可以直接继承调用,但有时方法的具体实现是不确定的,所以可以只申明有此方法,但不给与具体的执行,这就是抽象。
抽象类一定要有抽象方法吗?
不一定 ,类可以是抽象的,方法有没有抽象不影响。但有抽象方法的类必须申明抽象类。
普通类和抽象类的区别
普通类有具体的执行过程,且不含有抽象方法,可以被直接实例化。
抽象类不是,需要被继承重写后再去实例化。
抽象类不能用final修饰u
final一旦修饰 抽象类不可再更改 就是去了继承重写的意义,编辑器也不允许。
接口和抽象类(继承)的区别
1、实现上 抽象类子类继承要用extends 接口使用implements。
2、构造函数上 抽象类可以有构造函数 但接口不能有
3、一个类可以实现多个接口但只能继承一个抽象类
4、接口中的方法默认使用public访问修饰符,抽象类不限制访问修饰符。
java 中 IO流分为几种?
按功能 输入流(input) 输出流(output)
按类型来分 字节流 和 字符流
字节流和字符流的区别: 字节8位传输 字符16位传输。
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。1
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n ? 1 ) ! ? n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n?1)!?n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z ? 1 e ? t d t ? . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞?tz?1e?tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ??
内容总结
以上是互联网集市为您收集整理的java面试学习全部内容,希望文章能够帮你解决java面试学习所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。