前言
Java中的数据类型分为两大类:基本数据类型、引用数据类型。
1. 基本数据类型(8种)
- 数值型:整型和浮点型{byte 、short 、int 、long 、float 、double }。
- 字符型:char型。
- 布尔型:boolean型。
2. 引用数据类型(3种)
- 数组
- 类
- 接口
Java把内存分为两种:一种是栈内存,一种是堆内存。
在函数中定义的基本数据类型变量和对象的引用变量直接储存在栈中,而堆内存用来存放由 new 创建的对象和对象的实例变量,以及数组。
Java 对String 对象特殊对待,在堆区域分成了两块,一块是字符串常量池(String constant pool),用于存储字符串常量对象,另一块用于存储普通对象和字符串对象。
一:String 类简介
- String 类代表字符串。
- 不可变性:String 类被 final 修饰,不能被继承和重写,代表不可变的字符串序列。
- 存储位置:字符串对象的引用都是存储在栈中的,在编译器即确定的字符串(直接用双引号创建的字符串对象)存储在常量池中,在运行期(new 出来的)创建的对象存储在栈中。
public final class String{ // final 修饰
implements java.io.Serializable, Comparable<String>, CharSequence
}
二、String 类创建对象
字符串创建有两种方式:
1. String str =" hello , java ! ";
2. String str =new String (" hello , java !");
两者都可以创建字符串对象,但它们生成的字符串在内存中的存取机制不同。
第一种:Java 为String 类提供了缓冲池机制,当直接使用字符串创建 String 对象时,JVM 会先去常量池中寻找是否有内容相同的字符串,若有,则直接把其地址赋给该对象,即用第一种方式创建的内容相同的字符串其地址也相同。若无,则把该字符串放入常量池。
package demo;
public class Test {
public static void main(String args[]) {
String str1="hello"; // 在常量池中首次创建字符串内容为"hello"的对象
String str2="hello"; // 没有创建新对象,而是将str1的引用赋给了str2
System.out.println(str1.equals(str2));
System.out.println(str1==str2);
}
}
运行结果:true
True
第二种:使用 new 关键字创建对象。该方法每使用一次 new 便会在堆中创建一个新的 String 对象。
public static void main(String args[]) {
String str1="hello"; // 第一种方式创建对象
String str3=new String("hello"); //第二种方式,在堆中创建对象,将其在栈中的引用赋给str3
String str4=new String(str1); // 第二种方式
System.out.println(str3==str4);
System.out.println(str1==str3);
System.out.println(str1==str4);
}
//输出结果:
False
False
False
三. String str =new String("china") 创建了几个对象?
new 一个对象时,会先去常量池中寻找 "china" 是否已经存在,如果没有则先在常量池中创建 "china" 对象,然后在堆中创建一个常量池中此 "china" 对象的拷贝对象。
总结:若常量池中 "china" 已经存在,则String str = new String("china") 只创建了一个对象,若不存在,则创建两个对象。
四. String 类的构造方法
- public String ();
初始化新创建的 String 类对象,使其表示空字符串序列。
- public String ( byte [] bytes);
通过使用平台默认的字符集解码指定的字节数组来创建对象。
- public String ( byte [] bytes,int index,int length);
通过使用平台默认的字符解码指定字节数组的指定位置的内容创建对象。
- public String (char[] value);
使用字符数组创建字符串对象。
- public String (char[] value , int startIndex , int numChars);
使用字符数组的指定位置创建字符串对象。
- public String ( String str)
使用字符串常量创建新对象。
String str1=new String();
System.out.println(str1);//空字符串
byte bytes[]={97,98,99,100,101};
String str2=new String(bytes);
System.out.println(str2);//abcde
String str3=new String (bytes,2,3);
System.out.println(str3);//cde
char chars[]= {'a','c','d','f','g'};
String str4=new String(chars);
System.out.println(str4);//acdfg
String str5=new String(chars,2,3);
System.out.println(str5);//dfg
String str6=new String("hello");
System.out.println(str6);//hello
结果输出:
abcde
cde
acdfg
dfg
hello
五. String 类常用方法
- 获取字符串长度
str.length();
String str ="hello";
System.out.println(str.length()) ; // 5
2. 获取字符在字符串中的位置
str.indexOf(String str);
从头开始查找字符在字符串中第一次出现的位置
str.indexOf(String str,int fromIndex);
从下标 fromIndex 开始查找字符在字符串中第一次出现的位置
str.lastIndexOf(String str);
返回指定字符在字符串中最后一次出现的位置,如果没有这样的字符,则返回-1
str.lastIndexOf(String str,int fromIndex);
返回指定字符在字符串中最后一次出现的位置,若无,则返回-1,且从指定下标处反向搜索。
String str="hello";
System.out.println(str.length()); //5
System.out.println(str.indexOf('l')); //2
System.out.println(str.indexOf('l',3)); //3
System.out.println(str.lastIndexOf('l')); //3
System.out.println(str.lastIndexOf('a')); //-1
System.out.println(str.lastIndexOf('l',4 )); //3
3. 获取字符串中某一个位置的字符
str.charAt(int index);
返回指定位置的字符
4. 截取字符串
str.substring(int fromIndex,int endIndex);
截取指定位置的字符串,并且不包含 endIndex 处的字符。
str.substring(int fromIndex);
从指定位置开始截取,直到字符串结束。
5. 字符串的比较
str.compareTo(str1);
对字符串按照字典顺序进行大小比较,根据返回值确定二者大小。返回值为正,则 str > str
str.compareToIgnore(String str1);
和compareTo()方法类似,比较时忽略大小写
str.equals(Object obj);
比较当前字符串和参数字符串的内容是否相同。若相同返回True,否则,返回False。
str.equalsIgnoreCase(Object obj);
同 equals 方法,比较时忽略大小写。
7. 字符串连接
str2 = str.concat(String str1);
用concat连接两个字符城成为一个新的字符串。
String str="hello";
String str2="java";
System.out.println(str.concat(str2)); // hellojava
8、字符串中字符的大小写转换:
小写转大写:str.toUpperCase();
大写转小写:str.toLowerCase();
String str1="hello";
String str2="JAVA";
String str3=str1.toUpperCase();
String str4=str2.toLowerCase();
System.out.println(str3);
System.out.println(str4);
9. 字符串中字符的替换:
str.replace(oldStr,newStr);
用新的字符代替原有字符。
String str="hello";
String str2=str.replace('l', 'b'); //将所有的字符都替换
System.out.println(str); // hello 从侧面反映出字符串的不可更改性
System.out.println(str2); // hebbo 替换后生成的新的字符
10、字符串中清除空格:
str.trim();
清除字符串str两侧的空字符串。
String str=" hello ";
System.out.println(str);
System.out.println(str.trim());
System.out.println(str.length());
System.out.println(str.trim().length());输出:
hello
hello
7
5
11、字符传中分割字符串为数组
str.split();
小编会单独介绍此方法。
总结:
以上就是今天要讲的内容,本文仅仅简单介绍了String 类。