一、String内存模型

1、直接赋值创建string对象内存原理:

StringTable(串池):字符串常量池,用来存储字符串,只能是在直接赋值中使用才会存在串池当中(JDK7前串池是在方法区里面,StringTable(串池)在JDK7版本开始从方法区中挪到了堆内存,但是运行机制没有发生变化)

eg:

首先mian方法进栈,创建变量s1,查看串池里面有没有abc,此时串池内没有,就创建了一个新的abc,然后将地址值赋值给s1;

创建变量s2,等号右边直接赋值,查看串池里面有没有abc,此时,串池里面已经存在abc,就不会创建abc,而是去复用已经存在的abc。

2、小结:

当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在,如果不存在,创建新的,如果存在,就会复用

3、特点:代码简单,节约内存

4、、new关键字创建string对象内存原理

这里以字符数据为例:

首先main方法进栈,执行第一行代码,此时在堆内存当中产生一个char类型的数组,地址值为0011;再把0011赋值给变量chs;创建s1对象,在堆内存创建一个字符数组内容的小空间,地址值为002,再把002赋值给s1;创建s2对象,在堆内存创建一个字符数组内容的小空间,地址值为003,再把003赋值给s2。

注意:每new一次就会开辟一个新的空间,而且地址值都不相同,所以,这种方式创建的字符串不会复用

特点:会浪费内存空间

二、Java常用方法(比较)

1、==号比的是什么?

(1)基本数据类型:

基本数据类型比较的是数据值

(2)引用数据类型:

引用数据类型比较的是地址值

2、字符串比较

3、直接赋值:

创建变量s1,查看串池里面有没有abc,此时串池内没有,就创建了一个新的abc,然后将地址值赋值给s1;

创建变量s2,等号右边直接赋值,查看串池里面有没有abc,此时,串池里面已经存在abc,就不会创建abc,而是去复用已经存在的abc。此时s1和s2指向的是同一个地址值,所以是True

new关键字赋值:

s1记录的是堆里面的地址值,s2记录的是串池中(也是在堆里面)的地址值

4、用字符串比较内容:

字符串比较:

(1)boolean equals方法(要比较的字符串) :完全一样的结果才是true,否则为false

(2)boole equakslgnoreCase(要比较的字符串) :忽略大小写的比较

package com.itheima03.String;

public class StringDemo02 {
public static void main(String[] args) {
//1、创建两个字符串对象
String s1 = new String("abc");
String s2 = "ABc"; //2、==号比较
//引用数据类型:比的是地址值
//基本数据类型:比的是数据值
System.out.println(s1==s2);//false s1记录的是堆里面的地址值,s2记录的是串池里面的地址值 //3、比较字符串对象中的内容是否相等
boolean result = s1.equals(s2);
System.out.println(result);//false //4、比较字符串对象中的内容是否相等,忽略大小写(忽略大小写,只能是英文状态下的a和A,汉字的大小写无法使用)
boolean result1 = s1.equalsIgnoreCase(s2);
System.out.println(result1);//true
}
}

运行结果:

false

false

true

键盘录入的字符串与赋值的字符串比较:

package com.itheima03.String;

import java.util.Scanner;

public class StringDemo03 {
public static void main(String[] args) {
//从键盘录入一个abc
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String s1 = sc.next(); //代码中再定义一个字符串abc
String s2 = "abc";
//用==后比较S1和S2是否一样
System.out.println(s1==s2);
}
}

运行结果:

请输入一个字符串

abc

false

5、### 注意:

字符串录入的字符串是new出来的,s1与s2的地址值不同,s1是new出来的,是在堆内存里面,而s2直接赋值也是在堆内存里面,但是是在堆内存的串池里面,所以是false

结论:以后只要想比较字符串的内容,就必须使用string里面的方法(equals和equakslgnoreCase)

练习:用户登录

需求:

已知正确的用户名和密码,请用程序实现模拟用户登录,总共给三次机会,登录之后,给出相应的提示

package com.itheima03.String;

import java.util.Scanner;

/*
练习:用户登录
需求:
已知正确的用户名和密码,请用程序实现模拟用户登录,总共给三次机会,登录之后,给出相应的提示
*/
public class StringDemo04 {
public static void main(String[] args) {
//1、定义两个变量记录正确的用户名和密码
String rightName = "张三";
String rightPassword = "123456"; Scanner sc = new Scanner(System.in); for (int i = 0; i < 3; i++) {
//2、键盘输入用户名和密码
System.out.println("请输入用户名:");
String userName = sc.next();//提示和接受录入的变量一定要在for循环里面
System.out.println("请输入密码:");
String password = sc.next();
//3、比较
if (rightName.equals(userName) && rightPassword.equals(password)) {
System.out.println("登陆成功!");
break;
} else {
if (i == 2) {
System.out.println("账号" + userName + "已被锁定,请联系管理员");
} else {
System.out.println("用户登录失败,用户名或密码有误,您还剩" + (2 - i) + "次机会");
}
}
}
}
}

运行结果:

请输入用户名:

张三

请输入密码:

123

用户登录失败,用户名或密码有误,您还剩2次机会

请输入用户名:

张三

请输入密码:

1234

用户登录失败,用户名或密码有误,您还剩1次机会

请输入用户名:

张三

请输入密码:

12345

账号张三已被锁定,请联系管理员

String内存模型和Java常用方法的更多相关文章

  1. JVM内存结构、Java内存模型和Java对象模型

    Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文要讨论的JVM内存结构.Java内存模型和Java对象模型 ...

  2. Java 内存模型和 JVM 内存结构真不是一回事

    这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说, Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程 ...

  3. 并发一:Java内存模型和Volatile

    并发一:Java内存模型和Volatile 一.Java内存模型(JMM) Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和在内存中取出变量的底层细节,是围绕着 ...

  4. Java内存模型和JVM内存管理

    Java内存模型和JVM内存管理   一.Java内存模型: 1.主内存和工作内存(即是本地内存): Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取 ...

  5. 【Java】JMM内存模型和JVM内存结构

    JMM内存模型和JVM内存结构 JAVA内存模型(Java Memory Model) Java内存模型,一般指的是JDK 5 开始使用的新的内存模型,主要由JSR-133: JavaTM Memor ...

  6. JAVA内存模型和Happens-Before规则

    前言 上一篇文章王子给大家介绍了并发编程中比较关心的三个核心问题,可见性.有序性和原子性. 今天我们继续来探索并发编程的内容,聊一聊JAVA的内存模型和Happens-Before规则. JAVA内存 ...

  7. 黑马-----内存模型和volatile详解

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 JAVA线程-内存模型和volatile详解 一.单核内存模型 1.程序运行时,将临时数据存放到Cache中 2.将CPU计算所 ...

  8. 系统间通信(5)——IO通信模型和JAVA实践 下篇

    7.异步IO 上面两篇文章中,我们分别讲解了阻塞式同步IO.非阻塞式同步IO.多路复用IO 这三种IO模型,以及JAVA对于这三种IO模型的支持.重点说明了IO模型是由操作系统提供支持,且这三种IO模 ...

  9. Java虚拟机内存模型和volatile型变量

    Java虚拟机内存模型 了解Java虚拟机的内存模型,有助于我们明白为什么会发生线程安全问题. 上面这幅图是<深入理解Java虚拟机-JVM高级特性与最佳实践>的书中截图. 线程共享的变量 ...

  10. Java内存模型和ConcurrentHashMap 1.7源码分析

    简介 ConcurrentHashMap 是 util.concurrent 包的重要成员.本文将结合 Java 内存模型,分析 JDK 源代码,探索 ConcurrentHashMap 高并发的具体 ...

随机推荐

  1. Linux-计算毫秒数

    date +%s返回自划时代以来的秒数. date +%s%N返回秒数+当前纳秒数. 因此,echo $(($(date +%s%N)/1000000))是你需要的毫秒数 date +"%T ...

  2. [Ngbatis源码学习][SpringBoot] ApplicationContextInitializer接口类的使用和原理解读

    ApplicationContextInitializer接口类的使用和原理解读 在看Ngbatis源码的过程中,看到了自定义的ApplicationContextInitializer实现类,对Ap ...

  3. wxPython 笔记

    安装 Win7 / Win10 直接通过 pip install wxpython 安装 Ubuntu18.04 / Ubuntu 20.04 在Linux下的安装会稍微麻烦, 可以参考官网上的说明  ...

  4. Gerrit 笔记

    Gerrit 通过git push后增加一个中间状态, 来完成代码审批环节, 因此在git commit的时候增加了一个change id, 并且push到定制的target, 在push之后, 需要 ...

  5. Go微服务框架go-kratos实战学习06:配置中心使用-nacos作为配置中心和 file作为配置存储

    一.kratos 配置介绍 配置文件的作用就是把一些会变化的配置项单独存放,与程序相剥离. 把配置项进行单独管理. kratos 支持多种形式的配置, 比如 file,环境变量. 还支持一些配置软件, ...

  6. 【Android逆向】IDA动态调试JNI_OnLoad 和 .init_array

    由于 JNI_OnLoad 和 .init_array 执行时间很早,so一加载到内存中就执行了,所以动态调试步骤会稍微要麻烦一些 1. 进入手机, 执行./android_server (如果是64 ...

  7. Qt+QtWebApp开发笔记(二):http服务器日志系统介绍、添加日志系统至Demo测试

    前言   上一篇使用QtWebApp的基于Qt的轻量级http服务器实现了一个静态网页返回的Demo,网页服务器很重要的就是日志,因为在服务器类上并没有直接返回,所以,本篇先把日志加上.   Demo ...

  8. RabbitMQ零碎整理,总有一天在你工作中会用到

    概念 MQ:消息队列(消息中间件),开源的基于AMQP协议的消息中间件,异步 解耦 削峰 核心作用:1.异步 2.解耦 3.消息通信 RabbitMQ 消息的类型:1.点对点 2.Worker 3.发 ...

  9. 配置Nexus 3服务器作为Nuget包的仓库

    1.进入Nexus的Web界面 在右上角点"Login" 根据提示,去服务器上查看初始密码 root@dns-server:/mnt/data# cd nexus-data roo ...

  10. 【Azure 环境】ARM部署模板大于4MB的解决方案及Linked Template遇见存储账号防火墙无法访问

    问题一:在ADF Pipeline部署ARM Template报错"Deployment failed -- the request content size exceeds the max ...