一、面向过程和面向对象
面向过程:强调的是过程,也就是完成功能的每一个步骤都需要自己来实现!
面向对象:强调的是对象,由对象帮助我们完成具体的功能!
举例:吃烤鸭
面向过程:买一只小鸭子--买一些饲料--开始养--养大了--杀死--拔毛--煮熟--烤--开吃。
面向对象:去全聚德买一份烤鸭--开吃。
二、String
Java中的String不属于基本数据类型。它是Java中的一种引用数据类型,通常被视为字符串类型。
2.1 如何比较两个字符串是否一致
==方法:不可以用==来比较两个字符串是否相等。
在Java中,“==
” 运算符用于比较两个对象的引用是否相同,即判断它们是否指向同一个内存地址。当使用“==
” 运算符比较字符串时,它实际上比较的是字符串对象的内存地址,而不是字符串的内容。
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1 == str2); // 输出 true,因为它们指向相同的内存地址
System.out.println(str1 == str3); // 输出 false,因为str3是一个新的对象
equals
方法:equals
方法用于比较两个对象的内容是否相等,对于字符串来说,它比较的是字符串的内容是否相同。
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1.equals(str2)); // 输出 true,因为它们的内容相同
System.out.println(str1.equals(str3)); // 输出 true,因为它们的内容相同
2.2 String值能否被修改
在Java中,String
对象是不可变的,一旦创建,其内容就不能被修改。这是因为 String
类的 final
修饰符确保了 String
类不能被继承,从而避免了可能的修改行为。
尽管 String
对象本身是不可变的,但你可以改变对 String
引用的指向。
String s = "Hello";
s = "World"; // s 现在引用了一个新的 String 对象 "World"
在这个例子中,原来的 String
对象 "Hello"
并没有被修改成别的内容,而是 s
引用从指向 "Hello"
转变为指向了新创建的 "World"
对象。
总结:虽然不能修改 String
对象的内容,但是可以改变引用的指向。
2.3 字符串常量池
在Java中,字符串常量池是存储字符串字面量的内存区域。当你创建一个字符串时,JVM会首先检查字符串常量池。如果字符串已经存在池中,它将返回对现有字符串的引用,而不是创建一个新的副本。这是一项优化,目的是提高性能和减少内存使用。
String s1="a";
String s2=new String("a");
s1会首先检查字符串常量池。如果字符串已经存在池中,它将返回对现有字符串的引用,而不是创建一个新的副本。
s2会直接创建一个字符串,并指向它。
String s1 = "aa";
String s2 = "bb";
String s3 = s1 + s2;//new String("aba"+"ac");
String s4 = "aabb";
String s5 = "aa" + "bb";
System.out.println(s3 == s4);// 输出 false
System.out.println(s4 == s5);// 输出 true
s1在常量池创建字符串"aa",并指向它。
s2在常量池创建字符串"bb",并指向它。
s3是new出一个对象,存储在堆中,并指向它。
s4在常量池创建字符串"aabb",并指向它。
s5会先拼接”aa"和“bb”,然后赋值给s5,那么s5将直接指向常量池中的"aabb",即跟s4指向地址相同。