java零此基础进阶-面向第一类篇(六) String 数组
如是说完类和第一类再而言String会随心所欲许多,即使String较为特定,它是提及类别,但又与一般的提及类别有点儿差别。看完许多其它如是说String的书刊,单纯的把API讲两遍就Conques,只不过String那个类里头慧娘,认知好那个类,不但能对java的运转有更多如是说,还能如是说更多的JVM相关技术细节,努力做到索韦泰,博奈,对他们未来更深入细致的如是说java有不可估量的益处。
就要教我们看api的方式,其它他们去课堂教学方可,劳力。
甚么是 API
API : Application Programming Interface , 应用领域开发工具。光看英文名字的确大吃一惊,废话更有效率
java8 api 文件格式镜像,英文不太好的老师请相互配合腾讯译者采用
API采用方式
他们搜到了String有两个方式是charAt方式,他有两个模块是int类别,叙述是回到负号所处处的字符串。
采用方式
String的构造方式 和 数组的较为
为何说数组特定?即使它既能像一般数据类别那样调用也能像第一类那样调用
数组调用
数组有许多构造方式,这里展示最常用的两个方式。两个不同的方式创建了两个都叫 “hello” 的数组,但在他们较为这两个数组的时候,会出现两个问题,那就是较为的方式不同,得到了不同的结果。
当他们采用 “ == ” 双等号较为两个数组的时候,回到的结果是false,而当他们采用String的 “equals” 方式的时候,他们得到的是true。这是为何呢?
首先他们来确认以下几个定义,再复习一下前面的知识点,最后得出结论。温故知新是最好的学习方式。
1.String 是类,不管通过那种方式构造出来的数组都是String类的第一类
2.第一类是提及类别,第一类里头的值是地址
3.== 双等号较为的是第一类的地址
4. 像基本类别那样调用的数组在内存中存放的位置与通过new构造出来的数组存放的位置不同
通过1,2,3点他们能发现,如果两个数组的地址是那样的,那么采用 == 较为回到的就是true,反之是false。这里主要的问题是4,你要好好理解两个不同的创建方式,数组的位置是不同的。下面来详细说明第4点。
jvm 堆,常量池
写了这么多文章,发现在座的各位还是对房子最感兴趣,这次他们继续讲jvm那个开发商吧。(传送门 堆栈 jvm 太难懂?买房子总能认知了吧)
常量池
他们前面说了,堆是商业区,就是大商场,大商场的确会有许多层,堆里头也分为许多区域,这次他们先如是说两个区域,就是常量池。堆是用来放各种第一类实例的,常量池也是那样,但他有他们的特点。
常量池在存第一类的时候,会首先观察一下是否已经存在需要创建的第一类。比如他们上面的 stringTest 保存的hello,它进去的时候,常量池里头是空的,所以划分两个空间,来保存hello那个字符串串,但当 stringTest2 再来的时候,他看到前面已经有两个hello了,他会直接将那个已存在的hello的地址,复制到他们的第一类里头去,那么stringTest 和 stringTest2 只不过是用的两个第一类,他们的地址是那样的,他们指向同两个第一类。
这时候stringTest3也来了,但他是 world 那个数组,这时候的常量池里头只有 hello 那个数组,他捡不到现成的,没办法,老实干活,他们开个空间吧,把world丢进去。
上面的是直接用双引号 “” 来创建数组的过程,下面来看用 new 关键字来创建数组的过程。
new 那个关键字很霸道,他就像是被宠坏的熊孩子,是不跟你讲道理的,只要用new 创建的,他都会在堆里头新开两个空间,所以不管他们new 创建的数组是否内容那样,它都会有他们独立的空间,变量指向不同的地址。
解释到这里,他们再看上面的第4点,是不是感觉茅塞顿开了?
用双引号创建的数组和用new创建的数组根本就不在一层楼里头,你用双等号去较为地址的确回到false。就算他们创建的都是 hello 那个数组,也是那样,双等号较为的是地址不是内容,请记住这个。
下面有个equals回到的是true,那么equals是干啥的?除了查API,他们还能看源代码~
不要觉得看源代码深不可测,只不过他们只要掌握了前面的知识,源代码看起来并没有那么难。
查看源代码的方式
采用eclipse工具写代码的时候,能按住ctrl键不动,再点击他们想要查看的方式,比如按住ctrl键不动,鼠标点击equals方式,再按照下面的方式做,就能看到源代码了。
查看源代码的方式
按照他们上面的方式,已经能打开源代码了,他们来看看equals方式的源代码吧
equals方式源代码解析
他们看一段代码,一定要把思路理清楚,先做甚么后做甚么,他们看equals的思路是这样的
1.首先较为调用者和模块 这2个字符串串的地址,如果地址那样,则内容的确那样,直接回到true
2.然后将2个数组转换为字符串数组,即使转为了数组,能取出数组中每个字符串进行较为
3.循环遍历2个数组数组,逐一较为每个位置上的字符串,一旦有两个位置上的字符串不同,则回到false
4.如果全部比对完,而且每个位置上的字符串都相同,则回到true
到这里,他们就知道了 equals 方式是用来较为数组里头的内容,所以不管那个数组是怎么调用出来的,不管他在内存中的甚么位置,只要他们的内容那样,就是是相同的字符串,则回到true。比如 “hello” 和 “hello”,每个字符串都相同,则回到true。
上面那个有两个迭代变量的循环,初学者看起来可能有点儿困难,他们能用前面的方式,将每一步的循环写出来,这样认知起来方便许多
循环步骤
他们看到,从头到尾,每个位置上的字符串都相同。
只不过这段源代码里头的知识点,我前面都有说到,只要真的掌握好了,只不过看起来也没有那么难。
补充知识
他们上面说常量池在jvm的堆里头,那是较为老的版本,新版本的jvm已经将常量池迁移到方式区了,就是他们前面说的那个大草地。即使堆里头存的第一类实例太多,就会牵涉到两个问题,那就是垃圾回收,垃圾太多,清洁工阿姨工作太辛苦,工作就不开心了,所以jvm要减少他的工作压力,不断的优化垃圾回收机制。有兴趣的老师能自行查阅相关资料,这部分知识并不是初学者需要掌握的知识,所以他们如是说方可。