1:传递
基本数据类型
整型:byte,short,int,long
浮点型:float,double
字符型:char
布尔型:boolean
引用数据类型
数组
类
接口
2:在创建数组对象时,是需要指明数组的长度的,所以数组在需要扩容时,需要一个遍历copy
3:String类,用的是char数组实现的。
参考:https://www.cnblogs.com/xiaoxi/p/6036701.html
==:在比较对象时,看两个引用的对象的地址是否一致,一致才返回true
equals:看具体对象的equals重写逻辑。
举例:String对象的比较,可能出现equals返回True,==返回false。
总结:
==返回true如果两个引用指向相同的对象,equals()的返回结果依赖于具体业务实现
字符串的对比使用equals()代替==操作符
Stringc = new String("chenssy");
new关键字一定会产生一个对象chenssy,同时这个对象是存储在堆中。所以上面应该产生了两个对象:保存在栈中的c和保存堆中chenssy。但是在Java中根本就不存在两个完全一模一样的字符串对象。故堆中的chenssy应该是引用字符串常量池中chenssy。所以c、chenssy、池chenssy的关系应该是:c--->chenssy--->池chenssy。
java字符串常量池和java堆不是一个东西。
Stringa = "chenssy";
像上面这样,a指向的是java字符串常量池中的数据,没有指向堆。
(1)单独使用""引号创建的字符串都是常量,编译期就已经确定存储到StringPool中;
(2)使用newString("")创建的对象会存储到heap中,是运行期新创建的;
new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址(注意,此时不需要从堆中复制到池中,否则,将使得堆中的字符串永远是池中的子集,导致浪费池的空间)!这里有个问题是其实在传递参数时,newString("abc")中的字符串就已经已经放到StringPool中了,所以堆中的字符串就是子集。
(3)使用只包含常量的字符串连接符如"aa"+ "aa"创建的也是常量,编译期就能确定,已经确定存储到StringPool中;
(4)使用包含变量的字符串连接符如"aa"+ s1创建的对象是运行期才创建的,存储在heap中;
(5)字面量"+"拼接是在编译期间进行的,拼接后的字符串存放在字符串池中;而字符串引用的"+"拼接运算实在运行时进行的,新创建的字符串存放在堆中。
6:
https://mp.weixin.qq.com/s?__biz=MzIyMjYyMzg3MA==&mid=2247485693&idx=1&sn=bfe33b68a6f9966fde96c1aa34a91de2&chksm=e82be9ecdf5c60faa1f240f49e0c40240c1b697708cceb77998e466a978dd1f3185b5415e1a3&scene=0#rd