带着好奇学Java——Java基础概念

批判性思维的本质在于学会提问,且学会提问是更有效的学习方法,养成提问的习惯,时刻保持好奇心,以理性的心态分析世界。

本笔记主要是作为本人读书过程中的一些记录,如有缺漏,请说明补充! 推荐入门书籍:

  1. Java核心技术卷一,二
  2. On Java8
  3. Java实战

基础知识点

问:编程语言这么多,为什么要选择Java?

  1. 简单易学
  2. 平台无关性
  3. 编译与解释并存
  4. 支持多线程
  5. 面向对象

问:Java和C++有什么区别?

  1. 都是面向对象的语言,都支持封装、继承和多态
  2. Java 不提供指针来直接访问内存,程序内存更加安全
  3. Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
  4. Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。
  5. C ++同时支持方法重载和操作符重载,但是 Java 只支持方法重载。

问:如何搭建Java的开发环境?

  1. 下载JDK,IDEA
  2. 配置环境变量
  3. HelloWorld测试环境

问:环境搭建中遇到的JDK与JRE有什么区别呢?

  1. JRE是Java运行环境,主要包含JVM和Java核心类库
  2. JDK是Java开发环境,除了包含JRE外,还提供了一系列的编译,运行工具.

问:如何理解Java中的编译与解释并存以及平台无关性?

  1. 我们编写的代码是.java文件,通过javac编译成.class文件,也就是字节码文件
  2. 然后通过JVM加载字节码文件,通过解释器进行解释执行.
  3. JVM就是实现平台无关性的关键, JVM是运行 Java 字节码的虚拟机。针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。

问:对象是什么?

       一个对象拥有自己的状态,行为和标识,意味着对象有自己的内部数据(提供状态),方法(产生行为),并彼此区分.(每个对象都有唯一的地址).

       就像一个人,可能有姓名年龄,可以吃饭,可以睡觉,可以打游戏,可能姓名会有相同,但是每个人都是独一无二的.

问:面向对象和面向过程有什么区别?

  • 面向过程
"面向过程":分析解决问题所需要的步骤,然后通过函数将这些步骤一步步实现.重点关注于先做什么,后做什么,而不在
意执行这些过程的执行者.
复制代码
  • 面向对象
"面向对象":将一切事物都看做对象,通过面向对象的方式,将各种事物封装为对象,将各种执行步骤封装为对象的方法,
使人们着重于对象的操作,而无需关注各种步骤的具体处理.从而简单化各种复杂的问题.
复制代码

image.png

问:类名,变量名,方法名等的声明规范有哪些?

类型 约束 例子
项目 全部小写,多个单词用中’-‘分割 spring-cloud
全部小写 com.alibaba.fastjson
单词首字母大写 Feature
变量 首单词首字母小写,其他单词首字母大写 userName
常量 全部大写,多个单词用’_’分割 MAX_TIME
方法 同变量 read()

问:如何在一个类里写一些注释?

  1. 单行注释: //
  2. 多行注释: /* */
  3. 文档注释: /** */

问:常见基本数据类型有哪些?

image.png

问:常见的运算符有哪些?

  1. 算术运算符

image.png
2. 关系运算符
image.png
3. 位运算符
image.png
4. 赋值运算符
image.png

问:Java中如何控制流程的?

  1. 条件语句
    • if-else
  2. 循环语句
    • while
    • do-while
    • for
    • foreach
  3. 选择语句
    • switch
  4. 中断语句
    • continue
    • break

问:如果一个数字超过整形,浮点型的的精度范围,如何处理?

可以使用下面两种大数值包装类:

  1. BigInteger
  2. BigDecimal

问:如果我有一类相同类型的数据,可以使用什么来定义?

可以使用数组来进行定义.

  1. 静态初始化
    int[ ] intArray;
    intArray = new int[ ] {1,2,3,4,5};
  2. 简化的静态初始化
    String[] strArray = {“张三”, “李四”, “王五” };
  3. 动态初始化
    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
喜欢就支持一下吧
点赞0 分享