A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始



String 这个类非常特殊,下面是它的一些特点:
1、Sring类是final类型的,不能被继承。
2、例如:String str = "abc";//这样的语句生成的也是一个字符串对象,而这里却没有用new语句。
3、字符串String是常量,它们的对象被创建之后就是不能被改变的。
例如:
String s1 = "hello";
String s2 = " world";
String s3 = s1 + s2;
s1和s2对象生成之后就不能再被修改了,修改之后的字符串实际上都是生成了一个新的对象。s3也是生成的一个新的字符串对象,是把s1和s2里面的内容拼接到一块。
4、字符串支持使用“+”来连接多个字符串。实际上是生成了一个新的字符串对象,而不是在原有字符串的基础上追加内容。
5、java会维护着一个字符串池(String Pool,字符串池位于内存的栈中)【下面讲解String两种赋值方式的实际执行流程】:
a)、String s = “aaa”;(采用字面值方式赋值)
1) 查找String Pool中是否存在“aaa”这个对象,如果不存在,则在String Pool中创建一个“aaa”对象,然后将String  Pool中的这个“aaa”对象的地址返回来,赋给引用变量s,这样s会指向String Pool中的这个“aaa”字符串对象
2) 如果存在,则不创建任何对象,直接将String Pool中的这个“aaa”对象地址返回来,赋给s引用。
b)、String s = new String(“aaa”); (采用new方式创建对象)
1)  首先在String Pool中查找有没有“aaa”这个字符串对象,如果有,则不在Strng Pool中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对象,然后将堆中的这个“aaa”对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个“aaa”字符串对象。
2)  如果没有,则首先在String Pool中创建一个“aaa“对象,然后再在堆中(heap)创建一个”aaa“对象,然后将堆中的这个”aaa“对象的地址返回来,赋给s 引用,导致s指向了堆中所创建的这个”aaa“对象。


重点:栈和堆是计算机内存的两大主要区域,java中所有new出来的对象都位于堆中。


熟悉完以上知识之后重点查看以下代码,以及打印出来的每个结果:
Java代码  

  • package com.spring;  
  •   
  • public class ObjectTest {  
  •     public static void main(String[] args) {  
  •         Object object = new Object();  
  •         Object object2= new Object();  
  •         System.out.println(object == object2);//false  
  •         System.out.println("------------------------------");  
  •         System.out.println(object.equals(object2));//false【调用的是Object类内部的equals()方法】  
  •         System.out.println("-------------------------------");  
  •          
  •         String str = new String("aaa");  
  •         String str2 = new String("aaa");  
  •         System.out.println(str == str2);//false  
  •         System.out.println("-------------------------------");  
  •         System.out.println(str.equals(str2));//true【调用的是String类内部的equals()方法,这个方法是从父类Object里重写过来的】  
  •         System.out.println("-------------------------------");  
  •          
  •         String str3 = "bbb";  
  •         String str4 = "bbb";  
  •         System.out.println(str3 == str4);//true  
  •         System.out.println("-------------------------------");  
  •         System.out.println(str3.equals(str4));//true【调用的是String类内部的equals()方法】  
  •         System.out.println("-------------------------------");  
  •          
  •         String str5 = new String("ccc");  
  •         String str6 = "ccc";  
  •         System.out.println(str5 == str6);//false  
  •         System.out.println("---------------------------------");  
  •          
  •         String s = "hello";  
  •         String s1 = "hel";  
  •         String s2 = "lo";  
  •         System.out.println(s == s1 + s2);//false  
  •         System.out.println("---------------------------------");  
  •         System.out.println(s == "hel" + "lo");//true  
  •     }  
  • }  




下面这些打印结果在找工作之前需要记忆
Java代码  

  • package testPackage;  
  • class Test {  
  •         public static void main(String[] args) {  
  •                 String hello = "Hello", lo = "lo";  
  •                 System.out.print((hello == "Hello") + " ");  
  •                 System.out.print((Other.hello == hello) + " ");//other表示如果有其他类或包下面类里面也有一个字符串常量  
  •                 System.out.print((other.Other.hello == hello) + " ");  
  •                 System.out.print((hello == ("Hel"+"lo")) + " ");//两个常量进行拼接  
  •                 System.out.print((hello == ("Hel"+lo)) + " ");//一个常量和一个变量进行拼接,就会生成一个新的字符串对象  
  •                 System.out.println(hello == ("Hel"+lo).intern());//不管是常量还是变量拼接,只要调用inter()方法,一定返回的是池中的引用,而hello指向的也是字符串池中的对象,因此相等  
  •         }  
  • }  


评分

参与人数 1技术分 +1 收起 理由
夜默 + 1 多总结,论坛需要这样的技术帖子.

查看全部评分

1 个回复

倒序浏览
我分享一下string类的常用用法,希望大家,互相交流,共同进步:
Java中String类的常用方法:

public char charAt(int index)
返回字符串中第index个字符;
public int length()
返回字符串的长度;
public int indexOf(String str)
返回字符串中第一次出现str的位置;
public int indexOf(String str,int fromIndex)
返回字符串从fromIndex开始第一次出现str的位置;
public boolean equalsIgnoreCase(String another)
比较字符串与another是否一样(忽略大小写);
public String replace(char oldchar,char newChar)
在字符串中用newChar字符替换oldChar字符
public boolean startsWith(String prefix)
判断字符串是否以prefix字符串开头;
public boolean endsWith(String suffix)
判断一个字符串是否以suffix字符串结尾;
public String toUpperCase()
返回一个字符串为该字符串的大写形式;
public String toLowerCase()
返回一个字符串为该字符串的小写形式
public String substring(int beginIndex)
返回该字符串从beginIndex开始到结尾的子字符串;
public String substring(int beginIndex,int endIndex)
返回该字符串从beginIndex开始到endsIndex结尾的子字符串
public String trim()
返回该字符串去掉开头和结尾空格后的字符串
public String[] split(String regex)
将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马