JAVA学习笔记

1.break/continue配合标签使用

bye:
			for(int i=0;i<=10;i++)
			{
				for(int j=0;j<=10;j++)
				{
					System.out.println(i+" "+j);
					if(j==10)
						break bye;
				}
			}

在这个代码片中当j=10时,break将会直接跳出最外层的循环,也就是整个bye标签之外。

2.数组的初始化
int型数组初始化为0
boolean型数组初始化为false
对象类型数组初始化为空

String name[]=new String[10];
String[i]=NULL;

注意NULL和空串并不等价。

3.数组的拷贝

int []num = Arrays.copyOf(key,key.length);

这句话将key数组的值从0到key.length-1复制到了num数组中。
注意第二个参数,这是指复制的长度,长度超过key.length则补零替代。

4.不规则数组的定义

int num[][] = new int [10][];
for(int i=0;i<9;i++)
	num[i] = new int[i+1];

5.final 字段
final字段必须在构造对象时初始化,之后便不允许修改。
构造对象时初试化并不代表着一定要在构造函数里初试化,以下两种初始化方法都是可行的。

public final int seven = 7;
Test(int s)
{
	seven=s;
}

6.static变量
静态变量不被某个对象所持有,而是整个类持有,所以在某个类中static变量有所改变,那么同一个对象的其他类中也会有相同的改变.

7.JAVA没有引用传递,只有值传递。

8.方法中的局部变量必须被初始化,而类中的成员变量可以不进行初始化,这样系统会自动为其初始化。

9.局部变量遮蔽问题

public class Test {
	public  int seven = 7;
	Test(int s)
	{
		 int seven=s;
	}
}

注意Test()构造函数中存在一个int seven,这时候这个整型变量seven就会遮蔽住成员变量seven,这是若调用Test test = new Test(6);,那么test对象中的seven值依然为7,这就是遮蔽现象。

为了解决这种问题可以在构造函数seven前加一个this,这样seven指的就是Test变量的seven变量了。

public  int seven = 7;
	Test(int s)
	{
		 this.seven=s;
	}

10.静态导包

import static java.lang.System.*;
import static java.lang.Math.*;

out.println((int)pow(2,7));//yes!

12.子类的引用可以指向父类变量,但是父类变量依然无法调用子类中的方法。

Test t = new Test();
child_Test ct = new child_Test();
ct.child_method();
t = ct;//yes!
t.child_method();//error!

如图,child_Test是Test类的子类,父类变量t可以指向子类的引用ct,但是t依然无法调用子类中的方法child_method。

13.final类不允许继承,且将类置为final时,其中所有的方法都会变成final方法,但其中的成员变量不会

14.关于父类强制类型的转换。
第一种不能转换的情况

Test t = new Test();
child_Test ct=(child_Test)t;//会出现ClassCastException异常,一个完全的父类不能强制转换为儿子

第二种可以转换的情况

Test t = new child_Test();
child_Test ct=(child_Test)t;//yes!t本质上还是一个子类变量,可以强制转为儿子

15.Abstract类不能实例化对象,但可以创建一个具体子类的对象。
这点和Interface相同

16.Protected允许本包其他类可见。注意其他包的类无法访问,其他包中的子类也无法访问

17.参数数量可变的函数

 public static double max(double...val)//关键在于这三个点
    {
    	double large = Double.NEGATIVE_INFINITY;
    	for(double v:val)
    	{
    		if(v>large)
    			large = v;
    	}
    	return large;
    }
System.out.print(max(0.1,4.7,8.9,-12.5));//max中想传多少个数字都没问题

18.java中对对象类型的数组的排序必须实现Comparable接口中的CompareTo方法。

public class Test implements Comparable<Test>{
	public int key;
	Test(int key)
	{
		this.key = key;
	}
	
	public int compareTo(Test t)
	{
		return Integer.compare(t.key, key);
	}
}

注意是必须实现接口类中的方法,不能自己再去写一个CompareTo方法。

19.java自定义排序的两种方式
① 待排序的对象是实现了Comparable接口的类的实例

public class Test implements Comparable<Test>{
	public int key;
	Test(int key)
	{
		this.key = key;
	}
	
	public int compareTo(Test t)
	{
		return Integer.compare(t.key, key);
	}
}

② 比较器方式,比较器是一个实现了Comparator类的实例。

public class Test implements Comparator<String>{
	@Override
	public int compare(String arg0, String arg1) {
		// TODO Auto-generated method stub
		return arg0.length()-arg1.length();
	}
}

注意Test只是一个比较器,而不是第一种方法中包含待排对象的类。
调用时要把Test比较器传入sort函数。

public static void main(String args[]) {
		// TODO Auto-generated method stub
		String[] str = {"abc","bd","z"};
		Arrays.sort(str,new Test());
		for(int i=0;i<3;i++)
			System.out.println(str[i]);
	}

20.关于集合的遍历器
不能在调用next()方法之前调用remove()方法,否则会出现IllegalStateException异常,每次remove的元素是上次next方法得到的元素。

        Queue q = new LinkedList<Integer>();
		q.add(1);
		q.add(2);
		Iterator<Integer>it = q.iterator();
		while(it.hasNext())
		{
			it.remove();//Wrong!!
			int n = it.next();
			//it.remove();
			System.out.println(n);
		}

21.ListIterator类的listlterator方法返回了一个迭代器对象,这个迭代器可以和普通的iterator迭代器一样遍历linklist,并且还有add函数,可以在当前迭代器之前插入元素,利用这一点可以不停向linklist头部插入元素。

        LinkedList<Integer> l = new LinkedList<Integer>();
	    l.add(1);
	    l.add(2);
	    l.add(3);
	    ListIterator<Integer>iterator = l.listIterator();
	    iterator.add(10);
	    iterator = l.listIterator();
	    while(iterator.hasNext())
       {
    	   int x = iterator.next();
    	   System.out.println(x);
       }

22.优先队列的自定义排序

要写一个实现了Comparator接口的类,通过这个类中的compare方法控制优先队列。

public class Test implements Comparator<String>{
	@Override
	public int compare(String arg0, String arg1) {
		// TODO Auto-generated method stub
		return arg0.length()-arg1.length();//长度短的字符串在前面
	}
}

将这个Test类的对象放到priorityqueue中的构造函数中。

        Test test  = new Test();
		var queue = new PriorityQueue<String>(test);
		queue.add("dog");
		queue.add("zysdasfsdff");
		queue.add("is");
		while(queue.isEmpty()==false)
		{
			System.out.println(queue.poll());//poll()取头部并退队一个元素,等于peek()+remove().
		}

23.注意hashmap中的getOrdefault方法,用这个函数可以控制map中返回的初始值。

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		var map = new HashMap<String,String>();
		map.put("zyf", "girl");
		System.out.println(map.getOrDefault("fql", "boy"));
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值