热门IT资讯网

java的String类

发表于:2024-11-24 作者:热门IT资讯网编辑
编辑最后更新 2024年11月24日,概述只要是用双引号括起来的都叫字符串String类在包java.lang.String中,只要是java.lang中的包,在写程序时都不需要import进来字符串的内容一旦创建,将不可再改变,是一个常
  1. 概述
    只要是用双引号括起来的都叫字符串
    String类在包java.lang.String中,只要是java.lang中的包,在写程序时都不需要import进来
    字符串的内容一旦创建,将不可再改变,是一个常量
    正是因为字符串不可改变,所以字符串是可以共享使用的。想想如果共享的东西大家可以随便修改,用一次残一次,谁还想去共享呀,想想都恶心,共享单车大家都可以用,就代表用的时候可以随便糟蹋它,拆它???
    字符串效果上相当于是char[]字符数组,但是底层原理是byte[]数组
  2. String类的创建(3+1种方式)
    2.1 三种构造方法
    public String(); 创建一个空白的字符串,不含有任何的内容
    public String(char[] array); 根据字符串数组的内容,来创建对应的字符串
    public String(byte[] array); 根据字节数组的内容,来创建对应的字符串
    三种构造方法用代码演示一遍
    public class ConstructString {
    public static void main(String[] args) {
    //第一种构造方法:public String(); 创建一个空白的字符串,不含有任何的内容
    String str1 = new String();
    System.out.println("第一个字符串:" + str1); //第一个字符串:

    //第二种构造方法:public String(char[] array); 根据字符串数组的内容,来创建对应的字符串char[] charArray = {'A', 'B', 'C'};String str2 = new String(charArray);System.out.println("第二个字符串:" + str2);  //第二个字符串:ABC//第三种构造方法:public String(byte[] array); 根据字节数组的内容,来创建对应的字符串byte[] byteArray = {97, 98, 99};  //注意,byte数组的元素,是ASCII码表的字符对应值String str3 = new String(byteArray);System.out.println("第三个字符串:" + str3);  //第三个字符串:abc

    }
    }
    2.2 一种直接创建
    String str4 = "HelloWorld!"
    1
    不管有没有new,只要是双引号内的东西,JVM会都会判断到是字符串,所以可以直接创建

  3. 常量池
    3.1 字符串中关于比较的小知识
    我们要知道,在java中,用if(String1 == String2)比较两个字符串,比较的是这两个字符串的地址是否一样,而如果想知道它们的值是否一样,XM返佣www.fx61.com/brokerlist/xm.html,用的是String的equals方法,比如:
    public static void main(String[] args) {
    String str1 = new String("hello");
    String str2 = new String("hello");

    //比较str1的地址是不是和str2的地址一样System.out.println( str1 == str2 );   //false 不一样//比较str1的值和str2的值是不是一样System.out.println( str1.equals(str2) ); //true 一样,都是hello

    }
    3.2 堆 (heap) 中的常量池
    str1和str2的比较结果为true,证明了它们是同一个字符串,只不过有两个名字而已,在内存中都是指向同一个地址,它们在的地方叫常量池,所以常量池的hello字符串是可以共享使用,不可修改的。
    str1和str3不一样,证明它们的地址是不一样的,通过new来创建的字符串,都不是在常量池中,但也是常量
    public class ConstantPool {
    public static void main(String[] args) {
    String str1 = "hello";
    String str2 = "hello";
    String str3 = new String("hello");

    System.out.println(str1 == str2);  //trueSystem.out.println(str1 == str3);  //falseSystem.out.println(str2 == str3);  //false

    }
    }

  4. 字符串的比较方法
    4.1 String的equals方法
    由 3.常量池 中的小知识,我们知道比较两个字符串的值是否一样,用的是equals方法,返回值是一个布尔值,一样就是true,不一样就是false。

public boolean equals(Object obj)
补充:任何对象都可以用Object进行接收,String类的当然也可以。

equals方法具有对称性,也就是str1.equals(str2)和str2.equals(str1)的结果是一样的
注意:如果比较双方是一个常量一个变量,推荐把字符串常量写在前面
即推荐"abc".equals(str) 不推荐:str.equals("abc")
因为如果字符串str是一个null,"abc".equals(str)的结果肯定是false,但是str.equals("abc")这样写将会导致空指针异常 NullPointerException,不要随随便便搞一个异常出来。
4.1 String的equalsIgnoreCase方法
它和equals方法的区别在于,它忽略了大小写,Ignore忽略,Case大小写
public static void main(String[] args) {
String str1 = "hello";
String str2 = "HellO";

    //比较str1的值和str2的值是不是一样,严格区分大小写    System.out.println( str1.equals(str2) );   //false     //比较str1的值和str2的值是不是一样,忽略大小写    System.out.println( str1.equalsIgnoreCase(str2));  //true}
  1. String中与获取相关的方法
    概述
    public int length(); 获取字符串当中含有的字符个数,拿到字符串长度
    public String concat(String str); 将当前字符串和参数字符串拼接成为返回值作为新的字符串
    public char charAt(int index); 获取指定索引位置的单个字符。(索引从0开始)
    public int indexOf(String str); 查找参数字符串在本字符串当中首次出现的索引位置,如果没有没有-1值
    5.1 length()和concat(String str)
    public static void main(String[] args) {
    //length()方法,获取字符串的长度
    int length = "abcdefghijk".length();
    System.out.println("字符串的长度是:" + length);

    //concat(String str),拼接字符串String str1 = "Hello";String str2 = "World";String str3 = str1.concat(str2); //str1经过拼接后产生了一个新的字符串,而str1本身不变//打印拼接后的字符串System.out.println(str1); System.out.println(str2); System.out.println(str3); 

    }

/输出结果:
字符串的长度是:11
Hello
World
HelloWorld
/
5.2 charAt(int index)和indexOf(String str)
public static void main(String[] args) {
//charAt(int index),获取指定索引位置的单个字符
char ch = "hello".charAt(1);
System.out.println("在1号索引位置的字符是:" + ch);

    //indexOf(String str),查找参数字符串在本来字符串当中出现的第一次索引位置    //如果没有,就返回-1值    String original = "helloworld!";    int index = original.indexOf("ll0");    System.out.println("第一次索引值是:" + index); //2}

6、Struts1和Struts2的区别
(1)从action类上分析:
Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
(2)从Servlet 依赖分析:
Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
(3)从action线程模式分析:
Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

0