java基础--笔记15

来源:互联网 发布:100以内的质数java 编辑:程序博客网 时间:2024/06/05 07:03

String类适用于描述字符串事物。
那么它提供了那些对字符串进行操作的方法列?
1,获取
     1.1 字符串中包含的字符数,也就是字符串的长度。
          int length():获取长度
     1.2 根据位置获取位置上的某个字符。
          char charAt(int index):
     1.3 根据字符获取该字符在字符串中的位置
          int indexOf(int ch):返回的是ch在字符串中第一次出现的位置
          int indexOf(int ch,int fromIndex):从fromIndex




需求:开发操作最多的也是最常见的是文字数据。
     Java中对文字数据为了便于操作,将文字数据单独定义了一个类型:String类型。
      String是一个类,用于描述文字(字符串)。 提供了很多的属性和行为可以操作这些文字,这就是为什么将文字封装成对象的原因。
      java语言中,只要操作字符串,先要想要字符串String类。
      
特点:
1,字符串是一个常量,一旦初始化 不可以被改变,可以共享。
2,字符串常量在编译时存储到了class文件的常量代码中。
 jvm加载class时,就将这些常量都存储到内存的常量池(方法区)中。


String s0 = "abcd";//定义了一个字符串对象,s0指向。
 当s0指向一个字符串时,先在字符串常量池中查找是否有“abcd”,如果没有找到, 就会在常量池中创建“abcd”字符串,并将地址复制给s0.
  当执行s1时,也是到常量池中查找"abcd"字符串,已经存在了,所以直接将找到的“abcd”字符串的地址赋值给s1,所以s0和s1指向的是同一个“abcd”。
String s1 = "abcd";
System.out.println(s0 == s1);//true
s0 = "haha";//"abcd" 是没有改变的,仅仅是 s0的字符串对象指向变了。
System.out.println(s0);

面试题s0和s1两句代码有什么不同
String s0 = "abc";
String s1 = new String("abc");
s0执行的时候,在内存中的常量池中创建了一个"abc"字符串对象。
 s1执行的时候,在内存中的堆内存中创建一个字符串对象,并将一个字符串常量作为参数传递给String的构造函数。而这个字符串参数在常量池中出现。
 s0,内存中有一个对象。
 s1,内存中有两个对象。
继续问题:如何可以让s0和s1相等
只要让s1也直接指向常量池中的"abc"就可以了。
 s1 = new String("abc").intern();//这个new出来的对象调用操作常量池的方法intern(),将这个对象封装的内容到常量池查找,如果找到了将常量池的地址返回,如果没有找会将这个字符串存储到常量池中,并将这个字符串常量地址返回。


public static void main(String[] args) {
String str = "a"+ 8 + 'q';
//原理:通过查阅String类的api文档。发现了字符串连接 + 其实使用的是谁、StringBuffer 以及append方法。
//1,定义一个缓冲区对象,将连接符连接的数据追加到缓冲区中。
str = new StringBuffer().append("a").append(8).append('q').toString().intern();
String s = "a8q";
System.out.println(str == s);   //true

}

 字符串缓冲区StringBuffer的特点:
* 1,它是一个容器。通过append方法往容器中添加数据,还可以通过insert方法按照指定位置插入数据。
* 2,字符串缓冲区可以添加所有类型的数据。其实原理就是将任何类型的数据都转成字符串后才添加到缓冲区中。
* 3,缓冲区的长度是可变的。
* 4,缓冲区无论添加多少数据,最终需要转成字符串。
* 5,缓冲区有个弊端:无法操作每一个元素数据,因为都变成了字符串,并和它元素字符串连成了一个更大的字符串。
* 会用。一个容器应该具备什么方法?
* 1,添加。append insert。
* 2,删除。delete  remove
* 3,修改。
* 4,查找。



StringBuffer 和StringBuilder的异同点★★★★★
* 相同点:
* 都是缓冲区,功能一模一样。
* 不同点:
StringBuffer是同步的。 jdk1.0.多线程建议使用StringBuffer
StringBuilder是不同步的。jdk1.5 建议使用,单线程速度快。


基本数据类型对象包装类:
java将基本数据类型值封装成了对象。

封装成对象有什么好处?因为可以提供更多的操作基本数值的功能。

8种基本类型:byte Byte short Short int Integer long
对应的包装类:Long float Float double Double boolean Boolean char Character

基本数据类型对象包装类特点:用于在基本数据和字符串之间进行转换。

将基本数值转成字符串有3种方式:
1)基本类型直接与””相连接即可;34+""
2)调用String的valueOf方法;String.valueOf(34); 
     String类的valueOf()方法和Integer类的valueOf()方法有很多的不同。后者是转成想对应类型的对象。
3)调用包装类中的toString方法;Integer.toString(34);

基本数值---->包装对象
Integer i = new Integer(4);//使用构造函数函数
Integer ii = new Integer("4");//构造函数中可以传递一个数字字符串
Integer iii = Integer.valueOf(4);//使用包装类中的valueOf方法

包装对象---->基本数值
int num = i.intValue();

自动装箱拆箱
Integer i = 4;//自动装箱。Integer i = Integer.valueOf(4);
i = i + 5;//原理;等号右边:将i对象转成基本数值   i.intValue() + 5;//自动拆箱。加法运算后,再次装箱。


string的底层是stringBuffer。
stringBuffer的底层是数组。
0 0
原创粉丝点击