批判性思维的本质在于学会提问,且学会提问是更有效的学习方法,养成提问的习惯,时刻保持好奇心,以理性的心态分析世界。
本笔记主要是作为本人读书过程中的一些记录,如有缺漏,请说明补充! 推荐入门书籍:
- Java核心技术卷一,二
- On Java8
- Java实战
基础知识点
问:编程语言这么多,为什么要选择Java?
- 简单易学
- 平台无关性
- 编译与解释并存
- 支持多线程
- 面向对象
问:Java和C++有什么区别?
- 都是面向对象的语言,都支持封装、继承和多态
- Java 不提供指针来直接访问内存,程序内存更加安全
- Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
- Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。
- C ++同时支持方法重载和操作符重载,但是 Java 只支持方法重载。
问:如何搭建Java的开发环境?
- 下载JDK,IDEA
- 配置环境变量
- HelloWorld测试环境
问:环境搭建中遇到的JDK与JRE有什么区别呢?
- JRE是Java运行环境,主要包含JVM和Java核心类库
- JDK是Java开发环境,除了包含JRE外,还提供了一系列的编译,运行工具.
问:如何理解Java中的编译与解释并存以及平台无关性?
- 我们编写的代码是.java文件,通过javac编译成.class文件,也就是字节码文件
- 然后通过JVM加载字节码文件,通过解释器进行解释执行.
- JVM就是实现平台无关性的关键, JVM是运行 Java 字节码的虚拟机。针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
问:对象是什么?
一个对象拥有自己的状态,行为和标识,意味着对象有自己的内部数据(提供状态),方法(产生行为),并彼此区分.(每个对象都有唯一的地址).
就像一个人,可能有姓名年龄,可以吃饭,可以睡觉,可以打游戏,可能姓名会有相同,但是每个人都是独一无二的.
问:面向对象和面向过程有什么区别?
- 面向过程
"面向过程":分析解决问题所需要的步骤,然后通过函数将这些步骤一步步实现.重点关注于先做什么,后做什么,而不在
意执行这些过程的执行者.
复制代码
- 面向对象
"面向对象":将一切事物都看做对象,通过面向对象的方式,将各种事物封装为对象,将各种执行步骤封装为对象的方法,
使人们着重于对象的操作,而无需关注各种步骤的具体处理.从而简单化各种复杂的问题.
复制代码
问:类名,变量名,方法名等的声明规范有哪些?
类型 | 约束 | 例子 |
---|---|---|
项目 | 全部小写,多个单词用中’-‘分割 | spring-cloud |
包 | 全部小写 | com.alibaba.fastjson |
类 | 单词首字母大写 | Feature |
变量 | 首单词首字母小写,其他单词首字母大写 | userName |
常量 | 全部大写,多个单词用’_’分割 | MAX_TIME |
方法 | 同变量 | read() |
问:如何在一个类里写一些注释?
- 单行注释: //
- 多行注释: /* */
- 文档注释: /** */
问:常见基本数据类型有哪些?
问:常见的运算符有哪些?
- 算术运算符
2. 关系运算符
3. 位运算符
4. 赋值运算符
问:Java中如何控制流程的?
- 条件语句
- if-else
- 循环语句
- while
- do-while
- for
- foreach
- 选择语句
- switch
- 中断语句
- continue
- break
问:如果一个数字超过整形,浮点型的的精度范围,如何处理?
可以使用下面两种大数值包装类:
- BigInteger
- BigDecimal
问:如果我有一类相同类型的数据,可以使用什么来定义?
可以使用数组来进行定义.
- 静态初始化
int[ ] intArray;
intArray = new int[ ] {1,2,3,4,5}; - 简化的静态初始化
String[] strArray = {“张三”, “李四”, “王五” }; - 动态初始化
int[] price = new int[4];
基础常问难点汇总
1.==和equals的区别?
- 对于基本类型来说,==比较的是值,对于引用类型来说,==比较的是对象地址值.
- equals方法用于比较两个对象是否相等
//Object类中的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
复制代码
- 若未重写equals方法,则比较的是对象地址值,若重写,一般用于比较对象属性值是否相等.
//String类中的equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
复制代码
2.为什么重写 equals 时必须重写hashCode方法?
- hashCode方法是Object里面的一个native方法,主要用来将对象的内存地址 转换为整数之后返回获取哈希码.
//Object中的hashCode()
public native int hashCode();
复制代码
- 在往HashSet中添加重复元素时,会先比较是否存在hashcode值,若存在,在使用equals方法比较两个对象是否相等.若相等,则无法插入,否则,重新散列到其他位置.而通过hashcode值,我们减少了equals的次数.
- 两个对象equals相等,则hashcode一定相等(规定),但是hashcode相等,对象不一定相等.一个类的两个对象,在没有重写hashCode()方法时,会产生两个不同的hashcode值,因此,重写equals时,必须重写hashCode方法.
- hashCode() 所使用的哈希算法也许刚好会让多个对象传回相同的哈希值。越糟糕的哈希算法越容易碰撞,但这也与数据值域分布的特性有关
3.Java中的128陷阱?
- 装箱:将基本类型用它们对应的引用类型包装起来;
- 拆箱:将包装类型转换为基本数据类型;
- Integer的缓存机制
//此方法将始终缓存-128 到 127(包括端点)范围内的值,并可以缓存此范围之外的其他值。
public static Integer valueOf(int i) {
return i >= -128 && i <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[i + 128] : new Integer(i);
}
复制代码
- Character的缓存机制
public static Character valueOf(char c) {
return c <= 127 ? Character.CharacterCache.cache[c] : new Character(c);
}
复制代码
- Boolean的缓存机制
public static Boolean valueOf(boolean b) {
return b ? TRUE : FALSE;
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END