08、String Arraylist - 图1

String

String类定义的变量是指向字符串的对象,然后操作该字符串。String被称为不可变字符串类型,它的对象在创建后不能被更改

String类的两种创建方式:

  1. //1、通过“”的方式给出字符串对象,在字符串常量池中存储。
  2. String a="hello";
  3. //2、通过new的方式创建,是创建在堆内存中的。
  4. String b=new String("helloworld");

通过“”的方式创建的字符串,若字符串内容相同,则String的变量指向的对象是同一个对象。即

  1. String s1="abc";
  2. String s2="abc";
  3. System.out.println(s3==s4)//true

通过new的方式创建对象,每new一次,就会产生一个新对象,放在堆内存中。

两种方式的区别

1、双引号给出的字符串对象,存在于堆内存中的字符串常量池中,相同内容只会存储一份。
2、new 的方式是直接在堆内存中创建对象。

面试中创建的String类的问题

1、堆内存中的字符串常量池中,相同内容只会存储一份
image.png
2、每次指向的是堆内存中的新对象。
image.png
3、Stirng s=new String(“abc”);//这句实际上是创建了两个对象。”abc”在堆内存中的字符串常量池中创建一个对象。new 在堆内存中创建。
image.png
4、在运行过程中,s2+”c”进行了运算,所以在堆内存中新创建了一个对象。与字符串常量池中的不是一个对象。
image.png
5、java存在编译优化机制,程序在编译时,”a”+”b”+”c”会直接转成”abc”。为什么上个例子不可以在编译的时候进行呢。在编译的时候,IDEA无法识别s2是什么,需要在运行阶段,才能具体知道s2的含义。而本例,在编译的过程中,扫描到”a””b””c”,即可进行转化。
image.png

String API

判断字符串内容

image.png
在判断字符串的内容时,我们常常只需要判断内容而不是地址。==是判断字符串的地址,会引发一些业务问题。
总结:在进行字符串的内容比较时,引用equals()方法,或equalsIgnoreCase()方法(忽略大小写);在进行基本数据比较时,运用==进行比较。
image.png

附加:StringBuilder类 append方法

StringBuilder类:字符缓冲区
StringBuilder()构造一个不带任何字符的字符串生成器,其初始容量为16字符。
StringBuilder(String str)构造一个字符串生成器,并初始化为制定的字符串内容。
StringBuilder.append() 将括号中的参数的字符串表示形式追加到序列中。例如:

  1. StringBuilder sb=new StringBuilder();
  2. for (char ch='a'; ch<='z';ch++) {
  3. sb.append(ch);
  4. }
  5. for (char ch='A'; ch<='Z';ch++) {
  6. sb.append(ch);
  7. }
  8. for (char ch='0'; ch<='9';ch++) {
  9. sb.append(ch);
  10. }

此时的sb的内容是包含a~z,A~Z,0~9的所有内容。

附加:Arrays.toString();

作用:将数组转换为String的形式进行输出

  1. public class test {
  2. public static void main(String[] args) {
  3. int [] arr=new int[]{1,2,3};
  4. System.out.println("arr="+ Arrays.toString(arr));
  5. }
  6. }

附加:toString()方法

可以对相应的类,添加toString()方法
右键,选择generate,选择toString()方法,可以自动生成

  1. @Override
  2. public String toString() {
  3. return "HeroNode{" +
  4. "no=" + no +
  5. ", name='" + name + '\'' +
  6. '}';
  7. }

ArrayList

集合是一种容器。类型可以不固定,适合做元素个数不能确定,同时存在增删改查的业务场景。功能较数组更为强大。

数组与集合的比较

数组定义后,类型确定,长度固定 集合类型可以不固定,大小可以改变。

数组和集合适合的场景

数组合适做数组个数类型确定的场景。 集合适合做数据个数不确定,且要做增删改查元素的场景。

ArrayList方法

创建 ArrayList list=new ArrayList();
添加元素 list.add(index,element);
list.add(“”);//直接在集合的末尾添加
返回制定索引处的元素 list.get(index);
返回集合中元素的个数 list.size();
删除指定索引处的元素,返回被删除的元素 String e=list.remove(index);
删除指定的元素,返回删除是否成功 list.remove(“”);
修改指定索引处的元素,返回被修改的元素。 String e=list.set(index,element);

ArrayList泛型

ArrayList:是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据类型。例如:ArrayList list = new ArrayList<>();此集合只能操作字符串类型的元素。

从集合中遍历并删除元素

image.png
关键是要从后往前遍历。
如果从前往后遍历,由于集合删除一个元素之后,会自动补进,导致有一些元素,会漏过。而从后往前遍历,就不会出现这种情况。

  1. package arraylist;
  2. import java.util.ArrayList;
  3. public class ArrayListDemo4 {
  4. public static void main(String[] args) {
  5. ArrayList<Integer> scores =new ArrayList<>();
  6. scores.add(98);
  7. scores.add(77);
  8. scores.add(66);
  9. scores.add(89);
  10. scores.add(79);
  11. scores.add(50);
  12. scores.add(100);
  13. System.out.println(scores);
  14. for (int i = scores.size()-1; i >0 ; --i) {
  15. int temp=scores.get(i);
  16. if(temp<80)
  17. {
  18. scores.remove(i);
  19. }
  20. }
  21. System.out.println(scores);
  22. }
  23. }