怎么在静态网站基础上加动态,百度文库个人登录入口,微网站搭建平台,如何做网站本地服务器吗一、字符串
1.字符串在内存中的存储方式
#x1f525;在java中#xff0c;内存中有两个地方可以存储字符串#xff0c;一个是字符串池#xff0c;一个是堆内存#xff0c;串池中的字符串不会重复#xff0c;而堆中的字符串每次都会开辟一块新的空间#xff0c;因为维护…一、字符串
1.字符串在内存中的存储方式
在java中内存中有两个地方可以存储字符串一个是字符串池一个是堆内存串池中的字符串不会重复而堆中的字符串每次都会开辟一块新的空间因为维护串池的是一个hashtable以字符串hashcode作为建引用作为值。 2.创建字符串对象的两种方式
直接赋值
String s1 123;
new关键字创建
String里面可以是字符串 可以是byte类型的数组还可以指定数组区间
String s2 new String(123); //传字符串byte[] bytes {1, 2, 3};
String s3 new String(bytes); //传数组
String s2 new String(bytes, 0, 3);//从0索引开始拷贝长度为3 3.两种创建方式的区别
用 直接赋值先从串池中查找有直接用串池里的(字符串的复用可节省空间)没有在串池里创建一个新对象
new关键字创建是直接在堆内存开辟一块空间保存字符串然后返回该空间的地址 加强理解示例 String s1 new String(aaa); String s2 new String(aaa); String s3 aaa String s4 aaa System.out.println(s1 s2); // true or false System.out.println(s1 s3); // true or false System.out.println(s3 s4); // true or false 解析 引用数据类型 号比较的是地址值 s1 s2是new关键字创建的每次都会在堆内存中开辟新空间, 故s1 ! s2 s3 在串池中查找没有所以会将它保存到串池里,串池的内存和堆肯定不一样 s1 ! s3 s4 在串池中查找有直接返回串池中的地址s3 s4 4.字符串对象一旦创建不可改变 - 为什么
先说一下final关键字
修饰基本数据类型 - 变量的值不可被修改
修饰引用数据类型 - 变量的地址值不可被修改
举例
final int a 10;
a 20; //报错final int[] arr {1,2,3};
arr new int[3]; //报错
arr[0] 10; //可以
字符串用final和private两个关键字修饰
字符串的底层是用一个字符数组保存的而这个字符数组又是用final和private关键字修饰的用final关键字修饰代表该数组的地址不能发生变化但是你可以修改数组里面的内容啊这时private发挥作用了限制这个数组只能在String类中使用你压根拿不到这个地址。 注意String s aaa; s bbb;这是又创建一个新对象把它的地址赋给了s 5.字符串的拼接
操作符可以实现字符串的拼接操作
如何拼接
String s1 aaa;
String s2 aaabbb; //aaabbb
String s3 new String(s1bbb); //aaabbb
String s4 123; //123
就这就这不不不 上才艺 String s1 123; String s2 123; s1 s2 // true or false String s3 1; String s4 s323; s1 s3 // true or false 不会没关系 因为我们不知道它怎么拼接的 6.字符串的拼接原理
分两种情况
1.没有变量参与:
在编译阶段会将两个字符串合并为一个不会创建新的字符串对象也就是说1 2在编译时被替换为了12
2.有变量参与
有变量参与的拼接底层会创建StringBuilder对象拼接这个对象也是new出来的简单来说就是将要拼接的字符串放到一个容器里面拼接完最后在转化为字符串返回。 再看这两组题 String s1 123; String s2 123; s1 s2 // true or false 没有变量参与s2在编译阶段就被替换为了123所以s1 s2 String s3 1; String s4 s323; s1 s3 // true or false 有变量参与s3“2”“3” 会先创建一个StringBuilder容器而这个容器是new出来的拼接完再转为字符串返回故s1 ! s3 二、键盘录入
java一起 皆对象要想录入先获取它的对象固定格式
1.创建Scanner的对象 2.键盘录入
Scanner sc new Scanner(System.in);//sc就是获取的对象
//调用sc的成员方法
int num sc.nextInt();//录入一个整数
String s sc.next();//录入一串字符串
String line sc.nextLine();//录入一行数据
………………
说一下小细节
回车的作用是结束本次录入
scanner可以录入不同数据类型的数据如果数据类型与之不匹配直接报错
除了nextLine 其他遇到空格 回车 制表位(tab键)会停止录入其他没有读取的内容会放到缓冲区下一次读取会读缓冲区里面的第一个非空格 回车 制表位 字符
nextLine录入一行数据遇到回车停止 比如说下面这个代码 解析 1空格11回车 遇到回车停止录入下一次读取非空格 回车 制表位字符 就说你输入 1 11 回车 还是输出1, 11 但如果你 1 中间加了回车 那他就会输出1, 2 键盘录入对象在内存中的位置 键盘录入对象也是new出来的所以是在堆上开辟空间的就这么简单 来 考你考 String s sc.next(); //我输入aaa s “aaa” // true or false 答案是false啦 三、总结
字符串的两种创建方式是什么有什么区别
字符串为什么不可改变
操作是如何拼接字符串的
键盘录入对象再内存中的位置