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. 用来存放程序中永远是不变或唯一的内容(类代码信息、静态变量、字符串常量)。