标签:String 认识 System println str 字符串 hello
String 之前我们接触过,String 属于引用类型
创建字符串
//方式一
String str = "hello";
//方式二
String str = new String("helloworld");
//方式三
char[] arr = {'a','b','c'};
String res = new String(arr);
字符串比较相等
String str1 = "hello";
String str2 = "hello";
System.out.println(str1==str2);//true
str1 和 str2 都是引用,指向同一个对象
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1==str2);//==比较两个引用是否指向同一个对象 false
为什么这里是 false 呢?大家想想,str1 指向一个字符串, str2 创建了一个对象,内容是 hello ,根据类和对象的知识,我们知道,创建对象, new 关键字,在堆上开辟空间,而 String 是引用类型,比较相等,实际是比较两个引用是否指向同一个对象,我们来观察一下在内存中的结构
在内存中,是有字符串常量池存在的,上述 str1 引用指向的 hello 就存放在字符串常量池中,那么,何为字符串常量池
由字面意思,首先它是字符串,其次他是一个常量,所以存在字符串常量池中的数据是不能被修改的,这样的优点在于如果我们已经存储过 hello 了,下次用到 hello ,直接在字符常量区中查找,不需要再开辟空间存储
那么,在java中,比较字符串内容相等,用到的是 String 类中的 equals 方法
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));//true
// System.out.println(str2.equals(str1)); // 或者这样写也行
System.out.println(str1==str2);//false
String 类中,对象实例化
直接赋值
String str1 = "hello" ;
String str2 = "hello" ;
String str3 = "hello" ;
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // true
System.out.println(str2==str3);//true
采用构造方法
String str = new String("hello");
这样的做法有两个缺点:
- 如果使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存将成为垃圾空间(字符串常量 “hello” 也是一个匿名对象, 用了一次之后就不再使用了, 就成为垃圾空间, 会被 JVM 自动回收掉).
- 字符串共享问题. 同一个字符串可能会被存储多次,浪费空间
解释 String 类两种对象实例化的区别
- 直接赋值:只会开辟一块堆内存空间,将字符串存储在字符常量池中,以供下次使用
- 用构造方法:会开辟两份堆内存空间,其中一块会成为垃圾空间,不会入池,可以手动入池,用 intern()方法,一般建议第一种方法
字符串的不可变性
String str = "hello" ;
str = str + " world" ;
str += "!!!" ;
System.out.println(str);
// 执行结果
hello world!!!
在平时的赋值操作中,赋值会改变原有的值,而字符串是不会的,他是不可变的
字符、字节、字符串之间的相互转换
//字符串转字符数组
public class Main {
public static void main(String[] args) {
String str = "helloworld";
char[] arr = str.toCharArray();
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i] );
}
//字符数组转字符串
System.out.println(new String(arr,5,5));
//System.out.println(str.charAt(10)); 错误
}
}
//执行结果
h
e
l
l
o
w
o
r
l
d
world
//字符串转字节数组
public class Practice {
public static void main(String[] args) {
String str = "helloworld";
byte[] b = str.getBytes();
System.out.println(b);
//字节数组转字符串
System.out.println(new String(b));
}
}
//执行结果
[B@1b6d3586
helloworld
字符串的常见方法
方法名称 | 描述 |
---|---|
public boolean contains (CharSequence s) | 判断一个字符串是否存在 |
public int indexOf (String str) | 从开始位置查找指定字符串,查到了,返回开始的下标,查不到,返回 -1 |
public int indexOf (String str,int fromIndex) | 从指定位置查找字符串位置 |
public String[] split (String regex) | 将字符串全部拆分 |
public String[] split (String regex,int limit()) | 将字符串部分拆分,该数组长度就是 limit 极限 |
public String substring (int beginIndex) | 从指定索引截取到结尾 |
public String substring (int baginIndex,int endIndex) | 截取部分内容 |
public String trim () | 去掉字符串中的左右空格,保留中间空格 |
public boolean isEmpty () | 判断是否为空字符串,但不是 null ,而是长度为 0 |
为了方便字符串的修改,提出了 StringBuffer 和 StringBuilder
String 和 StringBuilder StringBuffer 区别
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作
标签:String,认识,System,println,str,字符串,hello 来源: https://blog.csdn.net/Beverly_/article/details/104582420
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。