一:不可变对象

不可变对象(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. xml 模块

    XML ———可扩展的标记语言 也是一种通用的数据格式 之所以用它 也是因为跨平台 XML 的语法格式: 1,任何的起始标签都必须有一个结束标签. <> 起始标签 </>结束标 ...

  2. Codeforces Round #505 Div. 1 + Div. 2

    传送门:>Here< 从来没打过\(CF\)(由于太晚了)-- 不知道开学了以后有没有机会能够熬夜打几场,毕竟到现在为止都是\(unrated\)好尴尬啊~ 今天早上打了几题前几天的比赛题 ...

  3. 【hdu6185】Covering(骨牌覆盖)

    2017ACM/ICPC广西邀请赛-重现赛1004Covering 题意 n*4的格子,用1*2和2*1的砖块覆盖.问方案数(mod 1e9+7).(n不超过1e9) 题解 递推了个式子然后错位相减. ...

  4. 【BZOJ3142】[HNOI2013]数列(组合计数)

    [BZOJ3142][HNOI2013]数列(组合计数) 题面 BZOJ 洛谷 题解 唯一考虑的就是把一段值给分配给\(k-1\)天,假设这\(k-1\)天分配好了,第\(i\)天是\(a_i\),假 ...

  5. docker-网络基础

    网络 Docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络 Docker 安装时会自动在 host 上创建三个网络, ⚡ root@bogon  /home  ...

  6. 纯CSS画的基本图形(圆形、三角形、多边形、爱心、八卦等)

    1.圆形 .circle { width: 100px; height: 100px; background: red; border-radius: 50px; } 2.椭圆 .oval { wid ...

  7. 20165223 week6测试错题总结

    由于时间预估错误及手机自身卡顿问题,虽然已经作答完成,却在最后提交时出现错误,错失提交时间,所以没能按时提交答案,也就没有纠错,以下仅凭印象列出错题: Q1:若超出JVM运行能力,如"byt ...

  8. 区块链使用Java,以太坊 Ethereum, web3j, Spring Boot

    Blockchain is one of the buzzwords in IT world during some last months. This term is related to cryp ...

  9. VSCode删除重复的空行

    输入^\s\n 选择使用正则表达式

  10. 洛谷P3265 装备购买

    这个大毒瘤题....居然反向卡精度.... 别的题eps要开小,这个毒瘤要开大... 我一开始是1e-12,挂的奇惨无比,50分...... 然后改成1e-7,就70分了... 1e-5 90分 1e ...