Java基础
1.1 基础概念
1.1.1 特点
简单易学;面向对象(封装,继承,多态);平台无关性( Java 虚拟机实现平台无关性);可靠性;
安全性;支持多线程;支持网络编程并且很方便;编译与解释并存;
1.1.2 四类八种
基本都实现了常量池,实现常量池意味着不创建对象时,取值区间在常量池区间内的,都是从常量池取值处理
Integer i1 = 33; Integer i2 = 33;
System.out.println(i1 == i2);// 输出 true 在常量池区间内,不创建对象
Integer i11 = 333;
Integer i22 = 333;
System.out.println(i11 == i22);// 输出 false 不在常量池区间内,创建对象
类型 | 基本类型 | 包装类 | 位数 | 字节 | 默认值 | 常量池 |
---|---|---|---|---|---|---|
整形 | int | Integer | 32 | 4 | 0 | [-128,127] |
整形 | short | Short | 16 | 2 | 0 | [-128,127] |
整形 | long | Long | 64 | 8 | 0L | [-128,127] |
整形 | byte | Byte | 8 | 1 | 0 | [-128,127] |
字符型 | char | Character | 16 | 2 | 'u0000' | [0,127] |
浮点型 | float | Float | 32 | 4 | 0f | |
浮点型 | double | Double | 64 | 8 | 0d | |
布尔型 | boolean | Boolean | 1 | false | true and false |
1.1.3 关键字
类型 | 内容 | - | - | - | - | - | - |
---|---|---|---|---|---|---|---|
访问控制 | private | protected | public | default | |||
修饰符 | abstract | class | extends | final | implements | interface | native |
new | static | strictfp | synchronized | transient | volatile | ||
程序控制 | break | continue | return | do | while | if | else |
for | instanceof | switch | case | default | |||
错误处理 | try | catch | throw | throws | finally | ||
包相关 | import | package | |||||
基本类型 | boolean | byte | char | double | float | int | long |
short | null | true | false | ||||
变量引用 | super | this | void | ||||
保留字 | goto | const |
native: Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Java本地接口),native的意思
就是通知操作系统
transient: 取消序列化
volatile: 保证可见性 + 禁止指令重排 ;
内存模型 及并发编程中的三个概念 原子性,可见性,有序性 ( https://www.cnblogs.com/dolphin0520/p/3920373.html )
strictfp: strictfp 关键字可应用于类、接口或方法。使用 strictfp 关键字声明一个方法时,该方法中所有的float 和 double表达式都严格遵守FP-strict的限制,符合IEEE-754规范。
1.1.4 hashCode
作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的
索引位置。
重写hashCode方法时除了上述一致性约定,还有以下几点需要注意:
(1)返回的hash值是int型的,防止溢出。
(2)不同的对象返回的hash值应该尽量不同。(为了hashMap等集合的效率问题)
(3)《Java编程思想》中提到一种情况
“设计hashCode()时最重要的因素就是:无论何时,对同一个对象调用hashCode()都应该产生同样的值。如果在讲一个对象用put()添加进HashMap时产生一个hashCdoe值,而用get()取出时却产生了另一个hashCode值,那么就无法获取该对象了。所以如果你的hashCode方法依赖于对象中易变的数据,用户就要当心了,因为此数据发生变化时,hashCode()方法就会生成一个不同的散列码”。
1.1.5 ==和equals的区别,以及为何重写equals方法需要重写hashCode
== : 它的作用是判断两个对象的地址是不是相等。
equals(): 类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对
象。类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;
如果两个对象相等,则 hashcode 一定也是相同的。两个对象相等,对两个对象分别调用 equals 方法都返回 true。
但是,两个对象有相同的 hashcode 值,它们也不一定是相等的 。因此,equals 方法被覆盖过,则 hashCode 方
法也必须被覆盖。
1.1.6 重载和重写的区别
重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不
同。
重写:
1.返回值类型、方法名、参数列表必须相同,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
2.如果父类方法访问修饰符为 private/final/static 则子类就不能重写该方法,但是被 static 修饰的方法能够被再次声明.
3.构造方法无法被重写
1.1.7 成员变量与局部变量的区别
- 从语法形式上看:成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被
public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量
和局部变量都能被 final 所修饰。 - 从变量在内存中的存储方式来看:如果成员变量是使用 static 修饰的,那么这个成员变量是属于类的,如果
没有使用 static 修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。 - 从变量在内存中的生存时间上看:成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法
的调用而自动消失。 - 成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(一种情况例外:被 final 修饰的成员变量也必须
显式地赋值),而局部变量则不会自动赋值。
1.1.8 转发(Forward)和重定向(Redirect)
转发是服务器行为,重定向是客户端行为。
1.1.9 java与C的区别
都是面向对象的语言,都支持封装、继承和多态
Java 不提供指针来直接访问内存,程序内存更加安全
Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
Java 有自动内存管理机制,不需要程序员手动释放无用内存
**在 C 语言中,字符串或字符数组最后都会有一个额外的字符‘\0’来表示结束。但是,Java 语言中没有结束符
这一概念
1.1.10 Java 和 C++的区别
都是面向对象的语言,都支持封装、继承和多态
Java 不提供指针来直接访问内存,程序内存更加安全
Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
Java 有自动内存管理机制,不需要程序员手动释放无用内存
在 C 语言中,字符串或字符数组最后都会有一个额外的字符‘\0’来表示结束。但是,Java 语言中没有结束符这一概念
@源:Ddssia