Java基础自学笔记——第十章:面向对象思考

第十章:面向对象思考

一.面向对象

1.面向过程的范式在于设计方法,面向对象的范式在于将数据和方法偶合在一起。

2.类的抽象是指类的实现和类的使用分开,实现的细节被封装并对用户隐藏,称为类的封装。

二.类的关系

类之间的关系是关联、聚合、组合和继承

1.关联:一种常见的二元关系,描述两个类之间的活动

2.聚集是关联的一种特殊形式,代表两个对象之间的归属关系,例如学生与地址,一个对象可以被多个其他的聚集对象所拥有

3.如果一个对象指归属于一个聚集对象,那么它和聚集对象之间的关系被称为组合,例如:学生和名字

三.将基本类型当做对象处理

1.基本类型:int double char……
包装类:Integer Double Character……

每个包装类都包含intValue()、doubleValue()等方法将对象“转换”为基本类型值

可以使用基本类型值和表示数值的字符串构造包装类

compareTo()方法返回大于等于小于所对应的1、0、-1

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		Integer i = new Integer(3);
		
		Double d = new Double(3.5);
		Double d2 = new Double("3.5");
		Double d3 = new Double("1.5");
		Double d4 = new Double("8.5");
		
		System.out.println(i.intValue());//3
		System.out.println(d.doubleValue());//3.5
		System.out.println(d2.doubleValue());//3.5
		System.out.println(Double.valueOf("6.5"));//6.5
		System.out.println(d.compareTo(d2));//0
		System.out.println(d.compareTo(d3));//1
		System.out.println(d.compareTo(d4));//-1
	}

将字符串转为二进制、八进制、十进制、十六进制

        //语法:
        Integer i=Integer.parseInt(字符串,进制)//进制可以为2,8,10,16

		int i2=Integer.parseInt("011", 2);
		System.out.println(i2);//3

        //转换为16进制的第二种方法
        System.out.println(String.format("%x", 26));//1a

注意
包装类没有无参构造

2.基本类型和包装类型之间的自动转换
基本—>包装(装箱)
包装—>基本(开箱)

Integer x=new Integer(2);//等价于 Integer x=2 (自动装箱)

//但是:
Double d=3;//错误
Double d=3.0//正确

四.BigInteger和BigDecimal对象

1.BigInteger和BigDecimal类可以表示任意大小和任意精度的整数或十进制数

2.通过new BigInteger(字符串)来创建

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		BigInteger bi = new BigInteger("1234567845678984327");
		System.out.println(bi);//1234567845678984327

		BigDecimal bd = new BigDecimal("3.14159265358979323846264338327950288");
		System.out.println(bd);//3.14159265358979323846264338327950288
	}

3.使用add substract multiply divids remainder 做加减乘除余运算

4.注意:
BigDecimal如果结果不能终止,就会抛出异常。可以使用重载的divide(BigDecimal d,小数点后位数,除数)

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
    System.out.println(fact(50));//返回50的阶乘结果
    //608281864034267560872252163321295376887552831379210240000000000
	}
	public static BigInteger fact(long x) {
    
    
		BigInteger sum=BigInteger.ONE;//BigInteger.ONE=1;
		for(int i=1;i<x;i++) {
    
    
			sum=sum.multiply(new BigInteger(i+""));//使用multiply做乘法
		}
		return sum;
	}

五.String类

String 对象是不可改变的,字符串一旦建立,内容就不可改变
String类有13个构造方法和多个处理字符串的方法

    char[] c= {
    
    'j','a','v','a'};
    String s=new String(c);
    System.out.println(s);//java

    String s1="welcome";//创建了一个对象,将Welcome放入了常量池中
    String s2=new String("welcome");//新的对象   如果常量池中不存在welcome,则词语局创建了两个对象,分别是将Welcome放入常量池中,将new的对象放入堆中
    String s3="welcome";//和s1指向同一个地址
    System.out.println(s1==s2);//false
    System.out.println(s1==s3);//true

字符串中常用方法:

    String s="hello java";
    System.out.println(s.replace('a', 'e'));//hello jeve
    System.out.println(s.replaceFirst("l", "y"));//heylo java
    System.out.println(s.replaceAll("l", "y"));//heyyo java
    String[] list=s.split("o");
    for(String i:list)
    System.out.print(i+" ");//hell   java

六.正则表达式

正则表达式:用某个模式来匹配、替换和分割一个字符串

将字符串转为字符数组:

    String s="hello java";
    char[] a=s.toCharArray();
    for(char i:a)
    System.out.print(i+" ");//h e l l o   j a v a 

将数组转为字符串
上文中有提到

通常使用matches、replace、replaceAll等方法,建议面向百度编程,更加全面

七.StringBuilder和StringBuffer类

1.可以给StringBuilder和StringBuffer类添加、插入、追加新的内容

2.StringBuffer适合执行多任务并发时,因为它修改缓冲区是同步的,而StringBuilder执行单任务效率更高,剩余两个一模一样

3.StringBuilder有3个构造方法和30多个处理字符串的方法

    StringBuilder s=new StringBuilder();//创建一个容量为16的空字符串构造器
    StringBuilder s2=new StringBuilder(20);//指定容量
    StringBuilder s3=new StringBuilder("hello java");//指定字符串
    
    System.out.println(s.capacity());//16
    System.out.println(s2.capacity());//20

提示:

如果一个字符串不需要改变,则用String,因为String优化共享字符串

在计算机中字符串构造器就是字符数组,构造器的容量就是数组的大小,如果超出容量,就会创建一个容量为2*(现有容量+1)的数组

如果容量过大,可以使用trimToSize()将容量降到实际大小

下面这个案例可以看到字符串和它的倒置竟然相等!!!

    StringBuilder s=new StringBuilder("java is fun");
    System.out.println(s.reverse());//nuf si avaj
    System.out.println(s.equals(s.reverse()));//true

原因是StringBuilder没有没有重写equals方法,而总是指向原先的对象
需要加toString方法来实现比较

    System.out.println(s.toString().equals(s.reverse().toString()));//false

StringBuilder的其他方法就不过多介绍了,今后也会经常使用

[后期补充]-2020-03-06

1.String类的内容不会改变
StringBuilder可以动态构造字符串,线程不安全
StringBuffer可以动态构造字符串,线程安全

2.三者在速度和占用内存方面的比较
速度:StringBuilder>StringBuffer>String
内存:String>StringBuffer>StringBuilder

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		StringBuilder s = new StringBuilder();
		long remain1 = Runtime.getRuntime().freeMemory();// 剩余内存
		long begin = System.currentTimeMillis();
		for (int i = 0; i < 5000; i++) {
    
    
			s.append(i);
		}
		long end = System.currentTimeMillis();
		long remain2 = Runtime.getRuntime().freeMemory();// 字符串拼接完成后剩余内存
		System.out.println("使用毫秒数:" + (end - begin) + "\t使用内存:" + (remain1 - remain2));
//结果:StringBuilder:使用毫秒数:10	使用内存:1032240
     //StringBuffer:使用毫秒数:12	使用内存:1032240
     //String:使用毫秒数:4196	使用内存:-114659128
	}

3.使用场景:

  • 少量数据并字符串不会改变——String
  • 单线程操作字符串缓冲区下操作大量数据——StringBuilder
  • 多线程操作字符串缓冲区下操作大量数据——StringBuffer

八.总结

通过本章学习,我知道了面向对象的特点和类的四种关系,学会了基本类型和包装类型的互相转化,学会了自动装箱与拆箱,学会了BigInteger类和BigDecimal类基础的用法,学到了String类对字符串的处理和存储机制,学到了StringBuilder和StringBuffer的区别和相同点,对字符串可以说是全方位服务,和String类各有千秋,正则表达时在本章只是提了一下,这是一块非常实用的功能,奈何本人能力有限,顾虑讲解不够全面,大家大可面向百度编程此方面内容,量大全面。

加油!第十一章待更……

猜你喜欢

转载自blog.csdn.net/weixin_42563224/article/details/104344271