java学习-关于字符串String

有必要总结记录一下java的学习,否则,永远只是记忆碎片化和always google(费时)

刚好,小伙伴给了一份自己做的review,在学习的过程中,update一下自己的见解和学习内容;

关于String:

 1 package string_keywords;
 2 /**
 3  * 参考url: http://developer.51cto.com/art/201106/266454.htm
 4  *
 5  * 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
 6  *
 7  * 当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量;
 8  *   多个常量连接;如果是像代码里s7的方式,字符串保存在堆?
 9  *
10  *
11  * 当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;
12  *
13  * */
14 public class Demo1 {
15     public static void main(String[] args) {
16         String s1 = "abc";
17         String s2 = "bcd";
18         String s3 = s1; //引用赋值,相当于s3 也指向了“abc”这个地址
19         String s4 = "abc";
20         String s5 = new String("abc");
21         String s6 = "ab"+"c";
22         String s7 = new String("ab")+"c";
23         s1 += s2;//字符串的连接时,实际上是新开辟了一个字符串
24         System.out.println(s1);
25         System.out.println(s3);
26         System.out.println(s1 == s3);
27         System.out.println("s4==s3:"+(s4==s3)); //字符串常量池,s4 = "abc"实际上是指向了已有的abc的地址,因此用==判断时,指向一致,所以返回true
28         System.out.println("s5==s3:"+ (s5==s3)); // new String 的方式不同于直接赋值(常量池),而是新开辟了一个空间,因此判断字符串是否相等一般采用equals方法
29         System.out.println("s6==s3:"+(s6==s3)); //常量连接常量,还在常量池
30         System.out.println("s7==s3:"+(s7==s3)); //new的方式,不再是常量
31
32         /*
33         * 疑问: String s = "a" +"bc";
34         * 我们知道a和bc是常量,abc存在于常量池,那么a和bc是否也存在于常量池,
35         * 如何验证呢?
36         *
37         * 内存跟常量池是什么关系?
38         * 为什么上述方式一般不推荐,而推荐使用StringBuffer,是因为扩大了常量池么?
39         *
40         * */
41     }
42 }

intern()补充:

        String s8 = s4.intern();
        String s9 = s5.intern();
        System.out.println("s8==s3:"+(s8==s3));//true
        System.out.println("s9==s3:"+(s9==s3));//true

目前存在的疑问是:

1. 内存跟常量池的更深入理解

2. intern()方法是否对常量池做的是一种动态的update?

java学习-关于字符串String,布布扣,bubuko.com

时间: 2024-12-29 01:16:05

java学习-关于字符串String的相关文章

Java 语法 索引 ----- 字符串(String)

组合吃烤串的各种方法 String a = "Hello"; String b = new String(" World"); //在循环里面的话要小心用 String c = a+b; // Hello World a += b; // Hello World String x = "Hello " + "World"; 比较字符串 boolean x = a.equals(b); // compares string bo

Java学习笔记--字符串和文件IO

1.Java中的字符串类和字符的表示 2.区分String,StringBuilder和StringBuffer 3.从命令行中给main方法传递参数 4.文件操作 1 Java中的字符串和字符 1.1 String类 字符串就是由一系列的字符组成的序列,在很多语言中,比如C语言,将其存储在一个数组中.现在运用Java的思想,就要将字符串视为一个对象,其中Java规定的String类有11个构造方法,同时还有至少40种实现的方法,通过String类的学习,可以很好地了解面向对象的类和对象的思想.

java中的字符串String

一.String简介d 参考:https://www.cnblogs.com/zhangyinhua/p/7689974.html String类代表字符串. java.lang.String: Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例. 字符串String的值在创建后不能被更改 String源码 1 /** String的属性值 */ 2 private final char value[]; 3 4 /** The offset is the firs

.Net学习笔记----字符串string的各种方法

端午节前学到了字符串处理,结果过了个节都忘了,今天拿出来重新过一遍,加深印象 随机输入心中想到的一个名字,然后输出它的字符串长度 //随机输入你心中想到的一个名字,然后输出它的字符串长度 Console.WriteLine("请输入你心中想的那个人的名字"); string name = Console.ReadLine(); Console.WriteLine("这个人的名字是{0}", name.Length); Console.ReadKey(); 两=个学员

Java学习之字符串的创建

转自:http://lavasoft.blog.51cto.com/62575/80034/ Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 一.从根本上认识java.lang.String类和String池 首先,我建议先看看String类的源码实现,这是从本质上认识String类的根本出发点.从中可以看到: 1.String类是final的,不可被继承.public final class String.

Java中的字符串-String & StringBuilder

引言: 操作系统课程上学习的生产者消费者模型可以说是学习并发的最好例子.这里需要注意Java不支持进程,只支持多线程.本篇文章将以一个最简单的生产者消费者模型进行Java并发的讲解.学习了本篇博文你应该学会了一下几个内容 1. 多个线程如何正确并发对一个变量进行读和写 2. 生产者消费者模型的实现 Java并发: 上文说了Java中没有进程只有线程,所以Java的并发只涉及到线程.在Java里可以通过两种方法创建一个线程,第一种为继承Thread类,第二种为实现Runnable接口.两种方法个人

Java学习之字符串类

String在Java中是一个类类型(非主类型),是一个不可被继承的final类,而且字符串对象是一个不可变对象.声明的String对象应该被分配到堆中,声明的变量名应该持有的是String对象的引用. 运行期计算得到的字符串会得到一个新的字符串.tag="hel"+tag; 这种现象是Java为了效率而赋予String的特殊性.字符串是不可变的,字符串被分配了空间和初始值后值就不可变化.一旦变化,就会放弃原有的对象而分配新的空间给变化后的字符串.频繁地赋新值,会给程序运行效率带来极大

Java学习笔记之String、StringBuffer和StringBuilder

更多博文可参考我的个人博客:贱贱的梦想 基本概念 String:此类代表字符串常量,它们的值在创建之后不能更改. StringBuffer:是一个线程安全的可变字符序列,它与String一样,在内存中保存的都是一个有序的字符串序列(char类型的数组),不同点是StringBuffer对象的值是可变的. StringBuilder:与StringBuffer类基本相同,都是可变字符串系列,不同点是StringBuilder是线程不安全的. 分析 简单的说,String类型和StringBuild

Java学习(二):String、StringBuffer和StringBuilder

String类是final的,String类其实是通过char数组来保存字符串的.对String对象的任何改变都是重新生成新的对象,原对象不动. 1)对于直接相加字符串,效率很高,因为在编译器便确定了它的值,也就是说形如"I"+"love"+"java"; 的字符串相加,在编译期间便被优化成了"Ilovejava". 对于间接相加(即包含字符串引用),形如s1+s2+s3; 效率要比直接相加低,因为在编译器不会对引用变量进行优