常用API之String\ArrayList

  • API
  • String简单介绍
    • String概述
    • String类的特点详解
    • String类创建对象的方式
    • String类常见面试题
    • 字符串内容比较
    • 遍历、替换、截取、分割操作
    • String类案例实战
  • ArrayList简单介绍
    • ArrayList集合快速入门
    • ArrayList对于泛型的支持
    • ArrayList常用API、遍历
    • ArrayList集合案例:遍历并删除元素。
    • ArrayList集合案例:存储自定义类型的对象
    • ArrayList集合案例:元素搜索

API

java写好的技术(功能代码),可以直接调用。
Oracle也为java提供的这些功能代码提供了相应的API文档(技术说明书)。
下载API文档:
https://www.oracle.com/technetwork/javase/downloads/index.html

String简单介绍

String类定义的变量可以用于存储字符串,同时String类提供了很多操作字符串的功能,我们可以直接调用。

String概述

1.java.lang.String类代表字符串,String类定义的变量可用于指向字符串对象,然后操作该字符串。
2.java程序中的所有字符串文字(例如“abc”)都为此类的对象。

String name = "小黑";

String类的特点详解

1.String其实常被称为不可变字符串类型,它的对象在创建后不能被更改。

package zifuchuan;public class st {public static void main(String[] args) {String name = "传智";name += "教育";name += "中心";System.out.println(name);  // 传智教育中心}
}

从上述代码可以看出字符串变量name指向的字符串对象,那为何还说字符串不可变呢?
1.String变量每次的修改其实都是产生并指向了新的字符串对象。
2.原来的字符串对象都是没有改变的,所以称不可变字符串。

字符串对象存在哪里?
以" "方式给出的字符串对象。在字符串常量池中存储。

首先会在堆内存中加载main方法,然后执行第一行代码,在堆内存中开辟了一个名为name的空间存储堆内存字符串常量池中"传智"字符串的内存地址,然后执行第二行语句的时候,把原来的对象加上"教育"在堆内存中存储了新的对象"传智教育"并让新的内存地址替换了原来的内存地址,接下来执行第三行语句,和第二行语句一样,最后输出name中的内存地址为存储"传智教育中心"的内存地址,由于原来字符串没有改变只是指向了新的内存地址而已,所以说String对象是不可变类型。

String类创建对象的方式

1.方式一:直接使用" "定义。

String name = "传智教育";

2.方式二:通过String类的构造器创建对象。

package zifuchuan;public class st {public static void main(String[] args) {// 方式一:直接使用双引号得到字符串对象String name = "香香爱祖国!";System.out.println(name); // 香香爱祖国!// 方式二:String s1 = new String(); // s1 = ""System.out.println(s1);// 方式三:String s2 = new String("臭臭爱祖国!");System.out.println(s2); // 臭臭爱祖国// 方法四:char[] chars ={'a','b','香','臭'};String s3 = new String(chars);System.out.println(s3); //ab香臭// 方法五byte[] bytes = {97,98,99,65,66,67};String s4 = new String(bytes);System.out.println(s4); //abcABC}
}

上面不同创建区别(面试):
1.以""方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份。
2.通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中。

package zifuchuan;public class st {public static void main(String[] args) {String s = "abc";String s1 = "abc";System.out.println(s == s1); // true   说明内存地址一样char[] chs = {'a','b','c'};String s2 = new String(chs);String s3 = new String(chs);System.out.println(s2 == s3); // false  说明内存地址不一样}
}

通过""定义字符串内存原理

首先在方法区加载Test.class和main方法,然后把main方法提取到栈内存中,执行main方法中的第一行代码,在栈内存中开辟名为s1的内存空间存储堆内存字符串常量池中"abc"对象的内存地址,然后执行方法中的第二行代码,由于字符串对象一样直接在栈内存开辟一个名为s2的内存空间存储已有相同对象的内存地址,最后执行第四行代码,输出比较结果true。
通过new构造器得到字符串对象

首先把Test.class和main方法加载到方法区,然后把main方法提取到栈内存,运行方法的第一行代码开辟一个名为chs的内存空间存储堆内存中字符数组的内存地址,然后执行第二行代码,在栈内存开辟一个名为s1的内存空间存储在堆内存根据字符数组产生新对象的内存地址,然后执行第三行代码,在栈内存开辟一个名为s2的内存空间存储在堆内存根据字符数组产生新对象的内存地址,最后执行第四行代码,输出比较结果false。
特点:
1.双引号创建的字符串对象,在字符串常量池中存储同一个。
2.通过new构造器创建的字符对象,在堆内存中分开存储。

String类常见面试题

1.问题一:下列代码的运行结果是?

package zifuchuan;public class test {public static void main(String[] args) {String s = new String("abc");String s1 = "abc";System.out.println(s == s1);// false}
}

String s = new String("abc");

上面这个代码一次创建了两个对象

package zifuchuan;public class test {public static void main(String[] args) {String s = "abc";String s1 = "ab";String s2 = s1 + "c";System.out.println(s1 == s2);// false}
}
package zifuchuan;public class test {public static void main(String[] args) {String s = "abc";String s1 = "a"+"b"+"c";System.out.println(s == s1);// true}
}

字符串内容比较

登陆校验:

对于初学者会用“==”进行校对,但是结果不尽人意,这种方法是错的。如下:

package zifuchuan;
import java.util.Scanner;public class test {public static void main(String[] args) {String okname = "snowdream";String okpass = "123456";Scanner sc = new Scanner(System.in);System.out.println("请您输入账户;");String name = sc.next();System.out.println("请您输入密码:");String pass = sc.next();if(okname == name && okpass == pass){System.out.println("登陆成功!");}else {System.out.println("用户名或密码错误!");}}
}

这时候推荐使用String类提供的“equals”比较:只关心内容一样即可。

package zifuchuan;
import java.util.Scanner;public class test {public static void main(String[] args) {String okname = "snowdream";String okpass = "123456";String oksyscode = "45AGU";Scanner sc = new Scanner(System.in);System.out.println("请您输入账户;");String name = sc.next();System.out.println("请您输入密码:");String pass = sc.next();System.out.println("请您输入"+oksyscode+"验证码:");String code = sc.next();if(okname.equals(name) && okpass.equals(pass) && code.equalsIgnoreCase(code)){System.out.println("登陆成功!");}else {System.out.println("用户名或密码错误!");}}
}


其中equalsIgnoreCase为不区分大小写进行比较。

遍历、替换、截取、分割操作

package zifuchuan;public class bianli {public static void main(String[] args) {// 获取字符串长度String name = "香香爱臭臭";System.out.println(name.length());// 获取字符某个索引位置处的字符char c = name.charAt(2);System.out.println(c);// 遍历字符串System.out.println("-------遍历字符如下:---------");for (int i = 0; i < name.length(); i++) {char ch = name.charAt(i);System.out.println(ch);}//把字符串转化成字符数组char[] chars = name.toCharArray();for (int i = 0; i < chars.length; i++) {char ch = chars[i];System.out.println(ch);}// 截取内容,包前不包后String name2 = "香香是最漂亮的!";String rs = name2.substring(3,6);System.out.println(rs);// 从当前索引一直截取到末尾String rs2 = name2.substring(4);System.out.println(rs2);// 字符串字符替换String name3 = "香香是最聪明的90后,香香棒棒的!臭臭好爱香香";String rs3 = name3.replace("臭臭","大胖");System.out.println(rs3);// 判断是否包含System.out.println(name3.contains("臭臭"));// 判断以什么开始name3.startsWith("香香");// 分割字符串String name4 = "香香,臭臭,大胖,小云";String[] names = name4.split(",");for (int i = 0; i < names.length; i++) {System.out.println("选择了:"+names[i]);}}
}

String类案例实战

案例一:String类开发验证码功能

需求:随机产生一个5位的验证码,每位可能是数字、大写字母、小写字母。
分析:
1.定义一个String类型的变量存储a-zA-Z0-9之间的全部字符。
2.循环5次,随机一个范围内的索引,获取对应字符连接起来即可。

package zifuchuan;import java.util.Random;public class StringExec {public static void main(String[] args) {// 定义可能出现的字符信息String datas = "abcdefghijklmnopqrstuvwxyzABCDEFGHILMNOPQRSTUVWXYZ";// 循环5次,每次生成一个随机的索引,提取对应的字符连接起来即可String code = "";Random r = new Random();for (int i = 0; i < 5; i++) {int index = r.nextInt(datas.length());char c = datas.charAt(index);code += c;}// 输出字符串变量System.out.println("验证码:"+code);}
}

案例二:模拟用户登陆功能

需求:模拟用户登录功能,最多只能给三次机会。
分析:
1.系统后台定义好正确的登录名称,密码。
2.使用循环控制三次,让用户输入正确的登录名和密码,判断是否登录成功,登录成功则不再进行登录;登录失败给出提示,并让用户继续登录。

package zifuchuan;import java.util.Scanner;public class longin {public static void main(String[] args) {// 定义正确的登录名称和密码String okname = "admin";String okpass = "123";Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++) {System.out.println("请您输入账户:");String loginname = sc.next();System.out.println("请您输入密码:");String loginpass = sc.next();// 判断登录是否成功if(okname.equals(loginname)){// 判断密码是否正确if(okpass.equals(loginpass)){System.out.println("登录成功!欢迎进入系统!");break;}else {System.out.println("登录密码错误!你还剩余"+(3-i)+"次机会登录!");}}else {System.out.println("登录名称错误!你还剩余"+(3-i)+"次机会登录!");}}}
}

案例三:手机号码的屏蔽功能
需求:以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽,最终效果为:

分析:
1.键盘录入一个字符串,用Scanner实现。
2.截取字符串前三位,截取字符串后四位。
3.将截取后的两个字符串,中间加上****进行拼接,输出结果即可。

package zifuchuan;
import java.util.Scanner;public class yincang {public static void main(String[] args) {// 键盘录入手机号码Scanner sc = new Scanner(System.in);System.out.println("请您输入您的电话号码:");String tel = sc.next();// 截取号码的前三位,后四位String before = tel.substring(0,3);String after = tel.substring(7);System.out.println("隐藏后的号码为:"+before+"****"+after);}
}

ArrayList简单介绍

1.ArrayList代表的是集合类,集合是一种容器,与数组类似,不同的是集合的大小是不固定的。
2.通过创建ArrayList的对象表示得到一个集合容器,同时ArrayList提供了比数组更好用、更丰富的API(功能)给程序员使用。

集合与数组类似,也是一种容器,用于装数据的。
数组特点:
数组定义完成并启动后,类型确定,长度固定。


存在的问题:在个数不能确定,且要进行增删数据操作的时候,数组是不太合适的。
集合特点:
集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合非常适合做元素个数不确定,且要进行增删操作的业务场景。
集合的提供了许多丰富,好用的功能,而数组的功能很单一。

ArrayList集合快速入门

ArrayList集合:
ArrayList是集合中的一种,它支持索引。
ArraList集合的对象获取:

ArrayList集合添加元素的方法

package jihe;
import java.util.ArrayList;public class ArrayListtest {public static void main(String[] args) {// 创建ArrayList集合的对象ArrayList list = new ArrayList();// 添加数据list.add("香香");list.add(12);list.add(12.1);list.add(false);list.add('中');System.out.println(list);  // [香香, 12, 12.1, false, 中]list.add(1,"臭臭");System.out.println(list); // [香香, 臭臭, 12, 12.1, false, 中]}
}

ArrayList对于泛型的支持

泛型概述:
ArrayList:其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据类型。
例子:
ArrayList:此集合只能操作字符串类型的元素。
ArrayList:此集合只能操作整数类型的元素。
注意:集合中只能存储引用类型,不支持基本数据类型。

package jihe;
import java.util.ArrayList;public class ArrayDemo {public static void main(String[] args) {ArrayList<String> list = new ArrayList <>();list.add("香香");list.add("臭臭");System.out.println(list); // [香香, 臭臭]ArrayList<Integer> list1 = new ArrayList <>();list1.add(23);list1.add(100);System.out.println(list1); // [23, 100]}
}

ArrayList常用API、遍历

package jihe;import java.util.ArrayList;public class ArrayDm {public static void main(String[] args) {ArrayList<String> list = new ArrayList <>();list.add("香香");list.add("小杨");list.add("香香");list.add("臭臭");list.add("大胖");list.add("小王");list.add("小云");// 获取某个索引位置处的元素值System.out.println(list.get(4)); // 大胖// 获取集合的元素个数System.out.println(list.size()); // 7// 完成集合元素遍历for (int i = 0; i < list.size(); i++) {System.out.println("遍历后的集合为:"+list.get(i));}// 删除某个索引位置处的元素值,返回被删除的元素值System.out.println("原始集合为:"+list); // 原始集合为:[香香, 小杨, 香香, 臭臭, 大胖, 小王, 小云]System.out.println("删除的值为:"+list.remove(3));  // 删除的值为:臭臭System.out.println("删除后的集合为:"+list); // 删除后的集合为:[香香, 小杨, 香香, 大胖, 小王, 小云]System.out.println("-----------------------------------");// 直接删除元素值,删除成功返回true,删除失败返回falseSystem.out.println("原始集合为:"+list); // 原始集合为:[香香, 小杨, 香香, 大胖, 小王, 小云]System.out.println("删除的值为:"+list.remove("小王")); // 删除的值为:trueSystem.out.println("删除的值为:"+list.remove("香香")); // 删除的值为:trueSystem.out.println("删除后的集合为:"+list); //删除后的集合为:[小杨, 香香, 大胖, 小云]// 修改某个索引位置处的元素值System.out.println("你修改的是:"+list.set(3, "小狗")); // 小云System.out.println("修改后的集合:"+list); // [小杨, 香香, 大胖, 小狗]}
}

ArrayList集合案例:遍历并删除元素。

需求:
某个班级的考试在系统上进行,成绩大致为:98,77,66,89,79,50,100。
现在需要先把成绩低于80分以下的数据去掉。
分析:
定义ArrayList集合存储多名学员的成绩。
遍历集合每个元素,如果元素值低于80分去掉它。

package jihe;
import java.util.ArrayList;public class ArrayDemo {public static void main(String[] args) {ArrayList <Integer> scores = new ArrayList <>();scores.add(98);scores.add(77);scores.add(66);scores.add(89);scores.add(79);scores.add(50);scores.add(100);System.out.println(scores);// 把赋于80分的成绩从集合中去掉
//      // 方法一:
//        for (int i = 0; i < scores.size(); i++) {//            int score = scores.get(i);
//            if (score < 80) {//                scores.remove(i);
//                i--;
//            }
//        }
//        System.out.println(scores);// 方法二:for (int i = scores.size()-1; i >= 0; i--) {int score = scores.get(i);if (score < 80) {scores.remove(i);}}System.out.println(scores);}
}

ArrayList集合案例:存储自定义类型的对象

需求:某影院系统需要在后台存储上述三部电影,然后依次展示出来。
分析:
定义一个电影类,定义一个集合存储电影对象。
创建三个电影对象,输出相关信息。

ArrayTests类:

package jihe;
import java.util.ArrayList;public class ArrayTests {public static void main(String[] args) {// 定义电影类// 创建一个电影类型的Arraylist集合,存储三部电影对象ArrayList<Movie> movies = new ArrayList <>();movies.add(new Movie("《肖生克的救赎》",9.7,"罗宾斯"));movies.add(new Movie("《霸王别姬》",9.6,"张国荣,张丰毅"));movies.add(new Movie("《阿甘正传》",9.5,"汤姆.汉克斯"));// 遍历访问for (int i = 0; i < movies.size(); i++) {Movie m = movies.get(i);System.out.println("电影名称:"+m.getName());System.out.println("电影得分:"+m.getScore());System.out.println("电影主演:"+m.getActor());System.out.println("--------------------------------");}}
}

Movie类:

package jihe;public class Movie {private String name;private double score;private String actor;public Movie() {}public Movie(String name, double score, String actor) {this.name = name;this.score = score;this.actor = actor;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}public String getActor() {return actor;}public void setActor(String actor) {this.actor = actor;}
}

ArrayList集合案例:元素搜索


需求:后台程序需要存储如上学生信息并展示,然后要提供按照学号搜索学生信息的功能。
分析:
定义Student类,定义ArrayList集合存储如上学生对象信息,并遍历展示出来。
提供一个方法,可以接受ArrayList集合,和要搜索的学号,返回搜索到的学生对象信息,并展示。
使用死循环,让用户可以不停的搜索

package jihe;
import java.util.ArrayList;
import java.util.Scanner;public class ArraySudent {public static void main(String[] args) {// 定义学生类// 创建学生对象,把学生对象添加到集合中去ArrayList<Student> students = new ArrayList <>();students.add(new Student("20220302","叶孤城",23,"护理一班"));students.add(new Student("20220303","东方不败",25,"中药二班"));students.add(new Student("20220304","菠萝吹雪",24,"神经二班"));students.add(new Student("20220305","梅超风",22,"中药一班"));// 遍历展示System.out.println("学号\t\t\t姓名\t\t年龄\t班级");for (int i = 0; i < students.size(); i++) {Student s = students.get(i);System.out.println(s.getStudyNumber()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getClassName());}//定义方法完成搜索功能Scanner sc = new Scanner(System.in);while (true){System.out.println("请您输入学号查询学生:");String studyNumber = sc.next();Student s = getStudentByid(students,studyNumber);// 判断s中是否存在学生对象if(s==null){System.out.println("对不起,查无此人。");}else {System.out.println("您查询的学生信息如下:");System.out.println("学号\t\t\t姓名\t\t年龄\t班级");System.out.println(s.getStudyNumber()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getClassName());}}}/*** 根据学号查询对象返回* @param students 存储全部学生对象集合* @param StudyNumber 搜索学生学号* @return 学生对象 / null*/public static Student getStudentByid(ArrayList<Student> students,String StudyNumber){// 遍历学生对象for (int i = 0; i < students.size(); i++) {Student s = students.get(i);// 询问当前遍历的这个学生对象学号,是否是我们要找的学号if(s.getStudyNumber().equals(StudyNumber)){// 是我们要找的学生对象,返回return s;}}// 查无此人return null;}
}

java中的String和ArrayList类相关推荐

  1. 重温java中的String,StringBuffer,StringBuilder类

    不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...

  2. Java中的String类占用多大的内存

    写在前面 对于Java中的String类占用多大的内存空间这个问题,是最近面试中问的比较多的一个问题.很多小伙伴的回答的都不是很正确,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有 ...

  3. string类转数组 java_将java中的 string 类型转成 数组案例

    这个要看你的具体需求了.如果是有分隔符的那种例如"a,b,c";就直接分割就行了. String string = "a,b,c"; String [] str ...

  4. Java中的String,StringBuilder,StringBuffer三者的区别

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  5. java 为什么有匿名类_全面了解Java中的内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...

  6. Java 中的线程安全的类

    Java 中的线程安全的类 3 个线程安全的类 它们对应的非线程安全的类 它们延伸的类 其它 它们对应的非线程安全的类 3 个线程安全的类   Java 中的 3 个基本的线程安全的类为:Hashta ...

  7. java 字符串是对象吗_解析Java中的String对象的数据类型

    解析Java中的String对象的数据类型 2007-06-06 eNet&Ciweek 1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所 ...

  8. Java 中的 String 真的是不可变的吗

    转载自   Java 中的 String 真的是不可变的吗 我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码. public final class Str ...

  9. Java中关于String类型的10个问题

    转载自   Java中关于String类型的10个问题 1. 如何比较两个字符串?用"="还是equals 简单来说,"=="是用来检测俩引用是不是指向内存中的 ...

  10. 剖析java中的String之__拼接

    剖析java中的String之__拼接 分类: java 2011-08-24 17:46 31人阅读 评论(0) 收藏 举报 出处, http://blog.csdn.net/izard999/ar ...

最新文章

  1. R语言ggplot2可视化分面图(facet_grid):ggplot2可视化为分面图的每个组添加平均值线条
  2. [0618]Tyvj1128中文大写数字
  3. 搭建mongodb集群(副本集+分片)
  4. PID算法搞不懂?看这篇文章。
  5. SPI的4种工作模式(备忘)
  6. 云漫圈 | 什么是微服务?
  7. WebBrowser的Cookie操作
  8. 视频帧AI分析后编码
  9. Android OpenGL/Gralloc到framebuffer和LCD流程(六)
  10. 讨论 innodb_log_block_size 变量
  11. Java Set操作
  12. google人体浏览器+android,google人体浏览器
  13. OpenWrt官方入门手册
  14. Ubuntu设置Adsl上网
  15. 洛谷刷题笔记 鸡尾酒疗法
  16. 解释术语 计算机系统结构,北京邮电大学 计算机系统结构(体系结构) 期末复习 术语解释.doc...
  17. Harris角点及Shi-Tomasi角点检测
  18. 【数据分析】搜索和非结构化数据分析值得关注的5大趋势
  19. 关于sqoop抽取数据时显示ERROR :/QueryResult.java‘ already exists 解读
  20. 信息安全——消息认证与数字签名

热门文章

  1. html5学生dw网页设计大作业,hbuilder华谊网页设计成品模板,静态网页设计定制
  2. 数学三角形和倒三角形公式表达了什么
  3. 最全架构设计实践方法论(一)
  4. UE4 通过蓝图实现蓝图接口
  5. ESP8266恒温控制器
  6. excel自动求和_excel自动求和你会吗?更改姓名自动算出总分,三个函数轻松搞定...
  7. 802.11速率详解
  8. springboot毕设项目自驾旅游网站的设计与实现gah85(java+VUE+Mybatis+Maven+Mysql)
  9. 基于springboot的张家口自驾游管理系统
  10. 探索Selenium打开浏览器加载慢的原因