------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
String类及String类的相关操作方法,
this
关键字,
static
关键字,内部类
1.String
的两种实例化方式:
public String(String origiral)///
可以接收一个
String
类的对象,并重新实例化
String
对象,
除了此方法之外
String
还可以采用直接赋值的方式进行对象的实例化。
public class StringDemo01{
public static void main(String args[]){
String str1 = "hello"
//使用直接赋值的方式完成
String str2 = new String("MLDN") //通过构造方法完成
System.out.println(str1 + str2) //进行字符串的连接操作 } };
(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()方法完成比较: public boolean equals(String str) 以上程序修改为str1.equals(str2)
(3)一个字符串实际上就是String的匿名对象 一个字符串使用" "括起来,那么一个字符串常量实际上本身就属于String的一个匿名对象
(4)String的两种实例化方式的区别 String str1="hello"///表示在堆中开辟一个空间并将该空间地址赋值给栈中的str1 String str1=new String("hello")///表示先在堆中开辟一个字符串的匿名对象,然后在用new开辟一片新的空间,并将原对象值赋值给新的空间中,并将新开辟的空间地址赋值给栈内的str1,而原来的匿名对象所在空间为垃圾空间
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))
System.out.println("str2 == str3 --> " + (str2==str3))
System.out.println("str1 == str3 --> " + (str1==str3))
} };
结构输出的都是true,表示的是同一个空间引用,因为对于String来讲使用直接赋值的方式会在字符串池中保存,如果之后再声明字符串的时候发现内容一样,则不会重新开辟空间,而是从内存池中取出数据继续使用。
(5)字符串的内容声明后则无法修改
public class StringDemo06
{ public static void main(String args[])
{ String str = "hello" //在堆中生成一个空间,将空间地址赋值给str中 str += " world" //表示先开辟一个String的匿名对象,保存在新的空间中,然后将两String连
//接保存在另外的一个新的空间中,最后将新空间的地址值赋值给str,str原指向断开
System.out.println(str)
} };
(6)String类的常用操作方法
char charAt(int index)//根据字符串中的索引找到指定位置的字符
public char[] toCharArray()//将字符串变为字符数组
public String(char[] value)//将全部的字符数组变为String类型
public String(char[] value,int offest,int count )//将数组中的offest起始位置开始,长度为count的字符转换为数组
String concat(String str)//字符串的链接也可以用+号连接 (7)将字符串与字节数组
public byt[] getBytes()//将字符串变为字节数组
public String(byte[] bytes)//将字节数组全部变为字符串
public String(byte[] bytes,int offset ,int length)//将字节数组的offset开始,长度为length变为字符串
(8)判断是否以指定的字符串开头或结尾
public boolean startsWith(String prefix)//判断是否指定的字符串开头
public boolean endsWith(String suffix)//判断是否以指定的字符串结尾
(9)替换操作
public String replaceAll(String regex,String replacement)//将字符串中的regex采用replacement替换
(10)字符串截取 public String substring(int beginIndex)//从beginIndex开始全部截取 public String substring(int beginIndex,int endIndex)//从beginIndex开始到endIndex进行截取
(11)字符串拆分 public String[] split(String regex)//按照字符串regex拆分成字符串数组,如果两个引号见什么都不写则全部拆分
(12)字符串查找 public int indexOf(String str)//查找指定字符串的位置,如果查找不到返回-1,查找到返回0 if(str.indexOf(str2)!=-1)//返回的值不等于-1则查找到 public int indexOf(String str,int fromIndex )//从fromIndex开始查找str的位置 public boolean contains(String s)//查找指定的字符串,返回值我true或false
(13)字符串的其他操作 public String trim()//去掉左右空格
public int length()//取得字符串长度
public String toUpperCase()//转换成大写
public String toLowerCase()//转换成小写 引用,this指针,对象比较 (1)引用传递 注意画出内存分析图。
例子: class Person
{ private String name
private int age;
private Book book //一个人有一本书
private Person child;//一个人有一个孩子
public Person(String n,int a)
{ this.setName(n) this.setAge(a) }
public void setBook(Book b)
{ book = b }
public void setName(String n)
{ name = n }
public void setAge(int a)
{ age = a }
public Book getBook()
{ return book }
public String getName()
{ return name }
public int getAge(){ return age } };
class Book{
private String title
private float price
private Person person 一本书属于一个人,
public Book(String t,float p)
{ this.setTitle(t) this.setPrice(p) }
public void setPerson(Person p
){ person = p }
public void setTitle(String t)
{ title = t }
public void setPrice(float p)
{ price = p }
public Person getPerson()
{ return person }
public String getTitle()
{ return title }
public float getPrice(){ return price } };
public class RefDemo04
{ public static void main(String args[])
{ Person per = new Person("张三",30)
Book bk = new Book("Java基础",89.0f)
per.setBook(bk) //一个人有一本书
bk.setPerson(per) //一本书属于一个人
System.out.println(per.getBook().getTitle()) ; //由人找到其所拥有书的名字
System.out.println(bk.getPerson().getName()) //由书找到人的名字 } };
为了表示两个不同类的对象之间的联系,则可以在两个类中分别加入类的对象,并为它设置值。
(2)this关键字 this可以调用类中的属性:
this.属性; 可以调用类中的方法:this.方法(); 可以调用类中的构造方法:this();
还可以表示当前对象:
this class Person
{ private String name private int age; public Person()
{ System.out.println("新的对象产生了。") }
public Person(String name){ this() //调用无参构造
this.name = name } public Person(String name,int age)
{ this(name) //调用有一个参数的构造方法 this.age = age }
public void setName(String name){ this.name = name }
public void setAge(int age){ this.age = age }
public String getName(){ return this.name }
public int getAge(){ return this.age } };
public class ThisDemo05{ public static void main(String args[])
{ Person per = new Person("张三",30)
System.out.println(per.getName() + " --> " + per.getAge()) } };
使用this调用构造方法的时候,this语句应该放在第一句。在使用this调用构造方法的时候至少有一个构造方法是没有使用this()调用的,而此构造方法将作为调用的出口,一般这个出口都会使用无参构造完成。
当前对象:正在调用类中方法的对象。 如果直接输出一个已经实例化的对象,则输出的是这个对象的地址。 this.属性表示的是当前对象的属性。
(3)对象的比较 类中的对象能访问类中的私有属性。两个对象的比较,比较的是两个对象的属性是相等;另外如果两个对象的引用地址相同则是相等的对象。
class Person
{ private String name private int age;
public Person(String name,int age)
{ this.name = name this.age = age }
public boolean compare(Person per)
{ if(this==per){ //地址相等 return true }
if(this.name.equals(per.name)&&this.age==per.age)
{ return true }else{ return false } }
public String getName(){ return this.name }
public int getAge()
{ return this.age}}; public class CompareDemo03
{ public static void main(String args[])
{ Person per1 = new Person("张三",30)
Person per2 = new Person("张三",30)
if(per1.compare(per1))
{ System.out.println("是同一个人!") } }