一:不可变对象

不可变对象(Immutable Object)
一旦创建,这个对象(状态/值)不能被更改了–其内在的成员变量的值就不能修改了
–典型的不可变对象
八个基本型别的包装类的对象
String,BigInteger和BigDecimal等的对象
可变对象(Mutable Object)
–普通对象

(一)普通对象:可修改值

        //普通对象
genobj go = new genobj();
genobj go2 = go; //两个指针指向一个对象 System.out.println(go.getnumber());
System.out.println(go2.getnumber());
go2.setnumber(); System.out.println(go.getnumber());
System.out.println(go2.getnumber());
if(go==go2) {
System.out.println("obj1==obj2");
}

obj1==obj2

(二)不可变对象,不允许修改值

        //8个基本包装类
Integer I1=;
Integer I2=I1; System.out.println(I1);
System.out.println(I2); if(I1==I2) {
System.out.println("I1==I2");
} I2 = ; //修改值
System.out.println(I1);
System.out.println(I2);
if(I1==I2) {
System.out.println("I1==I2");
}else {
System.out.println("I1!=I2");
}
//发现原来的内存地址的值I1并没有修改,还是12,只是修改了对象指针I2的指向,指向13的内存

I1==I2

I1!=I2

(三)在函数参数中体现不可变对象

        String a = new String("abc");
String b = a;
System.out.println(b);
a = "def";
System.out.println(b);
abc
abc

函数修改

    public static void main(String[] args) {
String a = new String("abc");
System.out.println(a);
change(a);
System.out.println(a);
} public static void change(String b) {
b = "def";
}
abc
abc

不可变对象,也是传指针(引用)
由于不可变,临时变量指向新内存,外部实参的指针不改动

(四)如何创建一个不可变对象

–immutable对象是不可改变,有改变,请clone/new一个对象进行修改
–所有的属性都是final和private的
–不提供setter方法
–类是final的,或者所有的方法都是final
–类中包含mutable对象,那么返回拷贝需要深度clone

(五)不可变对象优缺点

不可变对象(Immutable Object)
优点
–只读,线程安全
–并发读,提高性能
–可以重复使用
缺点
–制造垃圾,浪费

二:字符串

字符串是Java使用最多的类,是一种典型的不可变对象
String定义有2种
–String a = “abc”; //常量赋值,栈分配内存
–String b = new String(“abc”); //new对象,堆分配内存
字符串内容比较:equals方法
是否指向同一个对象:指针比较==
Java 常量池(Constant Pool)
–保存在编译期间就已经确定的数据
–是一块特殊的内存
–相同的常量字符串只存储一份,节省内存,共享(栈中,不是堆中)

(一)字符串加法

String a=“abc”;
a = a+“def”; //由于String不可修改,效率差。

使用StringBuffer/StringBuilder类的append方法进行修改(原地修改,扩张
StringBuffer/StringBuilder 的对象都是可变对象
StringBuffer(同步,线程安全,修改快速),
StringBuilder(不同步,线程不安全,修改更快)
        int n = ;
Calendar t1 = Calendar.getInstance();
String a = new String();
for(int i=;i<n;i++)
{
a = a + i + ",";
}
System.out.println(Calendar.getInstance().getTimeInMillis() - t1.getTimeInMillis()); Calendar t2 = Calendar.getInstance();
StringBuffer b = new StringBuffer("");
for(int i=;i<n;i++)
{
b.append(i);
b.append(",");
}
System.out.println(Calendar.getInstance().getTimeInMillis() - t2.getTimeInMillis()); Calendar t3 = Calendar.getInstance();
StringBuilder c = new StringBuilder("");
for(int i=;i<n;i++)
{
c.append(i);
c.append(",");
}
System.out.println(Calendar.getInstance().getTimeInMillis() - t3.getTimeInMillis());

字符串append操作速度:StringBuilder>StringBuffer>String

(二)字符串函数传递

    public static void changeValue(int a)
{
a = ;
}
public static void changeValue(String s1)
{
s1 = "def";
}
public static void changeValue(StringBuffer s1)
{
s1.append("def");
}
public static void main(String[] args) {
int a = ; //基本类型
String b = "abc"; //不可变对象
StringBuffer c = new StringBuffer("abc"); //可变对象
changeValue(a);  //基本类型,传值
changeValue(b);  //不可变对象,传引用,但是不允许修改
changeValue(c);  //可变对象,传引用,可以修改值

System.out.println(a);
System.out.println(b);
System.out.println(c);
}

三:StringBuffer和StringBuilder比较

StringBuffer(字符串加减,同步,性能好)
StringBuilder(字符串加减,不同步,性能更好)
StringBuffer/StringBuilder: 方法一样,区别在同步
–append/insert/delete/replace/substring
–length 字符串实际大小,capacity字符串占用空间大小  空间大小为实际大小加一,再两倍
–trimToSize(): 去除空隙,将字符串存储压缩到实际大小
–如有大量append,事先预估大小,再调用相应构造函数

JAVA核心技术I---JAVA基础知识(不可变对象和字符串)的更多相关文章

  1. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  2. Java核心技术 卷1 基础知识-第一天

    基本数据类型 java是一种强数据类的的语言 共有8种基本数据类型 其中: 整型4种 int(4字节) short(2字节) long(8字节) byte(1字节) java中整型的范围与机器无关 长 ...

  3. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  4. Java中浮点数的基础知识

    偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...

  5. Java学习之旅基础知识篇:面向对象之封装、继承及多态

    Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...

  6. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...

  7. java 程序运行的基础知识【Java bytecode】

    聊聊文字,写一篇关于 java 基础知识的博文. JVM 线程栈 到 函数运行 每一个JVM线程来说启动的时候都会创建一个私有的线程栈.一个jvm线程栈用来存储栈帧,jvm线程栈和C语言中的栈很类似, ...

  8. Java基础知识回顾(一):字符串小结

    Java的基础知识回顾之字符串 一.引言 很多人喜欢在前面加入赘述,事实上去技术网站找相关的内容的一般都应当已经对相应知识有一定了解,因此我不再过多赘述字符串到底是什么东西,在官网中已经写得很明确了, ...

  9. Java学习1——计算机基础知识

    本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.

随机推荐

  1. BZOJ3223文艺平衡树——非旋转treap

    此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

  2. BZOJ3196二逼平衡树——线段树套平衡树(treap)

    此为平衡树系列最后一道:二逼平衡树您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询 ...

  3. ueditor 编辑器常用方法

    官方文档http://fex.baidu.com/ueditor/ 简单实现工具栏调用: //实现方法 ue.getDialog("工具名称"); //工具名称可以参考如下: to ...

  4. 【POJ1037】A decorative fence(DP)

    BUPT2017 wintertraining(15) #6C 题意 给长度n的数列,1,2,..,n,按依次递增递减排序,求字典序第k小的排列. 题解 dp. up[i][j]表示长度为j,以第i小 ...

  5. 三天STL与pbds(平板电视)

    19.02.11 ~ 19.02.13 hjmmm要专攻STL辣 先列一下大纲? 第一天:各种基础容器 第二天:实现平衡树和平板电视pbds 第三天:非变异算法和变异算法 那么我们就开始吧! Day1 ...

  6. 关于 atcoder 页面美化的 css

    使用方式 把下面代码加入 ESI Stylish 即可. 这是一个 chrome 的插件,可以翻\(~\)墙(或者不需要)去下载. 这是本人瞎魔改的... 代码 Update on 12-17 \(a ...

  7. Hdoj 1421.搬寝室 题解

    Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆, ...

  8. 自学Python4.7-生成器(方式一:生成器函数)

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  9. 【arc071f】Infinite Sequence(动态规划)

    [arc071f]Infinite Sequence(动态规划) 题面 atcoder 洛谷 题解 不难发现如果两个不为\(1\)的数连在一起,那么后面所有数都必须相等. 设\(f[i]\)表示\([ ...

  10. ELK部署详解--logstash

    logstash.yml # Settings file in YAML## Settings can be specified either in hierarchical form, e.g.:# ...