Java String 基础解析

1年前 (2017-08-17) wang JAVA, 技术杂谈 0评论 已收录 210℃ 浏览数:67

很久了都在纠结一个问题,就是Java 中 String的问题。以前大一上课的时候并没有想的太多。然后慢慢的懂的稍微多一点就开始发现以前忽视了太多最底层最基本的知识。现在想要慢慢的拾起来。

String 不是 Java 中八种基本类型的一种。Java的简单类型及其封装器类 Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。

String在查看源码时我们发现。它是被final修饰的。


  /** The value is used for character storage. */
    private final char value[];

    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

意思就是在被创建后String的长度和内容是不能被修改的。

我们来看一个经典的面试问题  String s= new String("666");  这句话创建了几个对象。

首先在这里,我们简单引入常量池这个简单的概念。

常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

首先,我们要知道Java会确保一个字符串常量只有一个拷贝。 我们先看下面一段代码。

		String a = "666";		
		String b = "666";		
		System.out.println(a == b);

打印的 true 。我们知道 Java里面的 == 判断的是地址相等。这就说明两个字符串 a和b 它们的地址是相同的。Java常量池中有666这个字符串。然后a字符串会返回666的地址,b字符串同理。所以两个字符串的地址是相同的。

		String a = "666";
		String b = "666";
		System.out.println(a == b);
		
		String c = new String("666");
		System.out.println(a == c);

我们再来看这样一段代码。 a==b 打印的true 那么 c也是 666的字符串,a==c会打印什么?结果是 false 为什么这样子?

用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。

现在我们再归到刚才的问题。String s= new String("666");  这句话创建了几个对象。

“666”是一个String对象  JVM 首先会在String 池 中搜寻"666"对象 如果没有就在String池中 创建一个“666”对象,然后遇到new 运算符 在内存中(jvm堆中)构造一个String类对象 ,最好把对象的地址赋给对象引用s。所以这里总共创建了两个对象。第一个是在String池中创建,第二个是在内存中创建。(这里还需注意一点  jvm中 对象储存在堆内存中 变量储存在栈内存中)。

我们再来说String是不可变的

Java 中String是 immutable的,也就是不可变,一旦初始化,引用指向的内容是不可变的(注意:是内容不可变)。

也就是说,假设代码中有String str = “aa”;str=“bb”;,则第二条语句不是改变“aa”原来所在存储地址中的内容,而是另外开辟了一个空间用来存储“bb”;同时由于str原来指向的“aa”现在已经不可达,jvm会通过GC自动回收。
String x="fmn";
x.toUpperCase();
System.out.println(x);
x = x.toUpperCase();
System.out.println(x);
输出:
fmn
FMN
x.toUpperCase();
调用toUpperCase()确实返回了大写字符串,但是没有覆盖原来的,所以字符串还是小写的。

 

substring    包括左边不包括右边

 

定义有StringBuffer s1=new StringBuffer(10);s1.append(“1234”)则s1.length()和s1.capacity()分别是多少?

length 返回当前长度
如果字符串长度没有初始化长度大,capacity返回初始化的长度
如果append后的字符串长度超过初始化长度,capacity返回增长后的长度
博主

Just do it. Now or never.

相关推荐

嗨、骚年、快来消灭0回复。