数据类型在编程语言中:
类型是一组值以及可以对这些值进行操作
变量 存储一个特定类型值的命名位置
基本数据类型: int 限制在±2 ^ 31的范围内,或者大约为±20亿
long 2^63
boolean double char byte float short 在堆栈中只有使用时才存在
对象数据类型:BigInteger表示一个任意大小的整数
String
基本类型是小写字母,而对象类型以大写字母开头
对象引用类型:在堆上,垃圾被收集 类,接口,数组,枚举,注释 Classes, interfaces, arrays, enums, annotations 有些是可变的,有些不可变
对象(所有非基元都是对象)
除了Object类的其余类都有父类,通过extends子句指定
如果省略了extends子句则默认为Object
一个类是其所有超级父类的一个实例 - 从它的超类继承可见的字段和方法 - 可以覆盖方法来改变它们的行为
基本数据类型的包装类:
将基本数据类型封装为对象
Boolean, Integer, Short, Long, Character, Float, Double(主要用在集合上) 效率低,能不用就不用 编译器自动进行转换
运算符:+ - * / 括号>乘除>加减
字符串连接(+)
静态与动态数据类型:
java是一种静态类型的语言
所有变量的类型在编译时已知(程序运行之前)
类型检查
静态类型检查:程序进行之前,错误自动发现
动态类型检查:执行代码时自动发现错误
没有检查:语言根本无助于您找到错误。 你必须亲自观察,否则最终会得到错误的答案
静态捕获一个bug比动态捕获它要好,动态捕获它比根本没有捕获它要好
静态检查意味着在编译时检查错误
静态类型:避免因使用错误类型的操作而导致的bug (编程时静态类型会捕获这个错误,不会等程序执行到该行)
语法错误,如额外的标点符号或假词
错误的参数数量 错误的参数类型 错误的函数返回值类型
动态类型:
静态检查往往是关于类型的,与变量具有的特定值无关的错误,静态检查保证了变量会从集合中获得一些值,但是直到它运行才知道它具体有哪个值,所以如果错误是某些值引起的,比如被0除,索引超出范围,不会引起编译器不会引发关于它的静态错误。但是动态检查往往是特定值的错误。
原始类型并不是真正的数字,
可变形和不变性
改变变量是在其指向的地址,尽量避免变化。
不变性
不变数据类型创建完后,值不可更改。不变引用,一旦指定引用位置,不可再次指定。
为了使引用不可变 final
编译器如果不确定final 变量只在运行时分配一次,会报错,静态检查
最好使用final来声明方法的参数和尽可能多的局部变量。
final class不能被继承 final变量它始终包含相同的值/引用,但不能更改 final方法意味着它不能被子类覆盖
对象是不可变的:一旦创建,它们总是表示相同的值
对象是可变的:它们具有改变对象值的方法
String是不可变类型。一个String对象总是表示相同的字符串 String是不可变的,一旦创建,String对象始终具有相同的值 如果进行改变只能重新创建一个新的对象
StringBuilder是可变的类型 它有删除部分字符串,插入或替换字符的方法等
只有一个对象的引用时,不变性和可变性区别不大,当对象有其他引用时,它们的行为方式会有很大的差异
可变性的优点
使用不可变的字符串会产生大量的临时副本,浪费很多的时间。
良好的性能
方便的共享:通过共享一个公共的可变的数据结构,程序的两部分可以更方便的交流。
全局变量的缺点:
不可变类型从出错角度考虑更加安全,更加容易理解,且易于更改,易变性使得难以理解你的程序正在做什么,并且执行合同要困难得多
安全的使用可变类型:局部变量,不会涉及共享;只有一个引用。
如果有多个引用(别名),使用可变类型就非常不安全。
快照图作为代码级,运行时和瞬间视图
对于我们绘制运行时发生的事情的图片会很有帮助,以便理解微妙的问题,在运行时表示程序的内部状态 - 它的堆栈(正在进行的方法和它们的局部变量)及其堆(当前存在的对象)
不可变对象:用双线椭圆。
不可变的引用:用双线箭头。
引用是不可变的,但指向的值却可以是可变的。
可变的引用,也可指向不可变的值。
Java也为我们提供了不可变的引用:一次赋值且永不重新赋值的变量。 为了使引用不可变,用关键字final声明它
数组集合
int[] a = new int[100]; int []数组类型包含所有可能的数组值,但是一旦创建了特定的数组值,永远不会改变其长度
List代替固定长度的数组 ,类型T的可变长的序列 List<Integer> list = new ArrayList<Integer>(); list.get(i) list.set(i,2) list.size() list.add(2) List是一个接口
List Set Map都是接口
List: ArrayList and LinkedList
Set: HashSet
Map: HashMa
迭代器是一个可变类型,迭代器是一个对象,它遍历一组元素并逐个返回元素。list.remove()移除某一元素后,后面的元素向前覆盖
不可变类型的利用:
Java的集合类型(List,Set,Map)的通常实现都是可变的:ArrayList,HashMap等。集合实用程序类具有用于获得这些可变集合的不可修改视图的方法:
Collections.unmodifiableList
Collections.unmodifiableSet
Collections.unmodifiableMap
可变性对于性能和便利性非常有用,但它也会通过要求使用对象的代码在全局级别上良好表现而产生错误风险,这极大地增加了我们必须做的推理和测试,以确保其正确性。
对象是由快照图中的圆圈表示的值,而不可变的对象是具有双边框的值,表示它永远不会更改其值。
引用是指向一个对象的指针,不可变引用是带有双线的箭头,表示该箭头不能移动以指向不同的对象