个人复习Day8
十、API
1.1 API
常用的工具包:
- java.lang:核心的工具类,不用手动导入,默认导入
- java.util:工具类
- java.sql:连接数据库相关的类
- java.net:和网络编程相关 tcp
- java.io:输入输出流
- java.lang.reflect:和反射相关的api
1.2 String
1.2.1 字符串是不可变类
底层是一个char类型的数组 常量 private
String str="abc";//创建一个内存空间,str的地址指向abc的空间
str.concat("abc");,不改变str的地址指向,生成了一个新的内存空间放入abcabc
System.out.println(str);
//abc
public class Demo2 {
public static void main(String[] args) {
String str="abc";
String str2=new String("abc");
}
}
1.2.2 常用方法
public class Demo3 {
public static void main(String[] args) {
String str="hello";
char c=str.charAt(0);//返回指定索引处的字符。返回的是字符类型
System.out.println(c);
String str2="abcde";
int n=str2.compareTo(str);//底层代码,变成字符的数组,逐个比较,返回第一个不相同位置的字符对应的ACALL码的str2-str
System.out.println(n);
String str22="ab";
int nn=str2.compareTo(str22);//当字符都相同且尾数相同,返回0,位数不同,返回位数差str2-str22
System.out.println(nn);
boolean b=str2.endsWith("de");//判断字符串的后缀
System.out.println(b);
b=str2.startsWith("bc");//判断字符串的前缀
String str3="abCde";
System.out.println(str2.equals(str3));//区分大小写
System.out.println(str2.equalsIgnoreCase(str3));//不区分大小写
System.out.println(str2.hashCode()==str3.hashCode());//hashCode
int index=str.indexOf("bc");//返回找到第一个字符的位置,返回b的位置
index = str3.indexOf("b", 1);//找指定位置的指定位置,找不到返回-1,找到返回位置
System.out.println(index);
index=str3.lastIndexOf("d");//从后往前
index=str3.lastIndexOf("d", 3);//从后往前
System.out.println(index);
str3="hello";//字符串长度为0,返回true
System.out.println(str3.isEmpty());
str3.length();//获取字符串长度
str3.substring(2);//截取字串
str3.substring(0, 3);//包含头不包含尾,产生新串,在堆创建新空间
char[] arr=str3.toCharArray();//表示字符串的字符数组
System.out.println(arr);//字符串直接打印输出,输出字符串
str3="AdfdfD";
System.out.println(str3.toLowerCase());//返回小写
System.out.println(str3.toUpperCase());//返回大写
str3=" dd ff ";
System.out.println(str3.trim());//去掉前后空格
System.out.println(1+1+String.valueOf(1)+1+1);//各种数据类型换成字符串
}
}
1.2.3 可以使用正则表达式的方法
正则表达式可以查阅CSDN的资料比较全
.matches(regex);判断是否是正则表达式,是返回true
.replanceAll(a,b);将a全部替换成b
.matches("(a)\1(b)\2");捕获组编号,判断是否有重复的元素
str.replaceAll("(.)\1+", “$1”);捕获组编号,消除重复(在一起的重复)
.split(“a”);将a的两边分隔开
//小数格式
public static void test3(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入小数");
String phone = sc.next();
String regex="(0|[1-9][0-9]+)\\.([0-9]*)([0-9])([0-9&&[^0]]+)";
phone.matches(regex);
if(phone.matches(regex)){
System.out.println("小数格式正确");
}else{
System.out.println("不正确");
}
}
//替换
public static void test4(){
String str="gasdgnndagdsgdatmdagljasbgkahg";
String regex="(nnd)|(tmd)";
str=str.replaceAll(regex, "*");
System.out.println(str);
}
//分割
public class Demo1 {
public static void test1(){
String userInfo="admin 18 13800138000";
String[] str=userInfo.split("\\s");
System.out.println(str[1]);
}
//http:localhost"8080/demoWeb/index.jsp
//http:localhost"8080/demoWeb/login.jsp?name=admin&ps=123456
public static void test2(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入url");
String a=sc.next();
if(a.indexOf("?")==-1){
System.out.println(a);
}else{
String[] str=a.split("\\?");
String[] b=str[1].split("&");
//b[0]="name=admin"
//b[1]="ps=123456"
for(int i=0;i<b.length;i++){
String[] c=b[i].split("=");
String d=c[1];
System.out.println(d);
}
}}
//http:localhost"8080/demoWeb/index.jsp
//http:localhost"8080/demoWeb/login.jsp?name=admin&ps=123456
public static void test3(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入url");
String url=sc.next();
int index=url.indexOf("?");
if(index==-1){
System.out.println(url);
}else{
//name=admin&ps=123456
String params=url.substring(index+1);
System.out.println(params);
// datas[0]="name=admin"
// datas[1]="ps=123456"
String[] datas=params.split("&");
for(String str:datas){
System.out.println(str);
String[] param=str.split("=");
System.out.println(param[1]);
}
}
}
public static void main(String[] args) {
test2();
}
}
//编号组的应用
public class Demo2 {
public static void test1(){
String str="hhhhhhh";
str.matches("(h)\\1+");//\\1表示捕获()组的序号,
String str1="干干净净干";
str.matches("(.)\\1");//\\1表示第一组(干)之后捕获一次,也就是重复一次。如果套捕获多次,用+
//.可以代表任何字但是(..)\\1表示第一二和第三四个一样
if(str.matches("hh+")){
System.out.println("ok");
//捕获组编号的使用:捕获组的格式必须和原字符串一样
str="cat dog bird";//"dog bird cat"
str.replaceAll("(cat) (dog) (bird)", "$2 $3 $1");
}
str="我我我我我我我我水水水水你你你我";
str=str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
System.out.println(str1);
}
public static void test2(){
//[a-zA-Z0-9]{8,10}
//必须包含【】里至少两种字符
Scanner sc=new Scanner(System.in);
String a=sc.next();
//(.)\\2+(.)\\3*
boolean b=a.matches("(([a-zA-Z]|[a-z0-9]|[0-9A-Z]|[a-zA-Z0-9])\\1*)*");
// boolean b=a.matches("(((^[a-zA-Z]$)|(^[a-z0-9]$)|(^[0-9A-Z]$)|(^[a-zA-Z0-9]$))\\1*)*");
boolean c=a.matches("([a-z]+)|([A-Z]+)|([0-9]+)");
if(c==true){
System.out.println("error");
}else if(c==false){
if(b==false){
System.out.println("error");
}else{
System.out.println(a);
}
}
}
public static void test3(){
Scanner sc=new Scanner(System.in);
String a=sc.next();
boolean c=a.matches("([a-z]+)|([A-Z]+)|([0-9]+)");
System.out.println(c);
}
public static void test4(){
Scanner sc=new Scanner(System.in);
String a=sc.next();
boolean b=a.matches("(([a-zA-Z]|[a-z0-9]|[0-9A-Z]|[a-zA-Z0-9])\\1*)*");
System.out.println(b);
}
public static void main(String[] args) {
test2();
}
}
1.2.4 String不可变字符串和可变字符串
public class Demo3 {
public static void test1(){
String str="a";
long start=System.currentTimeMillis();
for(int i=1;i<=10000;i++){
str+="b";
}
long end=System.currentTimeMillis();
System.out.println(end-start);
StringBuilder builder=new StringBuilder("a");
long start1=System.currentTimeMillis();
for(int i=1;i<=1000000;i++){
builder.append("b");
}
long end1=System.currentTimeMillis();
System.out.println(end1-start1);
}
可变字符串:StringBuilder、StringBuffer
不开辟新空间,在同一空间内进行操作
String 声明的字符串不可以改变,StringBuilder、StringBuffer可以改变
StringBuilder不安全,但是速度快
public static void test1(){
StringBuilder builder=new StringBuilder("hello");
//字符串的追加
String str=builder.append("abc").toString();
System.out.println(str);
//insert
str=builder.insert(1, "a").toString();
System.out.println(str);
//delete
str=builder.delete(2,5).toString();
System.out.println(str);
//反转
str=builder.reverse().toString();
System.out.println(str);
}
public static void test2(){
StringBuilder builder=new StringBuilder("hello");
String str=builder.append("abc")
.insert(1, "a")
.delete(2, 5)
.reverse()
.toString();
System.out.println(str);
}
1.2.5字符串练习
-
输出字符串“helloworld”的字符串长度
-
输出o的位置
-
输出从下标5开始第一次出现o的位置
-
截取hello并输出
-
截取world并输出
-
将字符串“ hello ”两边的空白去掉
-
输出第六个字符
-
输出字符串是否以h开头,以ld结尾
-
将字符串分别转换为大写小写输出
public class Test {
public static void main(String[] args) {
String str="helloworld";
System.out.println(str.length());
System.out.println(str.indexOf("o"));
System.out.println(str.indexOf("o", 5));
System.out.println(str.substring(0, 5));
System.out.println(str.substring(5,10));
System.out.println(str.trim());
System.out.println(str.charAt(6));
System.out.println(str.startsWith("h"));
System.out.println(str.endsWith("ld"));
System.out.println(str.toLowerCase());
System.out.println(str.toUpperCase());
}}
- 截取子串:
Str=”www.oracle,com”//oracle
Str=”www.cedu.com.cn”//tedu
public class Test1 {
public static void main(String[] args) {
String str="www.tedu.com.cn";
System.out.println(str.length());
//先通过循环找出所有的".",返回"."的位置
for(int i=0;i<=14;i++){
if(str.charAt(i)=='.'){
System.out.println(i);
}
}
System.out.println(str.substring(4, 8));
}
}
- 判断回文(回文,从中间开始两边对称)
Str=”上海自来水来自海上”;
public class Test2 {
public static void main(String[] args) {
String str="上海自来水来自海上";
System.out.println(str.length());
out:for(int i=0;i<=4;i++){
if(str.charAt(i)!=str.charAt(8-i))
System.out.println("不是回文");
break out;
}
System.out.println("是");
}
}
- 输入一个字符串,统计字符串中字母、数字和其他符号的个数
public class Test3 {
public static void main(String[] args) {
int x=0;
int y=0;
int z=0;
Scanner sc=new Scanner(System.in);
System.out.println("输入字符串");
String a=sc.next();
System.out.println(a.length());
int b=a.length();
for(int i=0;i<b;i++){
if((a.charAt(i)>='a'&&a.charAt(i)<='z')||(a.charAt(i)>='A'&&a.charAt(i)<='Z')){
x=x+1;
}else if(a.charAt(i)>='0'&&a.charAt(i)<='9'){
y=y+1;
}else{
z=z+1;
}
}
System.out.println("字母有"+x+"个,数字有"+y+"个,其他字符有"+z+"个");
}
}
13 输入一个字符串,将其中的数字提取出来并求和
dsho353sdhiha89dnso4 -> 3+5+3+8+9+4 = 32
public class Test4 {
public static void main(String[] args) {
int x=0;
int y=0;
Scanner sc=new Scanner(System.in);
System.out.println("输入字符串");
String a=sc.next();
System.out.println(a.length());
int b=a.length();
for(int i=0;i<b;i++){
if(a.charAt(i)>='0'&&a.charAt(i)<='9'){
x=a.charAt(i)-'0';
y=x+y;
}
}
System.out.println(y);
}
}
- 输入一个字符串,将其中的数字提取出来并进行升序排序
dsho353sdhiha89dnso4 -> 353894 -> 334589
public class Test5 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("输入字符串");
String a=sc.next();
System.out.println(a.length());
int b=a.length();
int[] arr=new int[b];
for(int i=0;i<b;i++){
if(a.charAt(i)>='0'&&a.charAt(i)<='9'){
arr[i]=a.charAt(i)-'0';
}
}
Arrays.sort(arr);
System.out.print(Arrays.toString(arr));
}
}
- 输入一个字符串,统计其中每一个字符出现的次数
sdhaofnaadsg -> s:2 d:2 h:1 a:3 o:1 f:1 n:1 g:1
//自己的,不用数组,纯字符串操作,利用反射更改字符串内容,一时兴起写的
思路:先创建一个字符串a接收用户输入的字符串,再创建一个被a赋值的字符串n,a和n地址不同,值相同,这样对n进行操作不会影响a
外for循环,遍历n字符串,如果遍历到"中",直接跳出本循环,("中后面说明"),内for循环,用第j个元素和之后的元素比较,如果相同,
将后面的那个元素变为"中"(确保用户不会输入的值),计数器+1,当内循环循环到改变之后的"中"时,跳出本次内循环,
当外循环完成一次循环,输出本次循环的第i个元素和所记的数,然后将计数器归1进行下一次循环(因为第i个元素至少出现一次)
public class Test6 {
public static void main(String[] args)throws Exception {
int x=1;
Scanner sc=new Scanner(System.in);
System.out.println("输入字符串");
String a=new String();
a=sc.next();
String n=new String();
n=a;
System.out.println(a.length());
int b=a.length();
//int[] arr=new int[b];
for(int i=0;i<b;i++){
if(n.charAt(i)=='\u4e2d'){
x=1;
continue;
}
for(int j=i+1;j<b;j++){
if(n.charAt(i)==n.charAt(j)){
Class clz=n.getClass();
Field field=clz.getDeclaredField("value");
field.setAccessible(true);
char[] ch=(char[])field.get(n);
ch[j]='\u4e2d';
++x;
}else{
continue;
}
}
System.out.print(a.charAt(i)+":"+x+" ");
x=1;
}
}}
//数组方式
public static void t6(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
String str = sc.next();
boolean[] b = new boolean[str.length()];
for(int i = 0;i<b.length;i++){
if(b[i]){ //如果当前索引处的值为true,说明已经记过数了
continue;
}
char c = str.charAt(i);
int count = 0;
for(int j = i;j<str.length();j++){
if(str.charAt(j)==c){
b[j]=true;//表示b数组的索引位置的值为true
count++;//计数
}
}
System.out.println(c+":"+count);
}
}
public static void main(String[] args) {
t6();
}
}
1.3 Object
toString、equals hashcode
public class Demo5 {
public static void test1(){
String str=new String("hello");
Student stu=new Student(18);
System.out.println(str);
System.out.println(stu);
Student stu2=new Student(18);
String str2=new String("hello");
boolean b=str.equals(str2);
//object 类equals等价于==
boolean b2=stu.equals(str2);
System.out.println(b);
System.out.println(b2);
System.out.println(str.hashCode()+","+str2.hashCode());
System.out.println(stu.hashCode()+","+stu2.hashCode());
}