java中字符串学习笔记

学过编程的都会知道,字符串是常量中的一种,然而java中的String不仅仅是常量,又是类,是一个特殊的类,是不可变和最终类;

1,不可变的String;说到不可变性,就要说java中String的内存分配了,如下图

  当运行代码:

        String str = "abc";

时,内存分布为

  

  这时候看起来和一个int a = 26;很相似了,StringPool是常量池里面用来存放字符串常量的地方,里面的值不可修改

而如果代码是这样写的:

  String str = new String("abc");

 

运行时,内存为:

  

理解了上面的内存分布情况后,就不难理解String的不变性了,java中程序员不能重载操作符,用于String的“+”和“+=”是java中仅有的两个重载过的操作符;

比如如下代码:

  String str1 = "abc";

  String str2 = str1 + "def";

运行到第二行代码时,实际上JVM又一次帮助我们做了一些工作:

public class MyString {
public static void main(String[] args){
String str1 = "abc";
StringBuilder temp = new StringBuilder("abc");
temp.append("def");
String str2 = temp.toString();
}
}

内存分配如下:

而其中J2SE5.0之后才使用了StringBuilder,之前是使用的StringBuffer,

二者使用起来没有什么区别,StringBuffer是线程安全的,速度慢些;StringBuilder是线程不安全的,但是速度快些;

2,String是最终类,不能有子类,这一点可以通过API文档看出:

时间: 2024-10-02 11:50:19

java中字符串学习笔记的相关文章

Java中jqGrid 学习笔记整理——进阶篇(二)_java

相关阅读: Java中jqGrid 学习笔记整理--进阶篇(一) 本篇开始正式与后台(java语言)进行数据交互,使用的平台为 JDK:java 1.8.0_71 myEclisp 2015 Stable 2.0 Apache Tomcat-8.0.30 Mysql 5.7 Navicat for mysql 11.2.5(mysql数据库管理工具) 一.数据库部分 1.创建数据库 使用Navicat for mysql创建数据库(使用其他工具或直接使用命令行暂不介绍) 2. 2.创建表 双击打

java中ormlite 学习笔记

1, 能否直接使用外键id ? # 声明一个外键对象 和 一样普通字段 新建表的时候会出错 , 查数据的时候也会出错 #  http://stackoverflow.com/questions/18988750/ormlite-android-setting-foreign-key-fields-directly # 声明了两个类,分别处理对象和id   2, 对象自己有CRUD ,BaseDaoEnabled   对象的实例方法有对应的crud 只要有继承就行 使用起来如果是new 出来的对象

java泛型的学习笔记[2]—实际使用

继上一文<java泛型的学习笔记[1]-基础知识>之后,本文将介绍泛型的一些应用和应用过程中遇到的问题. 在此之前,我们先给出一张类图:   1)泛型类型的子类型问题 我们首先来看这样一句代码.该行代码正确,因为Cat是Animal的子类型 Animal animal=new Cat();// 但是再看下一句代码: AarrayList<Animal> animals=new ArrayList<Cat>();//编译出错        这句代码编译出错,因为虽然因为C

Java中字符串 I

什么是 Java 中的字符串 在程序开发中字符串无处不在,如用户登陆时输入的用户名.密码等使用的就是字符串.其实,在前面的章节中我们就已经使用了字符串,例如我们在控制台中输出的 "Hello World" . "imooc" ."爱慕课"等. 在 Java 中,字符串被作为 String 类型的对象处理. String 类位于 java.lang 包中.默认情况下,该包被自动导入所有的程序. 创建 String 对象的方法: . Java 中字符

java中字符串处理问题

问题描述 java中字符串处理问题 在一个txt文件中,有几行字符串,每行的格式如下, abc1110011110102 abc123001111010a 根据条件做字符串的转换,条件: 1.字符串以abc开头 2.字符串中包含字串001111 3.在字串001111之后的第二个非0字符串如果是数字的话改变成0,如果不是数字不改变 因此,上面给出的两个字符串结果为 abc1110011110100 abc123001111010a 解决方案 public static void main(Str

[细说Java](2)Java中字符串为什么是不可变的

在Java中字符串(String)是一个不可改变的类.一个不可改变的类只是一个对象实例不可修改的简单类.当创建一个对象实例时,对象实例的所有信息都被初始化,并且信息不能被修改.对于不可改变的类来说还有很多优势.上一篇文章很好说明了为什么字符串被设计成不可改变的.只有你很好的掌握了内存,同步,数据结构等知识后,你才能很好的回答这个问题. 1. 字符串常量池的需求 字符串常量区是方法区(Method Area)中一块特殊的存储区域.当一个字符串被创建,如果该字符串已经存在字符串常量区时,相应的返回存

java中字符串转换问题

问题描述 java中字符串转换问题 比如我要将获得的值"pixiedust.ogg"转换成 "Pixie Dust"要怎么转换? 解决方案 String s = new String("abcd pixiedust.ogg 1234"); s = s.replace("pixiedust.ogg","Pixie Dust"); 解决方案二: String str="pixiedust.ogg&qu

java中字符串转换为字节数组请问用什么方法,字符串返回字节数组怎么做?

问题描述 java中字符串转换为字节数组请问用什么方法,字符串返回字节数组怎么做? java中字符串转换为字节数组请问用什么方法,字符串返回字节数组怎么做? 解决方案 http://blog.csdn.net/shuaihj/article/details/7478773http://blog.csdn.net/abin_gha/article/details/6317850 解决方案二: java中String类有getBytes方法,可以将字符串转成字节数组.字节数组可以直接写入到输出流中,

大神帮帮忙-关于java中字符串的拼接问题

问题描述 关于java中字符串的拼接问题 这个程序输出的结果为什么是25255?去掉双引号后结果为55,大神们能不能解释下原因? 解决方案 带上引号,后面是字符串连接 相当于 (x + y),toString() + "" + (x+y).toString() + y.toString() 所以是"25" + "" + "25" + "5" 也就是25255 不带引号,是算术运算,最后转换为整数. 解决方案