Java虚拟机中的内存模型
1.题目分析
-
java虚拟机有那几块内存空间
-
栈内存
-
堆内存
-
方法区
-
本地方法区:这块内存空间主要调用的是操作系统相关资源
-
public static native long currentTimeMillis();
-
-
寄存器:交给CPU进行使用的
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-beI6sZXC-1618151252408)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20210410111728165.png)]
2.问题扩展
- 带有线程的内存图
3.应用场景
- 多线程消费同一个商品,可以将该商品定义为共享资源,存放于堆内存中。
String s = new String(“xyz”);创建了几个StringObject?是否可以继承String类?
1.题目分析
- String属于什么数据类型?
- 数据类型:
- 基本数据类型:byte,short,int,long,float,double,char,boolean (8种)
- 引用数据类型:类,数组,接口等
- String是一个类,所以是引用数据类型,因为String被final修饰,所以不能被继承
- 数据类型:
- String常用的方法
- public boolean equals(Object obj):比较字符串的内容是否相等
- public intlength():获取字符串的长度,其实也就是字符个数
- public boolean contains(String s):判断是否包含传入的字符串,包含true,不包含返回false
- public String substring(int start):从start开始截取字符串//方法的返回值是截取后的字符串
- public String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end,如果end值传入的是字符串最大索引+1的话则不会报出索引越界异常
- public String toLowerCase():把字符串转换为小写字符串
- public String toUpperCase():把字符串转换为大写字符串
- public String[] split(String str):根据传入的字符串切割原字符串,返回的是字符串数组。//注意:如果切割的是.的话,传入的字符串应该是\\.
- java中的内存分配?
- 栈内存:存储的是局部变量,局部变量指的是定义在方法中的变量。在变量使用完毕,编译器会自动施法内存,操作方式类似于数据结构的栈,也就是先进后出。
- 堆内存:存储的是new出来的对象,也可以叫实体,由程序员释放内存,若程序员不释放,程序结束时可能由Os回收。
- 静态区:全局变量和静态变量的存储是方在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(BSS)。程序结束后由系统释放。
- 常量池:字符串存储的区域。程序结束后由系统释放。
- 程序代码区:存放函数体的二进制代码
- String创建对象有什么特点?
- String s = new String(“xyz”),创建StringObject分为两种情况
- 如果String常量池中,已经创建"xyz",则不会继续创建,此时只创建了一个对象new String(“xyz”)。
- 如果String常量池中没有创建"xyz",则会创建两个对象,一个对象的值是"xyz",一个对象new String(“xyz”。)
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G3wTou67-1618151252411)(C:\Users\HP\Desktop\无标题.png)]
- String s = new String(“xyz”),创建StringObject分为两种情况
2.应用场景
String用于裁剪,拼接,搜索字符串,比较字符串,截取字符串,转换大小写等。在项目中不经常发送变化的业务场景中,优先使用String。
举例:
- 如果用户进行登录,需要验证用户名和密码,那么就可以使用equals方法进行判断
- 如果用户登录中需要填写验证码,那就可以使用equalsIgnoreCase方法,因为验证码大小写都是可以的,equalsIgnoreCase是忽略大小写比较。