- 任何一个语言中的小数(浮点数)运算,尤其是乘除,都会出现精度问题,这是因为数据的二进制存储方式导致的。
- 编码问题
- ascii 128个字符,1 bytes,用 7 bits 表示字符值,最高位置为0
- gb2312 是中文标准,包括七千个常见字符,用2 Byte = 16 bits 表示。与ascii 区分开来,两个字节最高位都是1
- gbk 向下兼容 gb2312,也用 2 Bytes 表示;gb18030 向下兼容 gbk 包含更多字符
- unicode 为世界上所有字符编码
- utf-32 由 4 bytes 表示
- utf-16 字符值大的用 4 bytes,字符值小的用2 bytes
- utf-8, 字符值小于128的与 ascii 相同,最高位为0;字符值大于128的高维为1(节省空间)
- 乱码:编码的方式与解析的方式不同
- switch-case 中的case不用排序,编译器会自动排序,然后用跳转映射表中高效进行二分查找;case较多的情况下,switch-case 比 if-else if-else 效率更高
java 也有类似于 python
for i in alist:
的遍历元素的操作:java int[] arr = {1,2,3,4}; for (int element : arr) { System.out.println(element) }
数组和对象有两块空间,1. 存储数据(存放在堆中),2. 存储地址(存放在栈上)。在方法中,修改数组元素会修改调用者中地址指向的数据,原数组被修改;而基本类型传参后,在内部修改不会影响其本身的值
- 方法/函数 return 的变量只能有一个,需要返回多个值可以用数组、类的对象
- java 修饰符
- public, 可被外部访问
- private, 仅可在内部访问
- static, 修饰类变量、类方法,仅可被类函数调用
- final, 修饰类变量、实例变量,仅可被赋值一次
- synchronized,线程锁,多次调用一个方法之后需要等待之前的进行完
- abstract
- StackOverFlow 栈溢出
- 调用函数的时候,参数、函数内变量都会被压入栈,调用结束之后会被释放
- 迭代函数中,每次迭代都会为新的参数、函数内定义变量分配栈空间,栈的空间有限,压入内容太多会出现栈溢出
- 尝试用循环代替迭代
- 用修饰符 private 避免方法、变量在类外被误调或修改(private 数据 可通过类方法、实例方法进行修改)
- 方法不能嵌套方法,但是类可以嵌套类
- 类方法 v.s. 实例方法 (markdown中表格的前一行必须空出,否则不会编译成表格)| 特点 | 类方法 | 实例方法 | | —- | —- | —- | | 标志 | 方法名前有static | 无static修饰符 | | 内存分配 | 类被加载到内存中时分配内存 | 对象创建后分配内存 | | 访问内容 | 只能访问static类型的类变量、类方法 | 可对类变量、实例变量进行操作;可调用类方法、实例方法 |
- Java 中用static 标志/声明类属性;
- python中只要写在类下、方法外的属性都是类属性,用
self.attribute = ?
定义的都是实例属性,创建了实例之后才可用;python中未创建实例时,不可访问实例属性,但可访问类属性 java 中用
this.attribute = ?
来修- 创建一个类实例
java Point p; // 声明类实例,仅为类的存储地址和类变量分配内存 p = Point(); // 实例化一个类,为实例变量分配空间
- 创建一个类实例
python中构造方法是
def __init__(self, args)
,而java中使用public ClassName(args) {}
方法来实现,构造方法的名字类名相同,不要有返回值- python中用
self
代表当前类,而java用this
- 调用实例方法、为实例变量赋值的操作,与python相似
- 生命周期
- 调用方法时,为变量内存空间,方法返回时回收
- 类(类静态变量、类方法等)加载入内存之后不会被释放
- java对象和数组地址保存在占中,内容分配在堆里(栈自动管理——入栈分配出栈释放;堆用垃圾回收机制,没有活跃变量指向对象时自动释放)
- 自定义数据类型,将该类型数据所有的操作、属性封装起来,隐藏实现细节,使得能够在更高的层次上考虑操作数据(看类和对象,而非着眼于基本数据结构和函数)——分解概念,厘清概念之间的关系
- 继承
- 子类可以继承父类的非private的方法、重写父类的方法,也可以增加特有的方法
- java 中用
extends
关键字来表示继承关系;用关键词super
来指代父类,用this
指代自己 - java 中的在子类的构造方法中调用父类的构造方法时,需要写在子类的构造方法第一行。
- 多态
- 用父类类型名声明,而实际类型却是子类;
- 一种类型的引用变量可对应多种实际类型对象;
- assign instances of child class to Reference variable of base class;用子类实例为父类引用变量赋值