Spring全家桶

it2025-11-27  8


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!!!

最新回复(0)