拿捏java 3.0

126 阅读6分钟

第一阶段

19、API

应用程序编程接口  JDK-API帮助文档
Scanner:键盘录入
Random:随机数
java.io:读取文件的内容,把数据写入文件中
java.lang:提供利用java编程语言进行程序设计的基础类

20、字符串String

字符串内容不会发生改变,对象创建后不会发生改变
String是java定义的类,使用时不需要导包
创建String对象的方式(如下图所示):
    1String name="abd";
    2new   
    *字符数组->字符串:*
    若想修改字符串的内容,可以将字符串转换成字符数组,修改字符数组的内容后,再转换成字符串
    *字节数组->字符串:*
    在网络中传输的数据都是字节信息,一般要把字节信息进行转换,转成字符串,就要用到这个构造
    byte[] bys={97,98,99,100};
    String str=new String(bys);//输出为abcd
内存模型
内存包括栈内存、堆内存、方法区
    栈:方法运行时进栈,执行完毕后出栈
    堆:new出来的对象
    方法区:字节码文件临时存储,class文件
StringTable(字符串常量池):直接赋值的方式才能存储在这里面,JDK7之后,串池从方法区挪到了堆
直接赋值时,先检查串池中是否存在该字符串,若没有,创建新的,若有,复用
new方法,如果存在,不会复用,因此会浪费内存

QQ图片20231215194838.png

21常用方法

比较
    1、== 基本数据类型比较的是数据值;
          引用数据类型比较的是地址值
          (每次new出来的地址是不同的,且new出来记录的是堆里的地址;
          直接赋值的字符串会复用,这种情况下地址是相同的,记录的是串池中的地址)
    例如:Scanner sc=new Scanner(System.in);
         String str1=sc.next();//键盘输入abc,这个字符串是new出来的
         String str2="abc";
         str1==str2;//输出是false,因为str1是new出来的,而str2是直接赋值的
    2、比较字符串中的内容是否相等:
       boolean equals(要比较的字符串)  必须一模一样,不忽略大小写
       boolean equalsIgnoreCase(要比较的字符串)  忽略大小写比较
       
      public char charAt(int index):根据索引返回字符 
      public int length():返回字符串的长度
      数组的长度:数组名.length
      字符串的长度:字符串对象.length() 
 截取  String substring(int beginIndex,int endIndex) 包头不包尾;只有返回值才是截取的小串
       String substring(int beginIndex) 截取到末尾
 替换  String replace(旧值,新值) 只有返回值是替代后的结果

22、StringBuilder

StringBuilder可以看做一个容器,创建之后里面的内容是不可变的,可以提高字符串的操作效率
构造方法:public StringBuilder(){}
         public StringBuilder(String str){}
成员方法:public StringBuilder append(任意类型):添加数据,并返回对象本身
         public StringBuilder reverse():反转容器里面的内容
         public int length(){}
         public String toString():把StringBuilder转换成String
普及:1、StringBuilder是已经java写好的类,java对其进行了特殊处理,因此打印对象返回的不是地址值,是属性值
      2、链式编程:调用一个方法的时候,不需要用变量接收结果,可以继续调用其他方法
          例如:int len=getString().substring(1).replace("a","q").length();
                sb.append("aaa").append("bbb").append("ccc").append("ddd");
      3、使用StringBuilder的场景:字符串的拼接;字符串的反转;

23、StringJoiner

容器,创建之后内容可变,提高字符串的操作效率,JDK8出现
public StringJoiner(间隔符号)
public StringJoiner(间隔符号,开始符号,结束符号)   
public StringJoiner add(添加的内容) :添加数据并返回对象本身
public int length():返回长度(字符出现的个数,包括间隔符号、开始符号、结束符号)
public String toString():返回一个字符串,该字符串是拼接后的结果,包括间隔符号、开始符号、结束符号

24、字符串原理

1、字符串存储的内存原理:
    直接赋值会复用字符串常量池中的
    new出来的会开辟新空间
2、==号:基本数据类型比较的是数据值
         引用数据类型比较的是地址值
3、字符串拼接的底层原理:
    等号右边没有变量:都是字符串,编译时就已经把字符串拼接好了,已经是最终结果,因此运行时会复用常量池中的字符串
    等号右边有变量:JDK8之前:创建StringBuilder对象,append方法拼接后调用toString方法返回String,toString方法的底层是new了一个字符串对象,因此一个加号至少创建两个对象
                   JDK8之后:先预估拼接后字符串的长度创建一个数组,将字符串放入后拼接成新的字符串
                   虽然但是,+很浪费时间,拼接字符串还是用StringBuilder、StringJoiner更好
例如:String s1="abc";
      String s2="ab";
      String s3=s2+"c";
      System.out.println(s1==s3);
      //输出是false,因为s1和s3是引用数据类型,==比较的是地址值,s1为直接赋值,返回的是常量池中的地址,s3右侧有变量,无论是JDK8之前还是之后,都会new一个新的对象,会开辟新的空间,因此两者的地址不同,因此返回false

例如:String s1="abc";
      String s2="a"+"b"+"c";
      System.out.println(s1==s2);
      //输出是true,s1是直接赋值,返回的是常量池中的地址,s2等号右边没有变量,编译时已经是拼接好的字符串,因此运行的时候会复用常量池中的字符串,返回的也是常量池中的地址,因此返回true
      
4、StringBuilder提高效率原理
  所有要拼接的内容都存放在StringBuilder中,不会创建无用空间
5、StringBuilder源码分析
    默认容量是16(最多可以存放多少)//sb.capacity()
    长度:实际存放多少//sb.length()
    扩容:老容量*2+2,如果实际长度超出老容量*2+2,则以实际容量为准
6、如果看到需要修改字符串,有两种方法:
    1、用subString进行截取,将左边字符截取出来拼接到右侧
    2、将字符串变成字符数组,调整字符数组里面的内容,最后再将字符数组变成字符串
# 拿捏Java 4.0

25、集合

集合:自动扩容;    只能存引用数据类型和包装类,不能存基本数据类型 
数组:长度固定;    可存基本数据类型和引用数据类型

26、ArrayList

JDK7之前:ArrayList<E> list=new ArrayList<E>();
JDK7之后:ArrayList<E> list=new ArrayList<>();
E是泛型,限定集合中存储数据的类型,只能是引用数据类型
此时,我们创建的是ArrayList的对象,ArrayList是java已经创建好的类,底层已经对这个类做了一些处理,因此,打印对象不是地址值,而是集合中存储的数据内容,展示时会用[]将所有的数据进行包裹
成员方法:
    1、增:boolean add(E e)
    2、删:boolean remove(E e)
           E remove(int index):返回被删除的元素
    3、改:E set(int index,E e):修改指定索引的元素,返回原来的元素
    4、查:E get(int index):获取指定索引的元素
           int size():返回集合中元素的个数
基本数据类型对应的包装类:
    byte  - >Byte
    short  ->Short
    char   ->Character
    int    ->Integer
    long   ->Long
    float  ->Float
    double ->Double
    boolean->Boolean
System.exit(0);//停止虚拟机运行

练习:学生管理系统