java中的String和ArrayList类
常用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类相关推荐
- 重温java中的String,StringBuffer,StringBuilder类
不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...
- Java中的String类占用多大的内存
写在前面 对于Java中的String类占用多大的内存空间这个问题,是最近面试中问的比较多的一个问题.很多小伙伴的回答的都不是很正确,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有 ...
- string类转数组 java_将java中的 string 类型转成 数组案例
这个要看你的具体需求了.如果是有分隔符的那种例如"a,b,c";就直接分割就行了. String string = "a,b,c"; String [] str ...
- Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- java 为什么有匿名类_全面了解Java中的内部类和匿名类
Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...
- Java 中的线程安全的类
Java 中的线程安全的类 3 个线程安全的类 它们对应的非线程安全的类 它们延伸的类 其它 它们对应的非线程安全的类 3 个线程安全的类 Java 中的 3 个基本的线程安全的类为:Hashta ...
- java 字符串是对象吗_解析Java中的String对象的数据类型
解析Java中的String对象的数据类型 2007-06-06 eNet&Ciweek 1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所 ...
- Java 中的 String 真的是不可变的吗
转载自 Java 中的 String 真的是不可变的吗 我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码. public final class Str ...
- Java中关于String类型的10个问题
转载自 Java中关于String类型的10个问题 1. 如何比较两个字符串?用"="还是equals 简单来说,"=="是用来检测俩引用是不是指向内存中的 ...
- 剖析java中的String之__拼接
剖析java中的String之__拼接 分类: java 2011-08-24 17:46 31人阅读 评论(0) 收藏 举报 出处, http://blog.csdn.net/izard999/ar ...
最新文章
- R语言ggplot2可视化分面图(facet_grid):ggplot2可视化为分面图的每个组添加平均值线条
- [0618]Tyvj1128中文大写数字
- 搭建mongodb集群(副本集+分片)
- PID算法搞不懂?看这篇文章。
- SPI的4种工作模式(备忘)
- 云漫圈 | 什么是微服务?
- WebBrowser的Cookie操作
- 视频帧AI分析后编码
- Android OpenGL/Gralloc到framebuffer和LCD流程(六)
- 讨论 innodb_log_block_size 变量
- Java Set操作
- google人体浏览器+android,google人体浏览器
- OpenWrt官方入门手册
- Ubuntu设置Adsl上网
- 洛谷刷题笔记 鸡尾酒疗法
- 解释术语 计算机系统结构,北京邮电大学 计算机系统结构(体系结构) 期末复习 术语解释.doc...
- Harris角点及Shi-Tomasi角点检测
- 【数据分析】搜索和非结构化数据分析值得关注的5大趋势
- 关于sqoop抽取数据时显示ERROR :/QueryResult.java‘ already exists 解读
- 信息安全——消息认证与数字签名
热门文章
- html5学生dw网页设计大作业,hbuilder华谊网页设计成品模板,静态网页设计定制
- 数学三角形和倒三角形公式表达了什么
- 最全架构设计实践方法论(一)
- UE4 通过蓝图实现蓝图接口
- ESP8266恒温控制器
- excel自动求和_excel自动求和你会吗?更改姓名自动算出总分,三个函数轻松搞定...
- 802.11速率详解
- springboot毕设项目自驾旅游网站的设计与实现gah85(java+VUE+Mybatis+Maven+Mysql)
- 基于springboot的张家口自驾游管理系统
- 探索Selenium打开浏览器加载慢的原因