java的知识点15——String基础、String类和常量池、String类常用的方法、字符串相等的判断、组合模式

String基础

1. String类又称作不可变字符序列

2. String位于java.lang包中,Java程序默认导入java.lang包下的所有类

3. Java字符串就是Unicode字符序列,例如字符串“Java”就是4个Unicode字符’J’、’a’、’v’、’a’组成的。

4.  Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例。

5. Java允许使用符号"+"把两个字符串连接起来

   注:符号"+"把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式。

          当"+"运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接

"+"连接符

package cn.dym05;

public class Test05 {
	public static void main(String[] args) {
		int age=18;
		String str="age is "+age;
		System.out.println(str);
	}
}


String类和常量池

Java的内存分析中,我们会经常听到关于“常量池”的描述

实际上常量池也分了以下三种:

1. 全局字符串常量池(String Pool)

2. class文件常量池(Class Constant Pool)

3. 运行时常量池(Runtime Constant Pool)

常见问题:

String abc="a"+"b"+"c";  一共创建了几个对象?

String s=new String("hello"); 一共创建了几个对象?

关键词:对象个数  内存指向

String pool  机制     

目的:JVM为了提高性能和减少内存开销,实现数据共享

1. 为字符串开辟一个字符串常量池(存在于方法区)  方法区线程共享

2. 创建字符串常量时,首先检查字符串常量池中是否存在该字符串

3. 存在该字符串,返回引用实例;不存在,实例化该字符串并放入池中

优化String    String intern()

package cn.dym06;

public class StringPoolDemo {
	public static void main(String [] args) {
		String s1="Cat";
		String s2="Cat";
		String s3=new String("Cat");
		String s4=new String("Cat").intern();
		System.out.println(s1==s2);
		System.out.println(s1==s3);
		System.out.println(s1==s4);
	}
}


String类常用的方法 

                                                                            String类的常用方法列表

String类常用方法一

package cn.dym06;

public class StringTest1 {
	public static void main(String [] args) {
		String s1="core java";
		String s2="Core java";
		System.out.println(s1.charAt(3));//e
		System.out.println(s1.length());//9
		System.out.println(s1.equals(s2));//false
		System.out.println(s1.equalsIgnoreCase(s2));//true
		System.out.println(s1.indexOf("java"));//字符串s1中是否包含Java //5
		System.out.println(s1.indexOf("apple"));//-1
		String s=s1.replace(' ', '&');
		System.out.println("result is :"+s);//result is :core&java
	}
}

     

String类常用方法二

package cn.dym06;

public class StringTest2 {
	public static void main(String[] args) {
		String s="";
		String s1="How are you?";
		System.out.println(s1.startsWith("How"));//true
		System.out.println(s1.endsWith("you"));//false
		s=s1.substring(4);
		System.out.println(s);
		s=s1.substring(4, 7);//只能取到开头,不能取到结尾
		System.out.println(s);
		s=s1.toLowerCase();
		System.out.println(s);
		s=s1.toUpperCase();
		System.out.println(s);
		String s2="  How old are you!!  ";
		s=s2.trim();
		System.out.println(s);
		System.out.println(s2);
	}
}


字符串相等的判断

      1. equals方法用来检测两个字符串内容是否相等。如果字符串s和t内容相等,则s.equals(t)返回true,否则返回false。

      2. 要测试两个字符串除了大小写区别外是否是相等的,需要使用equalsIgnoreCase(“other String”)方法。

      3. 判断字符串是否相等不要使用"=="

字符串的比较"=="与equals()方法

package cn.dym06;

public class Test01 {
	public static void main(String[] args) {
		System.out.println("Hello".equalsIgnoreCase("hellO"));//true
		String s1="代止兮";
		String s2="代止兮";
		String s3=new String("代止兮");
		System.out.println(s1==s2);//true
		System.out.println(s1==s3);//false
		System.out.println(s1.equals(s3));//true //s1和s2里面的字符串内容是一样的
		
	}
}


组合模式

package cn.dym06;
class Cpu{
	public void run() {
		System.out.println("quickly…………");
	}
}
class MainBoard{
	public void connect() {
		System.out.println("connect…………");
	}
}
class Memory{
	public void store() {
		System.out.println("store…………");
	}
}

public class Computer {
	Cpu cpu;
	Memory memory;
	MainBoard mainBoard;
	public void work() {
		cpu.run();
		memory.store();
		mainBoard.connect();
	}
	public static void main(String[] args) {
		Computer computer=new Computer();
		computer.cpu=new Cpu();
		computer.memory=new Memory();
		computer.mainBoard=new MainBoard();
		computer.work();
		
	}
}


属性用于定义该类或该类对象包含的数据或者说静态属性属性作用范围是整个类体

· 栈内存

      1. 每个线程私有,不能实现线程间的共享!

      2. 局部变量放置于栈中。

      3. 栈是由系统自动分配,速度快!栈是一个连续的内存空间!

· 堆内存

      1. 放置new出来的对象!

      2. 堆是一个不连续的内存空间,分配灵活,速度慢!

· 方法区

      1. 被所有线程共享!

      2. 用来存放程序中永远是不变或唯一的内容(类代码信息、静态变量、字符串常量)。

猜你喜欢

转载自blog.csdn.net/qq_39368007/article/details/83690149