Java包(访问修饰符的范围)、String字符串、StringBuilder类、基本类型和引用类型

包:是Java对类进行组织管理、划分类命名空间的机制,解决类名冲突问题

包的优点:

  分类管理类,便于类的查找与使用

  通过访问修饰符,可以对数据安全性进行管理

包名:纯小写(域名.项目名.模块名······)点代表文件夹分层,每个点分开的都是文件夹,系统会自动生成

包的声明:new——package

包的使用:

  Java默认情况下访问Java.lang包中的数据

  访问Java.lang包以外的数据需要导入该包

  使用import包名.*导入包中所有数据

  使用import包名.类名导入保重指定的类型

访问修饰符的范围:

  默认不加任何修饰符是当前包中可以访问

  public 表示项目中所有地方都能访问

  protected 表示当前包和子类(不管在不在本包中)中都能访问

  private 表示仅在当前类中

 

a包中要调用b包中的数据

a包中

packa com.igeek.a;
import com.igeek.b.ClassB;
public class ClassA{
  public void methodA(){
    //将B类进行实例化,因为B类在b包中,所以要导入
    ClassB classB=new ClassB();
    //调用classB对象中的methodB
    classB.methodB();
  }
}

b包中

package com.igeek.b;
  public class Class{
  int a;//默认
  public int b;//public在项目中都能访问
  protected int c;//protected在当前包中和子类都允许访问
  pricate int d;//private 仅在当前类中允许访问
    public void methodB(){
  }
}

 

String字符串:

String类型:字符串是由多个单字符构成的类型

public void Demo{
  public static void main(String[] args){
    //直接创建字符串
    String s1="hellogeekhome";
    //创建对象的方式创建字符串
    String s2=new String("hellogeekhome");
    //字符串连接的方式创建字符串
    String s3="hello"+"geekhome";
    //和S2同样的方式
    String s4=new String("hellogeekhome");

    //进行比较
    System.out.println(s1==s2);
    System.out.println(s1==s3);
    System.out.println(s2==s3);
    System.out.println(s2==s4);
  }
}

s1和s3都是方法区中常量池内的值,s2和s4都是在堆中创建出来的对象

==对比的是地址,所以只要地址不同,字符串比较的结果就是错误的

s1==s2:fault,因为1是在方法区中,2实在堆中
s1==s3:true,因为1和3都是常量池中的数据,且字符串就是单个字符连接的,所以即使是连接的方式创建字符串地址也是相同的
s2==s3:fault,和1与3比较的原因相同
s2==s4:fault,虽然两者都是通过创建对象的方法进行创建字符串,且都是存储在堆中,但是每次创建新对象结果都是不同的,所以对象的地址是不同的

 获得字符串的长度:length()  返回值为int

判断字符串是否相等:equals()  返回值为boolean

          equalsIgnoreCase()    不区分大小写,返回值为boolean

统一字符大小写:

  统一大写:toLowerCase

  统一小写:toUpperCase

判断字符是否相同的例子

 

String course1="Java";
Stringcourse2="JAVA"//直接进行比较会因为大小写得到结果为false
course1.equals(course2)
//用忽略大小写的方法得到结果为true
course1.equalsIgnoreCase(course2)
//将两个字符都进行统一大小写得到结果为true
course1=course1.toLowerCase;
course2=course2.toLowerCase;
course1.equals(course2)

 

判断字符串是否以指定内容开头:startWith(String)  返回值为boolean

判断字符串是否以指定内容结尾:endsWith(String)  返回值为boolean

prefix参数中的字符串在将来可以写入正则表达式规则

字符串检索的相关方法:

  indexOf(String):检索内容在源字符串的索引位置(只会查到第一个出现改内容的位置)

  indexOf(String,int):从指定索引检索内容在源字符串中索引位置

  lastIndexOf(String):从源字符串末端检索内容的索引(该索引还是从前往后开始数的)

  charAt(int):检索指定索引对应的字符

字符串修改的相关方法:

  subString(int):从指定位置截取至随后

  subString(int,int):从起始索引截取至结束索引  //结束的索引都是至截取到这个位置为止,不包含该索引

  trim:去除字符串首尾的空格

  replaceAll(String,String):对字符串内容进行替换(第一个参数是需要替换的,第二个是要替换成的内容)

通过索引查询字符,通过字符查找索引

String s="hellogeekhome";
//结果是8
int index=s.indexOf("k");
//结果是0
int index=s.indexOf("h");
//结果是6:因为查的位置是在源字符串中的位置
int index2=s.indexOf("e",3);
//结果是9
int index3=s.lastIndexOf("h");
//结果是G
char ch=s.charAt(5);

将字符串的字符一个个打印出来

for(int i=0;i<s.length;i++){
  System.out.println(s.charAt(i));
}

验证输入的用户名只能由字母构成

Scanner sc=new Scanner(System.in);
Sys.out.println("请输入用户名:");
String name=sc.next();
for(int i=0;i<name.length();i++){
  char ch=name.charAt(i);
  //a=97,z=122;A=65,B=90
  if(!(ch>='a'&&ch<='z')||!(ch>='A'&&ch<='Z')){
    System.out.println("用户名输入非法,只能由字母构成!")
  }
}

截取字符串

String s="helloGeekhome";
//得到Geekhome
s=s.subString(5);
//得到loG
s.subString(3,6);

输入一个邮箱地址,如tom@qq.com,要求打印显示邮箱用户名和邮箱类型

String email="jack@qq.com";
//截取名字,同时确定位置并截取,截取到@不包括此索引
String name=email.subString(0,email.indexOf("@"));
//截取邮箱类型,从@符的后一位开始截取,截至最后一位
String emailaName=email.subString(email.indexOf("@")+1)

例子:编写一个方法用来判断字符串(source)中是否多次出现所查的字符串(searchStr)

两种方法:

  方法一:第二次查找是从第一次查找到的地方进行查找

  方法二:分别从头、从尾开始查找

//查找是否出现第二次的方法
public boolean validateDouble(String source,String searchStr){
  //查找有没有出现第一次
  int index=source.indexOf(searchStr);
  //如果出现了第一次则再查第二次
  if(index!=-1){
    //source.indexOf(searchStr,index+1)!=-1表示查找到了第二次
    //第二次从第一次查找到的索引的后一位开始查找
    if(source.indexOf(searchStr,index+1)!=-1){       //如果出现第二次       return true;     }   }   //如果没有出现第二次   return false; }
//查找是否出现第二次的方法
public boolean validateDouble(String source,String searchStr){
  //从头开始查找第一次出现的位置
  int index=source.indexOf(searchStr);
  //从尾开始查找第一次出现的位置
  int index1=source.lastIndexOf(searchStr)
  //如果从头和从尾查到的位置是一样的,则只出现了一次
  if(index==index1){
    return false;
  }
  //如果从头和从尾查到的位置不一样,则出现了至少两次
  else{
    return true;
  }
}

StringBuilder类:是一个可变的字符串

StringBuilder的值将会再缓冲区内进行修改

StringBuilder与String的方法几乎相同(不同的地方就在StringBuilder能够对字符串进行修改:追加、插入、删除、替换)

StringBuilder与String可相互转换

StringBuilder是非线程安全(非线程安全性能较高)

StringBuffer是线程安全(线程安全性能较低)

创建StringBuilder:创建StringBuilder的过程就是将字符串转换成StringBuilder的过程

StringBuilder str=new StringBuilder(String);

public static void main(System[] args){
  //创建StringBuilder   StringBuilder str
=new StringBuilder("hello");   System.out.peintln(str); }

StringBuilder的toString()方法可以转换为String,java中的所有类型都可以通过toString()方法转换成字符串

String s=str.toString();

StringBuilder和String不同的方法:

追加内容:str.append(string);

插入内容:str.insert(index,string);

删除内容:str.delete(startIndex,endIndex);

根据指定的索引范围替换内容:str.replace(startIndex,endIndex,str);

StringBuilder str=new StringBuilder("hello");
//再末尾添加新字符串
//hellogeekhome
str.append("geekhome");
//第一个参数表示插入的位置,第二个参数表示插入的内容
//hXellogeekhome
str.insert(1,"X");
//第一个参数表示删除开始的位置,第二个参数表示删除结束的位置,不包含该索引自身
//hllogeekhome
str.delete(1,3);
//第一个参数是替换开始的位置,第二个参数是替换结束的位置(不包含该位置),第三个参数是需要替换成的内容
//abclogeekhome
str.replace(0,2,"abc");

基本类型和引用类型的区别:

1.基本类型再传递时,传递的是对应的值,当传入的基本类型再方法中修改值时,是不会对原变量的值造成影响的

2.引用类型再传递时,传递的是其对象地址,因此再方法中对传入的引用类型数据进行变更时,将会对原数据造成影响

 例子:

User类

public class User{
  String name="tom";
}

带有方法的Demo类

public class Demo{
  public void method1(int a,int b){
    int c=a;
    a=b;
    b=c;
  }
  public void method2(User user){
    user.name="jack";
  }
  public void method3(StringBuilder a,StringBuilder b,StringBuilder c){
    //将a原值添加了A(a=AA;b=B;c=C)     a.append(
"A");
    //将b换了个新对象,原b对象不动(a=AA;b=B;新的b=BB;c=C)     b
=new StringBuilder("BB");
    //将新对象添加了B(a=AA;b=B;新的b=BBB;c=C)     b.append(
"B");
    //将C重新换了指定的新对象,原c对象不动(a=AA;b=B;新的b=BBB;c=AA)     c
=a;
    //c现在指定的是a所以是将a添加了C(a=AAC;b=B;新的b=BBB;c=AAC)     c.append(
"C");   } }

调用方法:

public static void main(System[] args){
  Demo demo=new Demo();
  int a=10,b=20;
  demo.method(a.b);
  //打印出来a=10,b=20,虽然调用了方法,但是原值不变
  System.out.println("a是"+a+"b是"+b);

  User user=new User();
  System.out.println("修改前名字是:"+user.name);
  demo.method2(user);
  //调用方法后类user类进行修改,姓名原值就发生了改变
  System.out.println("修改后名字是:"+user.name);

  //对abc通过调用方法进行修改   StringBuilder a
=new StringBuilder("A");   StringBuilder b=new StringBuilder("B");   StringBuilder c=new StringBuilder("C");   demo.method3(a,b,c);   System.out.println(a);   System.out.println(b);   System.out.println(c); }

 

posted @ 2020-04-29 12:07  小小野生程序员sunny  阅读(504)  评论(0编辑  收藏  举报