java的基础学习(二:String类的详细介绍)

文章目录

一、String类的概述和实例化

1.1 概述

String类:代表字符串。java程序中所有字符串字面值(如“abc”)都作为此类的实例实现。
字符串是常量,用双引号引起来表示,他们的值在创建之后不能更改。
1、String是一个final类,不可被继承。
2、String实现了Serializable接口:表示字符串是支持序列化的。
也实现了Comparable接口:表示String可以比较大小。
3、String对象的字符内容是存储在一个字符数组final char[] value中的。
4、String代表不可变的字符序列!简称:不可变性。
体现:
(1)当对字符串重新赋值时,需要重写指定内存区域赋值,不能用原来的value进行赋值。
(2)对现有的字符串进行操作时,也需要重新指定内存区域赋值,不能用原来的value进行赋值。
(3)当调用String的replace()方法修改字符或字符串时,也必须重新指定内存区域赋值,不能用原来的value进行赋值。
5、通过字面量的方式(区别于new方式)给一个字符串赋值,此时字符串声明在字符串常量池中(方法区)。
6、字符串常量池是不会存储相同内容的字符串的。

@Test
 public void test1() {
   
  String s1 = "abc";//字面量的定义方式
  String s2 = "abc";
  
  System.out.println(s1 == s2);//比较地址值,ture
  s1 = "123";
  System.out.println(s1);//123。相当于方法区中重新写一个“123”的字符串,然后把它的地址给s1
  System.out.println(s2);//abc
  
  
  s2 +="def";
  System.out.println(s2);//abcdef。相当于在方法区新造了一个“abcdef”字符串
  
  String s4 = "abc";
  String s5 = s4.replace('a','m');
  System.out.println(s4);//abc
  System.out.println(s5);//mbc
 }

1.2 有关内存空间的问题

jdk1.6,字符串常量池在方法区中,具体体现是永久代
jdk1.7,字符串常量池在堆空间中
jdk1.8,字符串常量池在方法区中,具体体现是元空间

1.3 String的实例化方法

1、方式一:通过字面量定义方式

String对象的创建:String str = "hello";

2、方式二:通过new+构造器方式

String s = new String(“abc”);这种方式创建对象,相当于创建了2个对象,一个是堆空间中new结构,另一个是char[]对应常量池的数据"abc"。
(1) String s1 = new String(); //本质上this.value = new char[0];
(2) String s2 = new String(String original); //this.value = original.value;
(3) String s3 = new String(char[] a); //this.value = Arrays.copyof(value,value.length);
(4) String s4 = new String(char[] a, int startIndex, int count);

@Test
 public void test2() {
   
  //通过字面量定义的方式,此时的s1和s2的数据javaEE声明在方法区的字符串常量池中
  String s1 = "javaEE";
  String s2 = "javaEE";
  //通过new+构造器方式:此时的s3和s4保存的地址值在堆空间中对应的地址值
  String s3 = new String("javaEE");
  String s4 = new String("javaEE");
  
  System.out.println(s1 == s2);//true
  System.out.println(s3 == s4);//false
  System.out.println(s1 == s3);//false
  
  Person p1 = new Person("Tom",18);
  Person p2 = new Person("Tom",18);
  System.out.println(p1.name.equals(p1.name));//true,因为String重写了equals方法
  System.out.println(p1.name == p2.name);//true,可以理解为比较的是属性,他们的name这个属性都对应“Tom”字符串的地址值
  p1.name = "Jerry";
  System.out.println(p2.name);//Tom
 }
 
}
class Person{
   
 String name;
 int age;
 public Person() {
   
  super();
 }
 public Person(String name, int age) {
   
  super();
  this.name = name;
  this.age = age;
 }

二、String类和其他结构之间的转换

2.1 String 与基本数据类型、包装类转换

@Test
 public void test1() {
   
  String str1 = "123";
  int i = Integer.parseInt(str1);//123
  String s1 = String.valueOf(i);//"123"
  String s2 = i + "";//此时的s2在堆中,因为有i有变量参与,就是在堆中
  System.out.println(str1 == s2);//false,因为str1在常量池,s2在堆里
 }

2.1.1 String --> 基本数据类型、包装类 :调用包装类的静态方法:parseXxx(str)

2.1.2 基本数据类型、包装类 -->String :调用String重载的valueOf(xx)或者用 num + “”;

2.2 String与byte[]之间的转换

注意: 编码解码要统一字符集,否则解码时会出现乱码

@Test
 public void test2() throws UnsupportedEncodingException {
   
  String str1 = "abc中国";
  byte[] bs = str1.getBytes();//使用默认字符集,进行转换
  System.out.println(Arrays.toString(bs));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值