1、String类
1.1、String的两种实例化方式
String本身是一个类,在String类中定义了如下的构造方法:
public String (String original)
可以接收一个String类的对象,并重新数实例化String对象,除此之外String还可以采用直接赋值的方式进行对象初始化。
public class StringDemo01
{
public static void main(String args[])
{
String str1 = "hello" ;
String str2 = new String("AUST") ;
System.out.println(str1 + " " + str2);
System.out.println() ;
}
}
1.2、String的比较方式
范例:用“==”比较
public class StringDemo02
{
public static void main(String args[])
{
String str1 = "hello" ;
String str2 = new String("hello") ;
String str3 = str2 ;
System.out.println("str1 == str2 -->" + (str1==str2)); //false
System.out.println("str1 == str3 -->" + (str1==str3)); //false
System.out.println("str2 == str3 -->" + (str2==str3)); //true
}
}
得出结果,用“==”比较的是两个对象的地址是否相等,具体来讲实际上比较的是地址的值,因为地址是以数值的形式存在的。
但是现在真正要比较的不是地址的值,而是两个字符串的内容,用String类中的equals()方法完成比较,此方法定义如下:
l Public Boolean equals(String str)
范例:使用equals()修改程序
public class StringDemo03
{
public static void main(String args[])
{
String str1 = "hello" ;
String str2 = new String("hello") ;
String str3 = str2 ;
System.out.println("str1 equals str2 -->" + str1.equals(str2)); //true
System.out.println("str1 equals str3 -->" + str1.equals(str3)); //true
System.out.println("str2 equals str3 -->" + str2.equals(str3)); //true
}
}
1.3、一个字符串实际上就是String的匿名对象
一个字符串是使用“””括起来的,那么一个字符串的常量实际上就属于String的一个匿名对象。
public class StringDemo04
{
public static void main(String args[])
{
String str1 = "hello" ;
System.out.println("hello".equals(str1));
}
}
1.4、String的两种实例化方式的区别
所有的操作以内存图形表示出来
String str1 = “hello” ;
此时在堆内存空间中,只开辟一个空间,不会产生多余的内容。
如果使用关键字new的方式呢?
String str2 = new String(“hello”) ;
可以发现,程序开辟了两个空间,与前一个相比方便多了。所以在开发中绝对不能使用关键字new调用String类的String(String org)的构造方法。
而且,如果直接使用赋值的方式也可以减少堆内存的开销。
public class StringDemo05
{
public static void main(String args[])
{
String str1 = "hello" ;
String str2 = "hello" ;
String str3= "hello" ;
System.out.println("str1 == str2 -->" + (str1==str2)); //true
System.out.println("str1 == str3 -->" + (str1==str3)); //true
System.out.println("str2 == str3 -->" + (str2==str3)); //true
}
}
实际上,以上的三个对象表示的都是同一个空间的引用,因为对于String来讲使用直接赋值的方式会在字符串池中保存内容。如果之后在声明字符串的时候发现内容一样,则不会重新开辟空间,而是从内存池中取出数据继续使用。
1.5、字符串的内容一旦声明后则无法修改
public class StringDemo06
{
public static void main(String args[])
{
String str1 = "hello" ;
str1 += " world" ;
System.out.println(str1);
}
}
虽然最终输出的结果改变了,但是字符串的内容真的改变了吗?
实际上来讲,字符串变量的改变改变的是内存空间的地址指向,而本身的字符串内容没有任何改变。所以,在开发中以下的操作代码绝对要避免。
public class StringDemo07
{
public static void main(String args[])
{
String str1 = "hello" ;
for (int i = 0 ; i< 100 ; i ++ )
{
str1 += i ;
}
System.out.println(str1);
}
}
以上操作要不断的断开已有的连接,指向新连接100次,整体代码的性能极其低,所以遇到此类代码绝对不要使用。
1.1、String的两种实例化方式
String本身是一个类,在String类中定义了如下的构造方法:
public String (String original)
可以接收一个String类的对象,并重新数实例化String对象,除此之外String还可以采用直接赋值的方式进行对象初始化。
public class StringDemo01
{
public static void main(String args[])
{
String str1 = "hello" ;
String str2 = new String("AUST") ;
System.out.println(str1 + " " + str2);
System.out.println() ;
}
}
1.2、String的比较方式
范例:用“==”比较
public class StringDemo02
{
public static void main(String args[])
{
String str1 = "hello" ;
String str2 = new String("hello") ;
String str3 = str2 ;
System.out.println("str1 == str2 -->" + (str1==str2)); //false
System.out.println("str1 == str3 -->" + (str1==str3)); //false
System.out.println("str2 == str3 -->" + (str2==str3)); //true
}
}
得出结果,用“==”比较的是两个对象的地址是否相等,具体来讲实际上比较的是地址的值,因为地址是以数值的形式存在的。
但是现在真正要比较的不是地址的值,而是两个字符串的内容,用String类中的equals()方法完成比较,此方法定义如下:
l Public Boolean equals(String str)
范例:使用equals()修改程序
public class StringDemo03
{
public static void main(String args[])
{
String str1 = "hello" ;
String str2 = new String("hello") ;
String str3 = str2 ;
System.out.println("str1 equals str2 -->" + str1.equals(str2)); //true
System.out.println("str1 equals str3 -->" + str1.equals(str3)); //true
System.out.println("str2 equals str3 -->" + str2.equals(str3)); //true
}
}
1.3、一个字符串实际上就是String的匿名对象
一个字符串是使用“””括起来的,那么一个字符串的常量实际上就属于String的一个匿名对象。
public class StringDemo04
{
public static void main(String args[])
{
String str1 = "hello" ;
System.out.println("hello".equals(str1));
}
}
1.4、String的两种实例化方式的区别
所有的操作以内存图形表示出来
String str1 = “hello” ;
此时在堆内存空间中,只开辟一个空间,不会产生多余的内容。
如果使用关键字new的方式呢?
String str2 = new String(“hello”) ;
可以发现,程序开辟了两个空间,与前一个相比方便多了。所以在开发中绝对不能使用关键字new调用String类的String(String org)的构造方法。
而且,如果直接使用赋值的方式也可以减少堆内存的开销。
public class StringDemo05
{
public static void main(String args[])
{
String str1 = "hello" ;
String str2 = "hello" ;
String str3= "hello" ;
System.out.println("str1 == str2 -->" + (str1==str2)); //true
System.out.println("str1 == str3 -->" + (str1==str3)); //true
System.out.println("str2 == str3 -->" + (str2==str3)); //true
}
}
实际上,以上的三个对象表示的都是同一个空间的引用,因为对于String来讲使用直接赋值的方式会在字符串池中保存内容。如果之后在声明字符串的时候发现内容一样,则不会重新开辟空间,而是从内存池中取出数据继续使用。
1.5、字符串的内容一旦声明后则无法修改
public class StringDemo06
{
public static void main(String args[])
{
String str1 = "hello" ;
str1 += " world" ;
System.out.println(str1);
}
}
虽然最终输出的结果改变了,但是字符串的内容真的改变了吗?
实际上来讲,字符串变量的改变改变的是内存空间的地址指向,而本身的字符串内容没有任何改变。所以,在开发中以下的操作代码绝对要避免。
public class StringDemo07
{
public static void main(String args[])
{
String str1 = "hello" ;
for (int i = 0 ; i< 100 ; i ++ )
{
str1 += i ;
}
System.out.println(str1);
}
}
以上操作要不断的断开已有的连接,指向新连接100次,整体代码的性能极其低,所以遇到此类代码绝对不要使用。