首页 > 编程语言 >java中的String

java中的String

时间:2024-03-19 15:23:39浏览次数:18  
标签:java String s1 System 字符串 println out

java中String类型

1. JVM(内存图)

要明白java中的String类型的存储,首先要搞清楚JVM的内部

  1. 方法区(主要用于存放方法)
  • 类常量池
  • 静态常量池
  • 字符串常量池(避免频繁的创建和销毁字符串,实现了数据的共享,提高了系统的性能)
  1. 栈区
  2. 堆区
  3. 程序计数区
  4. 本地方法栈

2. 创建一个字符串

public class Main{
 public static void main(String[] args){
     String s1 = "abc";
 }
}

首先在JVM中运行main方法,在栈区中为main方法开辟一块内存,然后在main方法的内存中创建了一个String类型的变量,此时,在方法区中的字符串常量池中就会构造一个"abc" 的字符串,并将该字符串的地址交给String类型的变量

public class Main{
 public static void main(String[] args){
     String s1 = new String("abc");
 }
}

这样就会在堆区中开辟一块内存,然后将地址存储在s1中,但实际上堆中开辟的那个块内存,引用了常量池中的abc

String s1 = new String("abc");

所以说上面这就话在内存中开辟了两块或者三块的内存(如果常量池中有就是两块,如果常量池中没有就在常量池中也开辟一块空间,所以是三块)

3. 字符串的比较

public class Main{
 public static void main(String[] args){
     String s1 = "abc";
     String s2 = "abc";
     String s3 = new String("abc");
     System.out.println(s1 == s2);
     System.out.println(s1 == s3);
 }
}

输出结果:

true
false

等于号在java中默认比较的是地址,s1和s2都是指向字符串常量池中创建的字符串,所以地址相等,所以s1等于s2

但是对于s3而言,new了一个新的对象,该对象指向了字符串常量池中的字符串,所以s1不等于s3

public class Main{
 public static void main(String[] args){
     String s1 = "123";
     String s2 = "456";
     String s3 = s1+s2;

     String s4 = "123456";
     String s5 = "123"+"456";
     System.out.println(s3 == s4);
     System.out.println(s4 == s5)
 }
}

对于字符串s1和s2的拼接,实际上是调用了java中String类中的StringBulder.toString();实际上也就是new了一个新的字符串,所以地址不一样,

但是对于s5中的拼接,会在编译的时候直接常量合并,所以说可以直接将s4和s5看成一样的

false
true

4. 字符串常用方法

String s = "abc";
System.out.println(s.length()); // 获取字符串长度
System.out.println(s.charAt(1)); // 获取字符串指定字符的值,下标从0开始
System.out.println(s.codePointAt(1)); // 获得字符串指定字符的值对应的编码值,下标从零开始,与上面一个类似
System.out.println(s.equals("abc")); // 比较字符串的内容
System.out.println(s.substring(0,3)); // 该字符串的从2到第二个字符 即:[0, 3)
System.out.println(s.indexOf("a")); // 查找某个字符串所在的位置,也可以是一个字符串,也可以跳过多少个字符开始寻找,如果不存在,返回-1
System.out.println(s.lastIndexOf("a")); // 与上面的方法类似,不过是从结尾开始寻找
System.out.println(s.startsWith("a")); // 是否是以a开头的字符串
System.out.println(s.endsWith("c")); // 是否是以c结尾
System.out.println(s.contains("b")); // 是否包含b字符
System.out.println(s.replace("a","c")); // 将字符a替换成字符c
System.out.println(s.toUpperCase()); // 将字符转化成大写
System.out.println(s.toLowerCase()); // 将字符转化成小写
System.out.println(s.trim()); // 将字符串中的开头结尾中的空格去掉

5. 可变字符串(频繁修改时使用)

1. StringBuilder(线程不安全)

2. StringBuffer(线程安全)

进程:计算机中最小的资源分配单位

线程:计算机中最小的执行单位

3. 常用的Api

StringBuilder sb = new StringBuilder("abcdef");
System.out.println(sb.append("a")); // 在sb中添加一个字符或一个字符串
System.out.println(sb.insert(1, "ab")); // 在sb中指定位置插入
System.out.println(sb.delete(2, 3)); // 删除sb中指定位置的字符[2, 3)
System.out.println(sb.deleteCharAt(3)); // 删除指定位置上的字符
sb.setCharAt(2, 'a'); // 修改制定位置上的字符
System.out.println(sb.reverse()); // 字符串反转

标签:java,String,s1,System,字符串,println,out
From: https://www.cnblogs.com/ning23/p/18083011

相关文章

  • LeetCode 217 存在重复元素(JAVA)
    LeetCode217存在重复元素(JAVA)一、题目描述:给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。示例1:输入:nums=[1,2,3,1]输出:true示例2:输入:nums=[1,2,3,4]输出:false示例3:输入:nums=[1,1,1,3,3,4,......
  • LeetCode 242 有效的字母异位词(JAVA)
    LeetCode242有效的字母异位词(JAVA)一、题目描述:给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。示例1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s=......
  • java核心技术卷1 第六章:接口、lambda表达式与内部类
    接口接口不是类,而是描述了符合这个接口的类应该做什么,描述了一组抽象的需求,而没有指定怎么做接口中的所有方法自动是public,接口中声明方法不需要加public(java规范,减少不必要的冗余声明,即使一些程序员为了清晰习惯加上public)实现接口时,需要加上public,不然默认将权限设为了defa......
  • 身份证文字识别ocr免费-身份证实名认证接口-护照识别-Java调用代码
    文字识别技术是针对图片上的文字进行提取,免去人们手动输入的繁琐。针对证件,翔云提供了身份证识别接口、身份证实名认证接口、护照识别接口,身份证识别接口自动提取身份证信息、身份证实名认证接口实时联网查验身份证的真伪。以身份证识别接口Java语言代码为例,欢迎免费体验:pac......
  • JAVA接口代码-从技术到创新、发票ocr、发票查验接口、发票识别
    财政类票据ocr、增值税发票识别、全电票ocr接口是一项重要的技术创新,在数字化、信息化高速发展的商业环境中发挥着至关重要的作用。通过集成翔云API,可快速实现发票信息的自动化识别提取与真伪查验,提升了财务管理效率。就发票识别接口,提供Java语言代码,有需要的人员可在线......
  • 基于Java+Vue的人力资源管理系统设计与实现【附源码+文档】
        前言:eHR人力资源管理系统是一个综合性的、用于优化人力资源管理流程的系统。它涵盖了人力资源管理的多个方面,包括招聘、人事、考勤、绩效、社保公积金以及薪酬管理等。以下是关于这些模块的详细解释:一、招聘管理招聘管理是eHR系统的重要组成部分,它可以帮助企业实现......
  • java GC Collector
    java垃圾收集器#最小堆值,不设置默认为操作系统1/64-Xms4G#最大堆值,不设置默认为操作系统1/4-Xmx4GG1jdk9开始默认启用,显示启用-XX:+UseG1GC介绍服务器级计算机上的垃圾优先(G1)收集器,否则为串行收集器。GC线程的最大数量受堆大小和可用CPU资源的限制初始堆......
  • Centos安装配置Java8
    查看Centos发行版本[root@lavm-ik3g4r3pga~]#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)查看java8安装包[root@lavm-ik3g4r3pga~]#yumlistjava-1.8*Loadedplugins:fastestmirrorRepositorybaseislistedmorethanonceintheconfiguration......
  • Java中使用easyexcel导入导出数据
    工作中常常遇到导入导出Excel数据,还需要设置表格边框、合并单元格、字体居中等等各种样式,尝试了多种方式觉得阿里的easyexcel挺好使,记录一下使用、表格样式如下:导入依赖<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId>......
  • Java基础知识总结(下)
    本文部分内容节选自JavaGuide,地址:https://javaguide.cn/java/basis/java-basic-questions-03.html......