文章目录
面向对象基本概念(一)
java类的构造
要有明确的参数构造函数和无参构造函数,要将成员变量封装好。
数组
不能使用未开辟空间的数组
二维数组
java引用传递
数组内容是引用传递,字符串也是
数组排序
二重循环,层层比较大小交换位置,大的放后面小的放前面
所有的程序起点都可以称为客户端,使用方法封装
数组转置
尽量减少垃圾的产生
方法
System.arraycopy();//数组复制
java.util.Array.sort();//排序
对象数组
对象是引用类型,数组也是引用类型,对象数组是引用类型嵌套引用类型。
String类的基本概念
String是引用类型
两种实例化方式:
使用=直接赋值
使用构造方法实现String的实例
字符串比较
引用类型都可以使用==进行比较
但是==不能进行准确字符串比较
地址不同的String对象进行比较时,就算数值相同也返回false,因为是引用类型,所以==比较的是地址,类似于指针
还可以用equals()方法进行比较
(注意Object类,后续是重点)
字符串常量就是String的匿名对象
匿名对象是指没有栈内存指向堆空间内存,只能使用一次,之后会被GC回收
实际开发中的字符串比较用equals()
String两种实例化方法的区别
1、直接复制实例化
使用=
在内存中开辟一块堆内存,栈内存将直接引用堆内存空间,在如果在内容相同的情况下,再重新声明一个相同String只是将新的变量,即栈内存直接引用已经开辟好的堆原有的堆内存,不会开辟新的空间。
这里体现了Sting类的共享设计模式,JVM中此字符串对象会被保存在对象池中,等待多次被引用
2、构造方法实例化
使用new关键字一定会开辟堆内存,不会复用。
在这个过程中,首先在堆内存中开辟一块空间来保存要构造后的字符串(String匿名对象),然后使用关键字new,开辟另一块堆空间:即真正的构造后所在的空间。之前声明的字符串会被当成垃圾被GC回收。
故会产生内存的浪费,一块会成为垃圾多用一倍内存·,也不会进入对象池。
如果希望构造方法实例化也进入对象池:
String stra = new String("").intern();
intern()方法
字符串一旦定义就不可修改
如果重新赋值,堆内存中的数据不变,重新开辟堆内存,指向了另外一个字新的符串,本质是字符串对象引用变更,最终没有被引用的内存最后变成垃圾空间,最后被GC回收,开发中应该避免字符串在循环中不断被更改,这会导致不断浪费空间。
String str="";
for(int x =0;x<1000;x++){
str+=x;//循环修改对象引用
}//最垃圾的代码.一定要避免,后面有StringBuffer(单线程)\StringBuilder(多线程)解决这个问题
String类的常用方法
java项目中大多数数据交互都是通过String进行交互的,记得查阅文档
toCharArray()拆分成字符数组
字节与字符串
转换方法:
使用构造方法可以把字符数组Byte[]转换成String
getBytes[]从字符串换成字符数组
一般只有在JavaWeb中用字符数组网络传输数据用
字符串比较
equals()
equalsIgnoreCase()
compareTo()
字符串查找
Indexof()一系列
lastIndexof()
startsWith()//购物车代码中经常见到
endsWith()
字符串替换
replaceAll()
replaceFirst()
字符串截取
subString()
字符串拆分
split()//如果设置是一个空字符串,则将整个字符串换成字符数组
//拆分的参数是正则表达式,符号记得转义
其他操作
concat()//链接
toLowerCase()//小写
tiUpperCase()//大写
trim()//去空格,也可以通过replaceAll()去空格
length()//取得长度
intern()//数据入池
isEmpty()//判断是否为空
this关键字
this关键字完成三项事情:
调用本类属性
方法参数名称与属性名称重复,此时使用this.属性明确指明要调用的是类中的属性而不是方法的参数
在访问本类中的属性时一定要加上this,不管是否重名,这样可读性更高
调用本类方法
this的本质就是明确进行本类结构的标记,除了访问类中的属性,也可以进行类中方法的调用
调用普通方法用this.方法()
调用构造方法直接this()就好
在一个类中虽然可以直接用方法名调用,但是推荐使用this调用本类的属性或者方法
使用this()方法可以消除构造方法中的重复代码,
使用this()的限制:
this()只能放在构造方法的首行
构造方法相互调用时,一定要保留调用的出口,不能各个构造方法里循环调用this
一般来说可以完善参数最多的构造方法,其他重载构造方法调用this(),减少代码重复
表示当前对象
最重要的属性:表示当前对象,当前对象就是当前正在调用的实例化对象
每个对象都有独立编码,在类内调用this专属于其类
this.属性也就是当前堆中保存的内容
引用传递
引用传递的核心思想是同一块堆内存空间被不同的栈内存所指向,类比于指针,于是不同的栈内存空间可以完成对一块堆地址的内容修改.
但是java的引用传递要比指针简单的多得多得多
参数的引用传递,所有的对象都是引用类型,所以使用参数引用其实就是栈内存对堆内存的引用,根本目的是完成对堆内存中数据的修改.
1.在函数调用引用类型的参数时
实质上是不同的栈内存在指向了同一块堆内存
直接对引用的堆空间进行修改,就会改变所有引用到该堆空间的所有引用类型
2.(String)引用传递中
使用函数其参数接收一个对象(该对象指向一个堆空间)
本质上是函数的参数变量(另一个独立的栈空间)对之前接收的对象的堆空间的引用
如果在函数内部改变了参数变量的引用目标,不会对接收的对象的引用进行任何更改.
而后,函数产生的垃圾空间被GC回收不对调用对象产生任何影响
在程序的表现中和基本类型的值传递用法差不多,
在非成员变量中进行的任何操作都不会对调用对象产生任何影响.
3.唯一改变对象直接引用的方法只有调用其所属类的成员函数
如果改变成员变量是String类型
在类的实例化成对象时,其实存在嵌套引用
即应用类型的成员也是引用类型
在使用成员函数进行修改时, 修改string其实时给string开辟了新的堆, 建立了新的引用
但是当前对象引用的String的栈空间还是原来的栈空间,最终使用效果和值传递一样
引用传递的实际应用
类的设计和数据表的设计一般无二
在类中,类的属性也可以包括实例化的本类对象.
于是就形成了链表
数据表与简单Java类的映射
简单java类在实际开发中都是根据其数据表定义来实现的
以下讲解深入的转换操作