- 浏览: 242772 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
g_man1990:
g_man1990 写道在同一个文件夹下,jar包是按顺序从上 ...
tomcat中class和jar的加载顺序 -
g_man1990:
在同一个文件夹下,jar包是按顺序从上到下依次加载,按什么顺序 ...
tomcat中class和jar的加载顺序 -
上凌九霄:
谢谢
tomcat中class和jar的加载顺序 -
waitgod:
好文,值得收藏!!
HotSpot是什么? -
xiaomogui:
sd6733531 写道楼主,我想问点问题》
1.mixed, ...
HotSpot是什么?
1.String源码中队String类的描述:
The String class represents character strings. All string literals in Java programs, such as "abc", are
implemented as instances of this class.
Strings are constant; their values cannot be changed after they are created.String buffers support mutable strings.Because String objects are immutable they can be shared.
(注意这一句:因为String是不可变的,所以String字符串能够共享)
2. String类的定义:
public final class String...,因为是final的所以不能被其它类继承。
主要有四个变量:
value[] 字符数组 主要存放字符串的值;String和StringBuffer的可变和不可变本质上是体现在这个字段上的。
offset 字符串的当前索引;
count 字符串的长度;
hash 字符串的hash码;
当new一个空对象的时候 ,因为String不可变,所以new 一个String是没有多大意思的,如:
public String() {
this.offset = 0; // 字符串第一位索引 this.count = 0; // 字符串总数 this.value = new char[0]; // 字符数组 }
// 带参数的构造方法
public String(String original) {
int size = original.count; char[] originalValue = original.value; char[] v; if (originalValue.length > size) { // The array representing the String is bigger than the new // String itself. Perhaps this constructor is being called // in order to trim the baggage, so make a copy of the array. int off = original.offset; v = Arrays.copyOfRange(originalValue, off, off+size); } else { // The array representing the String is the same // size as the String, so no point in making a copy. v = originalValue; } this.offset = 0; this.count = size; this.value = v; }
3. String不可变和StringBuffer可变
String s1= new String("abc");
String s2 = s1; System.out.println(s2 == s1); // 返回true s2 = s2+"d"; System.out.println(s2 == s1);// 返回false,问什么会这样那,下面会有解释 StringBuffer sb1 = new StringBuffer("abc"); StringBuffer sb2 = sb1; System.out.println(sb1 == sb2);// 返回true sb2.append("d"); System.out.println(sb1 == sb2);// 返回true
对于s2 = s2+"d";的处理步骤实际上是通过建立一个StringBuffer(有的地方说是创建一个StringBuilder),然后调用append(),
最后再将StringBuffer toSting();所以str = str + "d";可以等同于:
StringBuffer sb = new StringBuffer(s2);
s2.append("d"); s2 = s2.toString();
关键是最后一步,StringBuffer的toString方法是重新new 一个String对象。源代码:
public synchronized String toString() {
return new String(value, 0, count); }
String 有一个常量池在方法区中(存放的是一些classes文件),不是在堆中(存放new出来的对象),每当new一个String对象的时候,都会先到字符串常量池中去找,如果没找到,则在常量池中 创建一个String的对象,然后再在堆中创建一个String对象。如果在常量池中找到了,则直接在堆中创建一个对象。
String声明式创建对象,就是用new创建。如String s = new String("123");
String隐含式创建对象,如:String s = "123"; StringBuffer不能这样赋值,只能用new。
上面的两种方式是不同的。
隐含式创建对象不会再堆中创建对象。而是引用常量池中的对象(如果常量池没有,则在常量池中创建一个对象,不会再堆中创建);
String s4 = "hello";
String s5 = "a" + "b" + s4; String s6 = s4 + "b" + "a";
上面s4和s5的创建过程是不同的。
s5在编译的时候会优化成String s5 = "ab" + s4;
然后
StringBuffer sb = new StringBuffer("ab");
sb.append(s4); return sb.toString();
而s6不会优化,因为字符编译的顺序是从左到右的。
StringBuffer sb = new StringBuffer(s4);
sb.append("a"); return sb.toString(); StringBuffer sb = new StringBuffer("hellob"); sb.append("a"); return sb.toString();
4. StringBuffer:
文档说明:
A thread-safe, mutable sequence of characters.
A string buffer is like a String}, but can be modified. At any
point in time it contains some particular sequence of characters, but
the length and content of the sequence can be changed through certain
method calls.
StringBuf 默认是一个16位的字符数组:
public StringBuffer() {
super(16); // 调用父类的AbstractStringBuilder方法,下面的这个方法 }
AbstractStringBuilder(int capacity) {
value = new char[capacity]; }
StringBuffer 的appen的方法
public AbstractStringBuilder append(String str) {
if (str == null) str = "null"; int len = str.length(); if (len == 0) return this; int newCount = count + len; if (newCount > value.length) expandCapacity(newCount); // 增加数组的长度。实际上是新建一个数组,把原来数组的值拷贝到新数组中 str.getChars(0, len, value, count); // 把str的值拷贝到value中 count = newCount; return this; }
- 《java编程思想_第四版》_英文版.pdf (6.4 MB)
- 下载次数: 3
发表评论
-
java 重载和重写
2013-02-06 13:10 0Java 方法重载 (OverLoad)与方法覆盖(Over ... -
java-线程同步
2013-02-06 13:10 0原子性:哪些指令必须是不可分割的。在Java内存模型中,这些规 ... -
java序列化
2013-02-06 13:08 01, 比较常见的做法有两种:一是把对象包装成JSON字符串传 ... -
java动态内容绑定
2013-02-06 13:08 01, CDN 中动态内容是不 ... -
java-静态绑定
2013-02-06 13:07 0private、static、final修饰的方法是静态绑定的 ... -
java内存管理工具
2013-02-06 13:04 01.jps .:与unix上 ... -
ConcurrentHashMap
2013-02-06 13:01 01, HashTable容器在竞争激烈的并发环境下表现出效率 ... -
java队列
2013-01-21 17:25 01. 新的java.util.concurrent包可用的具 ... -
java反射和动态代理
2012-03-02 00:19 01. 运行时类型信息(Runtime Type Infomat ... -
java io和nio
2012-03-02 00:19 01 。关于字节流(OutputStream,InputStre ... -
java规范( The Java Language Specification, Third Edition)
2011-02-05 13:25 0http://java.sun.com/docs/boo ... -
IOException while loading persisted sessions: java.io.EOFException
2010-12-30 00:34 1832ERROR [main] session.ManagerBas ... -
java基础之字符串反转
2010-12-14 02:06 0public class Test { /** ... -
java基础之变量
2010-12-07 22:39 10111. Class文件加载流程 ... -
java基础之内存分配
2010-11-16 00:25 11971. 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈 ... -
java基础之堆栈
2010-11-16 00:24 11921. JVM在它的生存周期中有一个明确的任务, ... -
Think in java4笔记 --- 容器之集合(Map)
2010-11-16 00:22 12074. Map接口 Map接口不是Collec ... -
Think in java4笔记 --- 容器之集合(Collection,List,Set)
2010-11-16 00:20 1197... -
Think in java4笔记 --- 容器之集合(历史)
2010-11-16 00:19 994当我们编写 ... -
Think in java4笔记 --- 容器之数组和集合类的区别
2010-11-16 00:18 1481数组和其它集合类的区别: 主要体现在效率和类型, ...
相关推荐
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
java jdk中string类的源码 ,了解string类的书写,定义和声明
Java源码文档src是Java开发中的重要参考资料,它包含了Java开发工具包(JDK)的源代码,让我们有机会深入理解Java平台的核心类库。通过学习这些源码,开发者可以更好地了解Java API的工作原理,提高编程技能,以及...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
java原始之String whatsapp字符串解码器 解码whatsapp for Java的源代码中的所有字符串。 您可以在命令行中使用:java -jar wsdec.jar -d
在学习Java源码时,还可以研究其标准库(JDK)中的类,如`java.lang.String`、`java.util.ArrayList`等。这些类是Java语言的基础,它们的实现往往体现了设计模式和最佳实践。 为了更好地理解和学习Java源码,可以...
飞信 客户端的 java 源码, | Buddy.java | ChatMessage.java | ChatSession.java | ChineseString.java | DataPackage.java | FirstCanvas.java | GroupSection.java | icon.png | MCanvas.java | MList.java | ...
"String StringBuffer和StringBuilder区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、...
其简洁的API和强大的功能使得它成为Java开发者处理JSON的首选库之一。 总的来说,Gson库是Java开发中的一个重要工具,它简化了JSON数据的处理,提高了开发效率,同时也提供了高度的灵活性和可扩展性。无论你是新手...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
"java源码整理包"是一个集合,包含了与字符串(String)、日期(Date)、数据格式化(DataFormat)、数组(Array)、数字(Number)以及布尔(Boolean)相关的工具类源代码。这个包的目的是为了便于开发者学习和查阅这些常用工具...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...
在分析Java源码时,我们通常关注的是Java标准库中的核心类与方法,因为这些组件是Java编程语言的基础。从给定的文件片段中,我们可以提取出关于Java中Object类和String类的源码分析的知识点。 首先,Object类是Java...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
在Java开发过程中,将源码编译并打包成JAR(Java Archive)文件是一项常见的任务。JAR文件是Java平台特有的归档格式,它能够包含类文件、资源文件以及元数据,便于分发和执行。这里我们将详细讲解如何通过编写Java...
以下是一个简单的Java源码示例: ```java public class HanoiTower { public static void hanoiTower(int n, char fromRod, char interRod, char toRod) { if (n > 0) { // Move n - 1 disks from rod A to rod ...
java源码 package com beancore; import com beancore ui MainFrame; public class Main { public static void main String args[] throws InterruptedException { MainFrame mainFrame; try { mainFrame new...
5. **字符串处理**:String类在Java中至关重要,书中会涉及字符串的创建、比较、拼接和修改,以及正则表达式的使用。 6. **输入/输出流**:Java的IO流系统允许程序读取和写入数据,包括文件操作、对象序列化和网络...
以下是一个简单的RSA加密和解密的Java源码示例: ```java import java.security.*; public class RSAExample { public static void main(String[] args) throws Exception { KeyPairGenerator keyGen = ...