1、字符串常用的三个类:String、StringBuffer、StringBuilder
- String是引用类型数据
- StringBuffer是线程安全的——append()方法有使用sychnolized修饰,但是性能会低一些;如果是在循环体内需要频繁的对字符串进行操作,推荐使用StringBuffer
例如:循环体内对String进行拼接操作,我们在进行发编译之后会发现,循环体内创建了多个StringBuffer对象,并进行append()操作,这样会增加内存的消耗,所以在类似的场景中我们可以使用StringBuffer来替换
public void test(){
String s = "hello";
for(int i = 0 ; i < 10 ;i++){
s = s + "world";
}
}
- StringBuilder是线程非安全的
2、浮点数不可以直接进行相等比较
浮点数不可以直接比较是否相等,应该将两个数的绝对值与一个非常小的数进行比较
// 比较x和y是否相等,先计算其差的绝对值:
double r = Math.abs(x - y);
// 再判断绝对值是否足够小:
if (r < 0.00001) {
// 可以认为相等
} else {
// 不相等
}
3、从键盘读入涉及到的类
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
4、引用类型的数据比较
引用类型的数据比较有两种方式: “==”、“equals()”
==大多数场景下比较的是两个引用的地址是否相同
equals则比较内存中的值是否相等(已重写Object中的equals()方法)
注:在使用equals()比较是否相等时,建议将一定不为null的放在前面,如“hello”.equals(s),否则当否贼当需要equals()中的内容为null时,则会出现nullPointException
5、switch的使用
- 如果case后面没有使用break,当前面的case匹配到,则后面的case都将被输出
- 如果switch语句中有default语句,当没有匹配到时,则会输出default中的内容
- switch支持的数据类型有:
6、super关键字的使用
如下代码在编译阶段会报错,子类构造方法中无法调用父类的构造方法
public class Main {
public static void main(String[] args) {
Student s = new Student("Xiao Ming", 12, 89);
}
}
class Person {
protected String name;
protected int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
class Student extends Person {
protected int score;
public Student(String name, int age, int score) {
this.score = score;
}
}
这是因为在所有的java代码中都要先调用父类的构造方法,加入在子类的构造方法中没有显示的调用,那编译器会自动帮我们增加对父类构造方法的调用,如下所示:
class Student extends Person {
protected int score;
public Student(String name, int age, int score) {
super();
this.score = score;
}
}
但是父类没有默认的构造方法,因此此处我们应该调用父类的有参构造方法
class Student extends Person {
protected int score;
public Student(String name, int age, int score) {
super(name, age); // 调用父类的构造方法Person(String, int)
this.score = score;
}
}
7、static
static修饰的变量在只会在第一次实例化的时候在内存开辟一个“空间”,后续的实例共享该空间