一、java基础
二、啊哈算法
三、复习链表
java基础
1.构造方法:
作用:构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法。
格式: 方法的名字必须和类的名字完全一致。构造方法不允许写返回值类型,void也不能写。命名格式如下
public 类名称(参数类型 参数名称) {
方法体
}
注意事项:
1.构造方法的名称要跟所在的类名称一模一样,包括大小写。
2.构造方法没有返回值类型,连void都不能写。
3.构造方法不能rerturn一个具体的值作为返回值。
4.如果没有编写构造方法,编译器会默认赠送一个构造方法:public Student(){}
5.如果写了至少一个构造方法,编译器将不再赠送。
6.构造方法也能进行重载(方法名称相同,参数列表不同)
测试代码:
定义类:
package day4;
public class Student {
private int age;
private String name;
public Student(){
System.out.println("无参数的构造方法执行!");
}
public Student(int age,String name){
this.age = age;
this.name = name;
System.out.println("全参数的构造方法执行!");
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
main方法:
package day4;
public class student01 {
public static void main(String[] args) {
Student st1 = new Student();
Student st2 = new Student(20,"小娟");
System.out.println("姓名:"+st2.getName());
System.out.println("年龄:"+st2.getAge());
st2.setAge(22);
st2.setName("卢文慧");
System.out.println("姓名:"+st2.getName());
System.out.println("年龄:"+st2.getAge());
}
}
2.匿名对象
作用:经常和Scanner连用。
3.random
题目1:随机生成1~n范围的随机数。
方法:整体+1即可。
题目2:猜数(淼)
直接代码:
package day5;
import java.util.Random;
import java.util.Scanner;
public class useRandom03 {
public static void main(String[] args) {
int a = new Random().nextInt(5);
/*System.out.println("请输入猜的数字:");
int guess = new Scanner(System.in).nextInt();
if(guess==a)
System.out.println("猜对啦");
else if(guess<a)
System.out.println("猜小了");
else
System.out.println("猜大了");*/
while(true){
System.out.println("请输入猜的数字:");
int guess = new Scanner(System.in).nextInt();
if(guess==a) {
System.out.println("猜对啦");
break;
}
else if(guess<a)
System.out.println("猜小了");
else
System.out.println("猜大了");
}
}
}
4.对象数组
重点:对象数组里面的元素存放的是对象的地址值
package day5;
public class Arry {
public static void main(String[] args) {
Person[] arr = new Person[3];
Person one = new Person(28,"迪丽热巴");
Person two = new Person(18,"古力娜扎");
Person three = new Person(30,"马儿扎哈");
arr[0] = one;
arr[1] = two;
arr[2] = three;
System.out.println(arr[0].getName()+" 年龄:"+ arr[0].getAge());
System.out.println(arr[1].getName()+" 年龄:"+ arr[1].getAge());
System.out.println(arr[2].getName()+" 年龄:"+ arr[2].getAge());
}
}
比如arr[0] = one中就是把one里面存放的地址值赋给了arr【0】所以后面才能用arr[0].age.
5.ArryList
格式:ArrayList list = new ArrayList<>();
1.常用方法:
演示:
package day5;
import java.util.ArrayList;
public class demoArryList {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("迪丽热巴");
list.add("古力娜扎");
list.add("马尔扎哈");
System.out.println(list);
String a = list.get(0);
System.out.println(a);
list.remove(2);
System.out.println(list);
int size = list.size();
System.out.println(size);
//遍历集合:
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
题目1.添加随机数:
package day5;
import java.util.ArrayList;
import java.util.Random;
public class addRandomTOArryList {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 6; i++) {
list.add(new Random().nextInt(33)+1);
}
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
题目2.添加对象到集合:自定义四个学生对象添加到集合,并遍历。
package day5;
import java.util.ArrayList;
public class solutionaddstudent {
public static void main(String[] args) {
Student one = new Student("赵丽颖",20);
Student two = new Student("迪丽热巴",22);
Student three = new Student("古力娜扎",26);
Student four = new Student("马尔扎哈",200);
ArrayList<Student> list = new ArrayList<>();
list.add(one);
list.add(two);
list.add(three);
list.add(four);
for (int i = 0; i < 4; i++) {
System.out.println(list.get(i).getName()+" 年龄:"+list.get(i).getAge());
}
}
}
题目三:格式化输出集合(淼)
package day5;
import java.util.ArrayList;
public class PrintArrylist {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
printArryList(list);
}
public static void printArryList(ArrayList<Integer> a){
for (int i = 0; i < a.size(); i++) {
System.out.print("{");
if(i==0) {
System.out.print(a.get(i));
}
else
System.out.print("@"+a.get(i));
if(i==a.size()-1){
System.out.print("}");
}
}
}
}
题目4.:筛选集合元素
package day5;
import java.util.ArrayList;
import java.util.Random;
public class ChoseArryList {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list1.add(new Random().nextInt());
}
System.out.println(list1);
System.out.println("----------------------------");
ArrayList<Integer> list2 = new ArrayList<>();
for (int i = 0; i < 20; i++) {
if(selectArryList(list1.get(i)))
list2.add(list1.get(i));
}
System.out.println(list2);
}
public static boolean selectArryList(int num){
if(num%2==0)
return true;
else
return false;
}
}
6.字符串*******
重点:
字符串变量保存的是地址值,指向的是堆中的字符数组。
对字符串变量进行修改实际上修改的是地址值,让其指向另一个字符数组,但是上一个字符串的内容没有改变。
1.字符串的创建:
重点:3种构造方法:
package day5;
public class DemoString {
public static void main(String[] args) {
String str1 = new String();//空参构造方法
System.out.println("字符串1是:"+str1);
char[] ch = new char[] {'A','B','C'};//字符数组构造方法
String str2 = new String(ch);
System.out.println("字符串2是:"+str2);
byte[] by = new byte[]{97,98,99};//底层字节数组构造方法
String str3 = new String(by);
System.out.println("字符串3是:"+str3);
}
}
2.字符串常量池
问题:为什么st1st2为true而st2st3和st1st3为false?
1.字符串常量池:
程序当中直接写上的双引号字符都只出现在字符串常量池中(在堆中),而用其他构造方法写的字符串都出现在堆中。
**2.对于基本类型来说是进行数值的比较,而对于引用类型来说==是进行地址的比较**。
也就是说st1和st2存储的地址值相等而和st3不等。
内存情况:
3.字符串的内容比较方法**
详细内容看代码里面的注释
package day5;
public class DemoEquals {
public static void main(String[] args) {
String st1 = "hello";
String st2 = "hello";
char[] ch = {'h','e','l','l','o'};
String st3 = new String(ch);
System.out.println(st1.equals(st2));
System.out.println(st2.equals(st3));
System.out.println("hello".equals(st3));//字符串常量也可以直接.equals
/*注:当一个字符串常量和一个字符串变量比较时,推荐写常量.equals(变量名),就比如上一行的代码
为什么?
如果上写 :变量名.equals(常量)
当变量为null时会出现空指针问题,会报错。因为变量为空指针时不能用 变量.的操作
String st4 = null;
System.out.println("hello".equals(st4));
System.out.println(st4.equals("hello"));
*/
System.out.println("HELLO".equalsIgnoreCase(st2));//忽略大小的的比较方法。
}
}
4.字符串的常用获取方法
具体实现看代码
package day5;
public class DemoGetString {
public static void main(String[] args) {
String st1 = "hello";
String st2 = "world";
String st3 = st1.concat(st2);//字符串的拼接:concatenate
System.out.println(st3);
char ch = st1.charAt(1);//查找索引位置的字符
System.out.println(ch);
int i ="qeqweqweqrqwetrkwjkladm,x,.Zc/".length();//返回字符串的长度
System.out.println(i);
int num = st1.indexOf("ll");//返回参数里面的字符串在原来字符串中第一次出现的索引值,如果没有出现返回-1.
System.out.println(num);
}
}
5.字符串的截取方法substring()
详细内容看代码:
package day5;
public class Demosubstring {
public static void main(String[] args) {
String st1 = "helloworld";
String st2 = st1.substring(5);//从索引值到字符串的末尾进行截取
System.out.println(st2);
String st3 = st1.substring(4,7);//从4~6的索引值进行截取范围是【a,b).
System.out.println(st3);
}
}
6.字符串的转化convert
详细内容看代码:
package day5;
public class DemoConvertString {
public static void main(String[] args) {
String st1 = "hello";
//将字符串转化为字符数组
char[] ch = st1.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.println(ch[i]);
}
System.out.println("=================");
//将字符串转化为底层的二进制数组
byte[] by = st1.getBytes();
for (int i = 0; i < by.length; i++) {
System.out.println(by[i]);
}
System.out.println("===============");
//将字符串中的某个部分用新的字符串替代
String st2 = "傻逼东西,你妈死了?";
String st3 = st2.replace("傻逼","*");
String st4 = st3.replace("你妈","*");
String st5 = st1.replace("o","*");
System.out.println(st5);
System.out.println(st3);
System.out.println(st4);
}
}
7.字符串的分割
注意:图片里面的注意事项。
具体操作看代码:
package day5;
public class DemoSplitString {
public static void main(String[] args) {
String st1 = "aaa,bbb,ccc";
String[] arr1 = st1.split(",");
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
System.out.println("==================");
String st2 = "aaa.bbb.ccc";
String[] arr2 = st2.split("\\.");//当以“.”分割时用“\\.”;
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
}
}
8.练习
1.拼接字符串
注:对字符串来说“+”是进行拼接。跟sout里面的+是一个原理。
package day5;
public class solutionConcateString {
public static void main(String[] args) {
int[] arr = {1,2,3};
String st = getString(arr);
System.out.println(st);
}
public static String getString(int[] arr){
String st = "[";
for (int i = 0; i < arr.length; i++) {
if(i==arr.length-1)
st+="world"+arr[i]+"]";
else
st+="world"+arr[i]+"#";
}
return st;
}
}
2.统计各种类型的字符在字符串中出现的次数
直接看代码:
我的:将字符串转化为yte数组然后用对应的数字进行判断
package day5;
import java.util.Scanner;
public class solutionStringKindCount {
public static void main(String[] args) {
System.out.println("请输入字符串:");
String st = new Scanner(System.in).next();
int xiaoxie = 0;
int daxie = 0;
int num = 0;
int qita = 0;
byte[] by = st.getBytes();
for (int i = 0; i < by.length; i++) {
if(by[i]<97&&by[i]>=65)
daxie++;
else if(by[i]>=97&&by[i]<129)
xiaoxie++;
else if(by[i]>=48&&by[i]<65)
num++;
else
qita++;
}
System.out.println("小写:"+xiaoxie);
System.out.println("大写"+daxie);
System.out.println("数字:"+num);
System.out.println("其他"+qita);
}
}
视频上的:将字符串转化为字符数组,与‘a’‘z’‘A’'Z’等进行比较,因为字符类型在进行运算时(包括比较大小,会自动提升称为int类型)
7.static(学起来很绕)
视频中的重点:
1.静态不能访问非静态。
原因:因为在内存中先有的静态内容,后有的非静态内容。
理解:静态内容是属于类的。直接使用类名称就能调用,而非静态需要通过对象才能调用(非静态属于对象),如果一个静态调用了非静态(属于对象的东西),系统就会不知所措(不知该使用哪一个对象的属性)。
别人的东西:主要讲了静态成员变量
非常详细
静态内存图:
重点:静态变量通过类名称访问,全程和对象没有关系。
静态代码块
**
8.Arrays
toString方法是将一个数组按照默认格式转化为字符串,能够直接sout输出。
看代码:
package day6;
import java.util.ArrayList;
import java.util.Arrays;
public class DemoArrys {
public static void main(String[] args) {
String[] st = {"abc","aaa","bcd"};
Arrays.sort(st);
System.out.println(st);
System.out.println(Arrays.toString(st));
}
}
题目:(淼)将一个随机字符串中的字符升序排列,然后倒序输出
直接上代码:
package day6;
import java.util.Arrays;
public class SolutionArrays {
public static void main(String[] args) {
String st = "adadgfgdfhdhdgg";
char[] ch = st.toCharArray();
Arrays.sort(ch);
for (int i = ch.length-1; i >=0; i--) {
System.out.print(ch[i]);
}
}
}
9.数学工具类Math
题目(淼)
package day6;
/*
计算在-10.8~5.9之间绝对值大于6或小于2.1的整数有多少个
*/
public class SolutionMath {
public static void main(String[] args) {
int cnt = 0;
double i = Math.ceil(-10.8);
double j = Math.floor(5.9);
for(int n = (int)i;n<=j;++n){
if(Math.abs(n)>6||Math.abs(n)<2.1)
++cnt;
}
System.out.println(cnt);
}
}
10.继承
继承的概述:
继承主要解决的问题是:共性抽取。
格式:
成员变量的访问:
区分三种重名:
新:super.成员变量 代表父类的那个成员变量。
具体例子:
成员方法的访问规则:
覆盖重写
1.规则
2.继承的理解(用处)
具体的代码例子:(super.show是用来继承原来手机中show方法的内容)
父子类构造方法的访问特点:
super关键字的三种用法:图片中很详细
继承的三大特点:
抽象:
1.抽象方法和抽象类的格式:
二、啊哈算法
**
1.快速排序
感觉也没什么好特殊说明的,直接来代码:
C语言:
# include<stdio.h>
int a[101];
int n;
void quicksort(int left,int right)
{
int temp,t,i,j;
if(left>right)
return;
i = left;
j = right;
temp = a[left];
while(i!=j)
{
while(a[j]>=temp && i<j)
j--;
while(a[i]<=temp && i<j)
i++;
if(i<j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i];
a[i] = temp;
quicksort(left,i-1);
quicksort(i+1,right);
}
int main(void)
{
printf("请输入长度:\n");
scanf("%d",&n);
int i;
for(i = 1;i<=n;++i)
{
printf("第%d个数据是:\n",i);
scanf("%d",&a[i]);
}
quicksort(1,n);
printf("====================\n");
for(i = 1;i<=n;++i)
{
printf("%d ",a[i]);
}
return 0;
}
java:
package day6;
import java.util.Scanner;
public class quicksort {
public static void main(String[] args) {
System.out.println("请输入长度");
int n = new Scanner(System.in).nextInt();
int[] arr = new int[n];
for (int i = 0; i < arr.length; i++) {
System.out.println("第"+(i+1)+"个数是:");
arr[i] = new Scanner(System.in).nextInt();
}
qsort(arr,0,n-1);
System.out.println("=================================");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void qsort(int[] a,int left,int right){
int t,temp,i,j;
if(left>right)
return;
temp = a[left];
i = left;
j = right;
while(i!=j){
while(a[j]>=temp&&i<j)
j--;
while(a[i]<=temp&&i<j)
i++;
if(i<j) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i];
a[i] = temp;
qsort(a,left,i-1);
qsort(a,i+1,right);
}
}
题目:第四节:小哼买书:
p21
改题目的关键就是去重。
有两种方法:
1.去重在排序。(桶排序的思想)。
2.先排序再去重(挨个遍历,如果该元素与它之前的元素的值不相等就打印)
上代码:
1.
# include<stdio.h>
int main(void)
{
int a[1001] = {};
int i,n,j,cnt = 00;
scanf("%d",&n);
for(i = 0;i<n;++i)
{
scanf("%d",&j);
a[j] = j;
}
for(i = 1;i<=1000;++i)
{
if(a[i]!=0)
{
++cnt;
printf("%d\n",i);
}
}
printf("%d\n",cnt);
return 0;
}
# include<stdio.h>
int main(void)
{
int a[101];
int n;
scanf("%d",&n);
for(i = 0;i<n;++i)
{
scanf("%d",&a[i]);
}
for(i = 0;i<n-1;++i)
{
for(j = 0;j<n-1-i;++j)
{
if(a[j]>a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
printf("%d",a[0]);//先打印第一个,从第二个开始判断
for(i = 1;i<=n;++i)
{
if(a[i]!=a[i-1])
printf("%d",a[i]);
}
return 0;
}