涉及的知识点速通
- 关于变量和常量你都知道啥?
- &和&&、|和||有什么区别?
- 关于字符串的问题你能答对几道?
- 可以修改一个字符串中的值吗?
- 字符串使用==和equals判等的区别?
- 空串""和null串有啥区别?
- 这些String的常见API你都掌握了吗?
- String StringBuilder StringBuffer都是啥?
各位小伙伴们大家好,欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏,在这个系列专栏中我将记录浅学这本书所得收获,鉴于 看到就是学到、学到就是赚到 精神,这波简直就是血赚
扎哇太枣糕的博客首页
变量
首先,变量的声明遵循以下规范:
其次,Java支持一次声明多个变量但并不提倡,因为这种形式会降低程序的可读性(int i, j;),可以使用逐一声明的形式,而且变量的声明要尽可能的靠近变量第一次使用的地方
最后,变量声明之后还必须要进行初始化才能使用,否则会编译器就会认为这个变量的使用是非法的。变量的初始化有三种机制:
类变量(static修饰的变量)、实例变量可以使用构造器、显式赋值和初始化块三种机制进行初始化,但是局部变量则只能也必须使用赋值语句进行显式初始化。常量
Java中常量必须在main方法的外部使用final进行定义,常量定义的时候必须进行初始化,一旦初始化之后就无法改变值的大小,且常量的命名必须全部大写。静态变量和静态常量
静态变量也叫类变量是使用static修饰的变量,静态变量属于类而不属于任何单个的对象,也就是说即使不创建该类的对象这个静态变量依然存在,不管创建多少个对象都是共享这一个静态变量。非静态变量也就是实例变量就不一样了,实例对象属于对象,必须使用对象调用无法直接调,每创建一个对象都会得到一个实例变量的副本,不同对象之间互不影响 静态常量的使用频率要明显高于静态变量,在静态常量定义的时候往往都会加上final修饰,这样的话它既可以被其他类直接使用类名调用,又不用担心字段值被调用后随意修改产生的安全问题。之前输出语句的时候使用的out就是一个final修饰的PrintStream类型的静态常量,PrintStream类里又内置了print、println、printf等方法用于输出
&(逻辑与)和|(逻辑或)是逻辑运算符,&&(短路与)和||(短路或)是短路逻辑运算符。这两种运算符对应的的运算结果相同,与运算的话是全真为真、有假则假,或运算的是全假为假、有真则真。两种类型的运算符区别在于:逻辑运算符会执行完左右两边的表达式之后返回一个结果,短路逻辑运算符当能够得到结果的时候就会直接返回,也就是说短路与的左边结果为false就会直接返回false,短路或的左边结果为true就会直接返回true
补充一种进行位移运算的位运算符,位移运算就是对一个数值的二进制表示进行左右移动的运算,其中>>表示右移高位符号位补充,<<表示左移低位补0,>>>则是右移高位补0,注意:并没有<<<这个运算符
不能。因为Java中字符串并不是内置的数据类型,而是标准Java类库中提供的一个预定义类。字符串不只一种使用new的实例化方式,使用双引号("")括起来的字符都是String类的一个实例,使用new方式实例的对象对分配在堆内存中,使用双引号实例的对象在常量池中,字符串变量的值则是字符串对象的地址引用,不管使用哪种方式给字符串变量重新赋一个新值都是看上去改变了这个字符串的值,实际上只不过是改变了变量值的地址引用,原来的字符串对象还在内存中存储且值不变
由上图就得以验证我们之前的结论是正确的,使用双引号实例化的字符串对象存储在字符串常量池中,所以连续创建两个内容相同的字符串会指向同一个地址。而且使用new实例化的字符串对象存储在堆内存中,所以说使用两种方式实例化内容相同的字符串对象,地址会不同。接下来的三种方式改变字符串的内容,地址都和原地址不同,也就是证实了字符串是一个不可变的数据类型
==是对两个字符串变量的引用地址值是否相等进行判断,就算字符串的内容相等如果存储的位置不同也会返回false。String类中重写了Object的equals方法使之可以对字符串的内容进行判等,查看源码不难发现重写之后的equals方法是对两个字符串的地址、长度、每一个字符顺序进行判断,在判断的过程中但凡有一个不等就直接返回false。
趁热打铁,结合字符串的两种实例化方式和两种判等方式找几个题做做,答案放在文末了,记得去对照一下 补充一个知识点,如果想忽略字母大小写比较两个字符串的内容是否相等,可以使用equalsIgnoreCase方法,用法与equals相同
空串是一个长度为0内容为空的字符串,属于是一个字符串对象;null串表示这个变量并未引用任何的对象或者基本数据类型值,属于是一个供引用数据变量引用的值。空串引用String的API 会返回值,但是null串调用String的API 的话会报NullPointerException的错误。一般情况下都会使用if(str != null && str.length() != 0)对字符串进行检查,符合条件才会使用这个字符串。
拓展一个compareTo方法,该方法会对比两个字符串并返回一个int数值,对比规则:从第一个字符开始相比较,返回第一个不同的两个字符的ASCII码的差值(前减后),如果说一个字符串是另一个的字串就返回二者的长度差
这三种都是Java中用来操作字符串的类。区别就是String声明一个不可变的对象,每次操作都会生成一个新的对象,并将新的对象地址赋给原来的字符串变量,而StringBuilder和StringBuffer都是在原来的对象上进行操作并不会产生新的对象,所以说在需要经常改变字符串内容的情况下最好使用这两种类。 StringBuilder和StringBuffer也是有区别的,StringBuffer线程安全但是性能相对较差,StringBuilder线程不安全但是性能较高,于是单线程的情况下推荐使用StringBuilder,多线程的话就使用安全的StringBuffer