Spring全家桶


title: 每日深耕,勤练不缀

有一个想法,就是将自己每天对技术的感悟写下来,有时候我们弄通一个小技术,感觉太丢人了,这么小的东西怎么写。但是我就要写,因为我以后会用到,大家以后也会用到。

本节的内容是String全家桶


前言

每个java小白都会遇到的阵痛,我写下来。
一句古语:秦人不暇自哀而后人哀之,后人哀之而不鉴之,亦使后人复哀后人也。


一、1.谈谈你对构造方法的理解?

如果在一个类中,你没有定义构造方法,那么java将会默认给你加载无参构造函数供另一个类使用。
而如果你定义了构造方法,并且在里面加了参数,那么在另一个类中调用你的类时括号中也必须添加相应的实参,这样才能体现java传值的效果。
ps:只有在本类中可以调用构造函数,且用的方法时this ,内嵌方法是 init
继承类中,采用super才能调用父类的构造方法

二、 static ?

static的变量必然在static代码块之前定义

三、String ,最熟悉的陌生人?

String不可变 不可变 不可变
String 并不是基本数据类型,但没有new
只用一个引号,就可创建String对象+赋值
如:String content =“10006021070013”
String是一个类,但是不可以创建,因为java已经自动创建。
有多个方法:content.length();
content.toUpperCase();
content.toLowerCase();//返回值是String,并不改变原始的值,只是返回一个的String
split 方法
String content =“Orange_Apple_Banana”
String [] s =content.split("");//定义了一个数组
for(int i=0,i<s.length;i++){
sout(“s[i]”);
}
indexOf()
int indexOf =content.indexOf(’
’);
sout(“indexOf”)
sout(content.substring(indexOf +1,content.length()));//这个意思是下划线后面的字符串内容

contains()
方法是看是否content里有没有包含contains()里面的内容
equals()
比较两个String对象是否相等,一定要用equals方法
是比较值是否一样,并区分大小写
equalsIngnoreCase()
看字符本身是否一样,不区分大小写
trim()
将Sting 里的字符的空格去掉

四、 String、Stringbuilder和StringBuffer之间的差别?

1.String是java语言非常基础和重要的类,不是基本数据类型。
是immutable类的典型实现,提供了构造和管理字符串的基本逻辑,而且被声明为final class,它的所有属性都是final的,因为字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。
2.所以引入StringBuffer这个类来解决问题:(拼接产生太多中间对象的问题)。我们可以用append和add方法,把字符串添加到已有序列的末尾或指定位置。
StringBuffer本质是一个线程安全的可修改字符序列,保证安全的同时就会带来额外的性能开销。
3.所以,我们在java1.5以后,除非有线程安全的需求,不然我们会用StringBuffer的后继者StringBuilder,除去线程安全的需要,有效减少了开销,变相提升了性能。

关于本题目的Java 进阶知识!!!

  • 通过String和相关类,考察基本的线程安全设计和实现,各种编程实战
  • 考察jvm对象缓存机制的理解及如何良好的使用
  • 考察JVM优化java代码的一些技巧
  • String相关类的演进

String原生保证了基础线程安全,因为你无法对其内部产生任何影响。
StringBuffer的线程安全实现,完全是将各种修改数据的方法加上synchronized关键字,和StringBuilder差别也仅限于此。

拼接前,内部数组要设成多大的呢?
我们现在的解决办法是:构建时初始字符串长度加16,意味着没有构建对象时输入的字符串,初始值就是16;如果可以预见,那么我们可以指定合适大小,避免很多次扩容的开销。
扩容会产生多重开销,因为要抛弃原有数组,创建新的数组,还要进行arraycopy。

String家族故事!!!
java6中,因为科学家们发现每次将常见应用进行堆转储(Dump Heap),25%都是字符串,而且重复率很高,所以想了一个办法,将可用字符串都缓存起来,使用intern()方法来调用,可是好景不长,因为不会被FULLGC照顾到,他们成了“永久代”,而空间有限,使用不当,就会造成OOM(Out Of Memery).哈哈!!!

所以在jdk 8u20以后,就推出了G1 GC下的字符串排重。它时通过将相同数据的字符串指向同一份数据做到的,是jvm底层的改变,不需要对JAVA类库做修改。
所以我们现在操作字符串时会利用JVM内部的intrinsic机制,运行的是特殊优化的本地代码,不是java生成的字节码。intrinsic可以简单的理解为利用native方式hard-coded的逻辑,算是一种内联。

String自身演化

我们在java9中将字符串从char数组改为了一个byte+标识编码的Coder,并且将相关字符串操作类进行了修改,相关intrinsic进行了修改,无性能损失。
但是在同等数组长度下,存储能力退化了一倍。
目前没有发现应用受此影响。
所以更小的内存占用、更快的操作速度。

总结

通过string全家桶,我们可以了解其中故事,对我们了解java更有趣味性!

peace!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值