在上一节中,我们介绍了java的数据类型,其实就有了数据存储的机制,但是程序还需要拥有对数据的计算能力,这一节我们讲下Java的运算符和逻辑控制,再介绍下String的具体使用。
1. 运算符
基础运算符:就是四则运算
三目运算符:理解下面这句话就ok,在开发中常用!
public class TestDemo {
public static void main(String[] args) {
int x = 10;
int y = 12;
int result = x > y ? x : y;
System.out.println(result);
}
}
- 逻辑运算符:<、>、<=、 >=、 ==、&&、||
- 位运算符:目的是要将十进制转二进制,然后再进行二进制运算,主要有&,|,^,~,<<,>>
2. 逻辑控制
if分支: if,else,else if
switch:记得每个case后都要加break,才不会一直输出。
public class TestDemo {
public static void main(String[] args) {
int x = 10;
switch (x) {
case 0: {
System.out.println(0);
break;
}
case 10: {
System.out.println(100);
break;
}
default: {
System.out.println(1000);
break;
}
}
}
}
- 循环控制:几种常见循环,for,while,continue的使用
3. String类的使用
3.1 String的实例化
直接赋值: String str = “Hello”
类初始化: String str = new String(“Hello”)
3.2 String的比较
- ==:这个比较实际是内存地址的比较。并不是堆内存中保存内容的比较,内容的比较用equal()方法。
public class TestDemo {
public static void main(String[] args) {
String a = "Hello";
String b = new String("Hello");
String c = b;
System.out.println(a == b); //false
System.out.println(b == c); //true
System.out.println(a == c); //false
}
}
- equal():比较实际内容是否相同
3.3 String匿名对象
下面代码中,这里的Hello就是一个匿名对象,我们给他起了一个名字,就可以调用。
public class TestDemo {
public static void main(String[] args) {
String str = "Hello";
System.out.println(str.equals("Hello")); //true
System.out.println("Hello".equals(str)); //true
}
}
在实际开发过程中,上述两种比较的方法貌似相同,但是实际推荐第二种写法。为什么呢?
采用第一种写法,当str是一个用户的输入时候,如果str为null,那么这里编译就会报错,因为调用这个方法就报NullPointException。如果采用第二种,就不会报错。因为字符串的匿名对象不可能为null,如果比较的内容为null,就直接返回false。
3.4 String两种实例化方法的分析
- 1.直接实例化的形式:
String str1="hello";
String str2="hello";
首先开辟一块堆内存,用来存放”hello”,然后str放在栈内存中,直接指向这块堆内存。我们看下这两个的内存空间的情况。
为什么会这样呢?这里要介绍对象池的概念(Object Pool)
Java中有几个特殊的类,使用了共享设计,String就是其中一个。当使用直接实例化String的方式,字符串的内容会放在对象池中,如果再次调用,则直接去对象池中寻找是否有该内容,如果有,则直接指向原有的堆的地址,即“==”的比较也是相同的。
- 2.利用类的构造方法定义String
String str=new String("Hello")
继续看下内存关系:如果采用这种方法,将会多产生一块垃圾空间。
3.5 字符串的修改
首先,明确一点,字符串定义后就不能修改!
很多人质疑这一点,我们来分析下下面这段代码:
public class TestDemo {
public static void main(String[] args) {
String str = "Hello";
str+=" world!!";
System.out.println(str); //Hello world!!
}
}
我们来分析下上面这段代码在内存空间的情况:
我们可以看到,字符串str本身一直都没变,只是对象的引用发生改变,但是这样产生了很多的垃圾空间,所以在实际开发中,要防止多次改变String对象的情况。所以String不适合频繁修改。
总结下,String在开发中使用直接赋值的方法,比较内容时候用equal方法,并且不要经常修改String对象的内容。