首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

聊聊JAVA String类为什么不可变

String自打娘胎一生就跟他们的兄弟姐妹不一样,好好的娃被戴了一个final的帽子,以至于byte,int,short,long等基本类型的小伙们都不带它玩。...回到代码本来来说,因为String太过常用,JAVA类库的设计者在实现时做了个小小的变化,即采用了享元模式,每当生成一个新内容的字符串时,他们都被添加到一个共享池中,当第二次再次生成同样内容的字符串实例时...不可变的好处 首先,我们应该站在设计者的角度思考问题,而不是觉得这不好,那不合理: 可以实现多个变量引用堆内存的同一个字符串实例,避免创建的开销。...我们的程序中大量使用了String字符串,有可能是出于安全性考虑。...当我们在传参的时候,使用不可变类不需要去考虑谁可能会修改其内部的值,如果使用可变类的话,可能需要每次记得重新拷贝里面的值,性能会有一定的损失。

39610

聊聊JAVA String类为什么不可变

String自打娘胎一生就跟他们的兄弟姐妹不一样,好好的娃被戴了一个final的帽子,以至于byte,int,short,long等基本类型的小伙们都不带它玩。...回到代码本来来说,因为String太过常用,JAVA类库的设计者在实现时做了个小小的变化,即采用了享元模式,每当生成一个新内容的字符串时,他们都被添加到一个共享池中,当第二次再次生成同样内容的字符串实例时...不可变的好处 首先,我们应该站在设计者的角度思考问题,而不是觉得这不好,那不合理: 可以实现多个变量引用堆内存的同一个字符串实例,避免创建的开销。...我们的程序中大量使用了String字符串,有可能是出于安全性考虑。...当我们在传参的时候,使用不可变类不需要去考虑谁可能会修改其内部的值,如果使用可变类的话,可能需要每次记得重新拷贝里面的值,性能会有一定的损失。

759190
您找到你想要的搜索结果了吗?
是的
没有找到

Redis使用及源码剖析-3.Redis链表-2021-1-17

链表在 Redis 的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层实现...// 节点的值 void *value; } listNode; 可以看出链表节点是双向的,并且通过void *指针可以存各种类型的值,通过节点的prev和next指针我们就可以连接一个双向链表如下图所示...: 2.链表实现 虽然可以直接用节点来构造双向链表,但是实际链表实现时还会再定义一个链表结构。...zmalloc(sizeof(*node))) == NULL) return NULL; // 保存值 node->value = value; // 新节点添加到给定节点之后...// 给定节点是原表尾节点 if (list->tail == old_node) { list->tail = node; } // 新节点添加到给定节点之前

31620

Python 版 LeetCode 刷题笔记 #3 无重复字符的最长子串

今天这题目乍一看,在字符串找来遍历即可,但实际操作下来,还是有些复杂的,也配得上其中等难度的定位了。...思路 以 "abcabcbb" 为例,最初我的思路是检测重复字母的出现,比如当字母 "a" 第二次出现时,就把 "abc" 分离出去作为第一个子串,然后继续分离 "abc"、"b" 和 "b"。...跳出对后续字符的遍历,开启新的 for i 的循环 break else: # 如果没有出现重复字符,新出现的字符添加到子串字符列表...# 如果字符重复 if item in temp: # 子串长度添加到结果列表 result.append...、剔除重复的第一位,重新赋值给子串 temp=temp[start_index+1:] # 无论是否字符重复,将该字符添加到子串列表(重复时上一步已经剔除了

68220

懂了!国际算法体系对称算法DES原理

密的时候每次以64bit作为一个分组。最后密文拼接起来。 然后执行一个IP置换(初始置换)操作。IP置换就是按位置换。举例来说64bit就是64个0和1。...然后用相同的加密算法每次传不同的转换后秘钥做16轮。 然后两组32bit拼接起来再进行一次IP置换(终结置换)变成密文 分组组合 刚才介绍的加密过程是把明文的一块怎么加密成密文。...SSL握手的最后,双方会用非对称秘钥协商一个对称秘钥。用对称秘钥来加密传输的数据。之所以这样做是因为非对称加密安全性高但是效率低,对称秘钥正好相反。对称秘钥可以被暴力破解,破解需要时间。...我是梦的人,一生的缘分。": "客户端:我愿意嫁给你,你却不能答应我。"...我是梦的人,一生的缘分。 服务端:我知道你是任性太任性,伤透了我的心。同是梦的人,难舍难分。 客户端:我愿意嫁给你,你却不能答应我。 服务端:你愿意嫁给我,我却不能向你承诺。

77510

深入理解Redis 数据结构—简单动态字符串sds

其中 Redis 键值对的键都是 string 类型,而键值对的值也是有 string 类型,在 Redis string 类型运用还是很广泛的。...sds 实现 sds 的数据结构: struct sdshdr { //buf 已占用的长度 int len; // buf 剩余的可用的长度 int free...添加空字符串字符串末尾等操作,都是由 sds 函数自动完成的,所以这个空字符对于使用者来说完全是透明的。 通过 len 属性,可以实现时间复杂度 O(1) 的长度计算。...数组一般初始化以后长度就已经固定了,不能支持字符串追加append和长度计算操作: 每次计算字符串长度都要遍历一遍数组,所以时间复杂度是O(N) 对字符串每次进行追加操作,需要对字符串进行一次内存分配..." again" 会被追加到原来的 "hello world" 之后: struct sdshdr { len = 17; free = 17; buf = "hello

28010

函数(2)

y); 接着,他需要写一个.c文件 int Add(int x, int y) { return x + y; } 最后,将其改为静态库;之后就可以静态库和头文件卖给别人。...买方买到他的静态库和头文件后,先将其添加到他所写的项目的文件夹,之后用如下代码: #include #include "add.h" //.lib - 静态库 //导入静态库 #...Fib函数在调用的过程很多计算其实在一直重复。 如何解决上述的问题: 递归改写成非递归。 使用static对象替代nonstatic局部对象。...在递归函数设计,可以使用static对象替代nonstatic局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放nonstatic对象的开销,而且static对象还可以保存递归调用的中间状态...当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。

13710

数据结构面试常见问题:必备知识点与常见问题解析

栈与队列:理解栈(后进先出,LIFO)与队列(先进先出,FIFO)的特点与操作(入栈、栈、入队、队),掌握其在递归、回溯、任务调度等问题中的应用。...使用快慢指针(快指针每次移动两步,慢指针每次移动一步),若两者相遇则存在环。相遇后,令其中一个指针回到起点,两个指针每次移动一步,再次相遇点即为环的入口。...使用二分查找找到插入位置,然后插入位置及其之后的元素依次后移一位,最后新元素插入到找到的位置。 如何设计一个LRU(Least Recently Used)缓存淘汰算法?...如何实现一个高效的查找算法,查找字符串数组是否存在重复字符串? 使用哈希集合(HashSet或HashMap的键集)。...遍历字符串数组,对于每个字符串,检查其是否已存在于哈希集合,存在则为重复,不存在则添加到哈希集合。 如何判断一棵二叉树是否是二叉搜索树?

12710

数据结构(四):栈

每次进栈的元素都放在原来栈顶元素之前,成为新的栈顶元素,每次栈的元素都是当前栈顶元素。所以栈也被称为后进先出表。...StackEmpty(s): 判断栈是否为空:若栈 s为空则返回真,否则返回假 Push(&s, e): 进栈:元素 e添加到栈顶 Pop(&s, &...e): 栈:栈顶元素赋值给 e并从栈顶删除 GetTop(s, &e): 取栈顶元素:当前栈顶元素的值赋值给 e DispStack(s):显示栈中所有元素的值:按照从栈顶到栈底的顺序显示栈中所有元素的值...data[MaxSize]; }Stack; 这里栈的最大大小我们通过宏来定义,在实现时也可以使用其他的方法定义,比如在栈再加一个 MaxSize,data改为一个 ElemType[] 类型的指针...最靠近头节点的节点是栈顶节点,而链表与头节点相对的一端则是栈底。

74210

【Java数据结构】详解Stack与Queue(三)

队列可以使用顺序表或链表的结构来实现: 当用链表结构来实现时,我们用LinkedList去实例化对象,再用Queue去接收。...(LinkedList实现了Queue接口,上图有出现其关系) 当用顺序表结构来实现时,我们用ArrayDeque去实例化对象,再用Queue去接收。...2.4循环队列 循环队列的介绍 当我们使用顺序表实现队列时,会存在一个问题:虽然顺序表实现的队列可以自动扩容,但其空间利用不充分:因为每次队都会浪费一个空间,为了解决这个问题,我们可以采用循环队列。...每次入队时flag的值置为true,flag的值置为false, 当rear == front && flag == true表示队列已满。...队列的两端分别称为前端和后端,两端都可以入队和队。所以双端队列既能够当队列使用,也能当栈使用。

8310

两个栈实现一个队列

队列是先进先出,而栈是先进后; 考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头; 由于往栈添加元素相当于往队列头添加元素,因此我们需要在两个队列中进行元素的转移,比较简单的实现是: 1....q1和q2在任一时刻至少有一个为空,即如果有元素,所以元素只在同一个队列。...2.当有元素需要插入时,插入的元素插入到空的队列,并将另一非空队列的元素转移到该队列,于是插入的元素添加到了队列头中。...class 两个栈实现一个队列 { Stack stack1 = new Stack(); Stack stack2 = new Stack(); public void push(int...num){ stack1.push(num); } public int pop(){ if(stack2.empty()){ while(!

38830

每日一刷《剑指offer》字符串篇之左旋转字符串

举例解题思路方法一:和上面题目一样可以使用StringBuilder,把字符串的每个字符一个个添加到StringBuilder,如果遇到空格就把他换成%20。...方法二:先将字符串转换为单个字符,申请一个临时数组,然后再遍历这个字符串的每个字符,如果不是空格就把遍历的字符添加到临时数组,如果是空格就添加3个字符'%','2','0'分别到临时数组,最后再把临时数组转化为字符串即可...举例解题思路方法一:栈;我们都知道栈是先进后的,于是我们可以用方法一分割单词的方式,在大的句子字符串中分割出一个一个地单词。...然后从头到尾遍历单词,分割出来的单词送入栈,然后按照栈中弹出的字符串顺序拼接单词即可使单词之间逆序。step 1:遍历字符串整个字符串按照空格分割然后入栈。...step 2:遍历栈,内容弹出拼接成字符串。方法二:两次反转;我们需要的是单词位置反转,也即是单词内部不变,属于字符串部分反转问题。

13220

【地铁上的面试题】--基础部分--数据结构与算法--栈和队列

压入(Push):元素添加到栈的顶部,也称为入栈。 弹出(Pop):从栈的顶部移除元素,也称为栈。 空栈(Empty Stack):不包含任何元素的栈。...通过遍历字符串的括号字符,左括号入栈,遇到右括号时弹出栈顶元素并检查是否匹配,以判断括号是否正确闭合。 浏览器历史记录: 浏览器的历史记录可以使用栈来实现。...函数用于元素添加到队列。...每次 push 操作时,如果新元素小于等于当前最小元素栈的栈顶元素,则将新元素同时入栈到两个栈;pop 操作时,同时两个栈的栈顶元素栈。...函数调用:函数调用时,每次进入一个新函数,需要保存上一个函数的状态,可以使用栈来实现函数的嵌套调用。 括号匹配:栈可以用于检查括号是否匹配的问题,例如判断一个字符串的括号是否完全匹配。

36120

JAVA常用类之StringBuffer

int offset, int len) char 数组参数的子数组的字符串表示形式追加到此序列StringBufferappend(CharSequence s)指定的 CharSequence...(int i) int 参数的字符串表示形式追加到此序列StringBufferappend(long lng) long 参数的字符串表示形式追加到此序列StringBufferappend(Object...sb)指定的 StringBuffer 追加到此序列StringBufferappendCodePoint(int codePoint) codePoint 参数的字符串表示形式追加到此序列intcapacity...(int offset, float f) float 参数的字符串表示形式插入此序列StringBufferinsert(int offset, int i) int 参数的字符串表示形式插入此序列...) Object 参数的字符串表示形式插入此字符序列StringBufferinsert(int offset, String str)字符串插入此字符序列intlastIndexOf(String

50320

C++随记(一)---字符串数组的输入问题

问题分析: cin使用空白(空格,制表符,换行)来确定字符串结束的位置!!!我的字符串Teeyo Huang,包含了空格!...所以cin把前半部分当成了一个单独的字符串赋值给name数组,把后半部分Huang当成了一个单独的部分放在输入流,待到下一个cin出现时,自动赋值给sex。...解决方案: 每次读取一行字符串输入,这样这一行的中间的任何空白都不会被认定为字符串结束的标志。...问题分析: cin.get()在读取我的Teeyo Huang时,并没有舍弃我最后敲的那下回车键,也就是换行符,而是把它留在了队列, 这样我的下一个cin,get()出现时,又直接把换行符赋值给sex...了,就直接表示字符串结束了。

1.4K02

R语言构建追涨杀跌量化交易模型

这10年间,平安银行股价起起落落,每次上涨都会持续一段时间,那么在我们可以上涨中段追入买进,在大幅下跌之前卖出,就是追涨杀跌法。 涨通常有2种情况,短线涨和中线涨。以股票交易为例。...追涨杀跌要多一分平和的心态,少一些侥幸;多一分理性,少一分感性。 追涨杀跌的市场操作 在弱市中,短线涨往往容易被套,因为弱市里大部分股票的行情只有一天,当天得高了,第二天多半没有获利逃出的机会。...有些人专门涨停板,新股开板,次新股开板等,对于2015年上半年IPO的新股来说收获颇丰,如暴风科技,超电缆等,其他的时候可能用这套涨停策略就行不通了。 ?...买入信号出现时,以收盘价买入,每次买入价值1万元的股票。如果连续出现买入信号,则一直买入。若现金不足1万元时,则跳过买入信号。 卖出信号出现时,以收盘价卖出,一次性平仓信号对应的股票。...模型优化 我们看到在强势格局的大牛市,通过涨能让我们获利颇丰。其实我们可以把模型再进一步优化的,在构建卖出信号时,是以最近10日最低价为卖出点来看,应该还有更好的卖出点可以选择。

2K80

R语言构建追涨杀跌量化交易模型(附源代码)

这10年间,平安银行股价起起落落,每次上涨都会持续一段时间,那么在我们可以上涨中段追入买进,在大幅下跌之前卖出,就是追涨杀跌法。 涨通常有2种情况,短线涨和中线涨。以股票交易为例。...追涨杀跌要多一分平和的心态,少一些侥幸;多一分理性,少一分感性。 追涨杀跌的市场操作 在弱市中,短线涨往往容易被套,因为弱市里大部分股票的行情只有一天,当天得高了,第二天多半没有获利逃出的机会。...有些人专门涨停板,新股开板,次新股开板等,对于2015年上半年IPO的新股来说收获颇丰,如暴风科技,超电缆等,其他的时候可能用这套涨停策略就行不通了。...买入信号出现时,以收盘价买入,每次买入价值1万元的股票。如果连续出现买入信号,则一直买入。若现金不足1万元时,则跳过买入信号。 卖出信号出现时,以收盘价卖出,一次性平仓信号对应的股票。...模型优化 我们看到在强势格局的大牛市,通过涨能让我们获利颇丰。其实我们可以把模型再进一步优化的,在构建卖出信号时,是以最近10日最低价为卖出点来看,应该还有更好的卖出点可以选择。

2.6K121
领券