1.泛型
一种java的语言特征
使用泛型更安全,适用更广泛
*自定义泛型
import java.util.*;
class GenericTreeClass {
public static void main(String[] args){
TNode<String> t = new TNode<>("Roo");
t.add("Left"); t.add("Middle"); t.add("Right");
t.getChild(0).add("aaa");
t.getChild(0).add("bbb");
t.traverse();
}
}
public static void main(String[] args){
TNode<String> t = new TNode<>("Roo");
t.add("Left"); t.add("Middle"); t.add("Right");
t.getChild(0).add("aaa");
t.getChild(0).add("bbb");
t.traverse();
}
}
class TNode<T>
{
private T value;
private ArrayList<TNode<T>> children = new ArrayList<>();
{
private T value;
private ArrayList<TNode<T>> children = new ArrayList<>();
TNode(T v) { this.value = v; }
public T getValue() { return this.value; }
public void add(T v) {
TNode<T> child = new TNode<>(v);
this.children.add(child);
}
public TNode<T> getChild(int i) {
if ((i < 0) || (i > this.children.size())) return null;
return (TNode<T>)this.children.get(i);
}
public T getValue() { return this.value; }
public void add(T v) {
TNode<T> child = new TNode<>(v);
this.children.add(child);
}
public TNode<T> getChild(int i) {
if ((i < 0) || (i > this.children.size())) return null;
return (TNode<T>)this.children.get(i);
}
public void traverse() {
System.out.println(this.value);
for (TNode child : this.children)
child.traverse();
}
}
System.out.println(this.value);
for (TNode child : this.children)
child.traverse();
}
}
*自定义泛型方法
import java.util.*;
class GenericMethod {
public static void main(String[] args){
Date date = BeanUtil.<Date>getInstance("java.util.Date");
System.out.println(date);
}
}
public static void main(String[] args){
Date date = BeanUtil.<Date>getInstance("java.util.Date");
System.out.println(date);
}
}
class BeanUtil{
public static <T> T getInstance( String clzName ){
try
{
Class c = Class.forName(clzName);
return (T) c.newInstance();
}
catch (ClassNotFoundException ex){}
catch (InstantiationException ex){}
catch (IllegalAccessException ex){}
return null;
}
}
public static <T> T getInstance( String clzName ){
try
{
Class c = Class.forName(clzName);
return (T) c.newInstance();
}
catch (ClassNotFoundException ex){}
catch (InstantiationException ex){}
catch (IllegalAccessException ex){}
return null;
}
}
2.协变和逆变
协变用于获取,用于out,用于Producer,逆变用于加入,用于in,用于Consumer
3.遍试
穷举
例如求水仙花数
public class All_153
{
public static void main(String args[]){
for( int a=1; a<=9; a++ )
for( int b=0; b<=9; b++ )
for( int c=0; c<=9; c++ )
if( a*a*a+b*b*b+c*c*c == 100*a+10*b+c)
System.out.println( 100*a+10*b+c );
}
}
{
public static void main(String args[]){
for( int a=1; a<=9; a++ )
for( int b=0; b<=9; b++ )
for( int c=0; c<=9; c++ )
if( a*a*a+b*b*b+c*c*c == 100*a+10*b+c)
System.out.println( 100*a+10*b+c );
}
}
遍试算法基本模式: for(;;){ if();}
4.迭代
多次利用同一公式进行计算,将计算结果再带入公式进行计算,让解更精确
public class Sqrt
{
public static void main(String args[]){
System.out.println( sqrt( 98.0 ) );
System.out.println( Math.sqrt(98.0) );
}
{
public static void main(String args[]){
System.out.println( sqrt( 98.0 ) );
System.out.println( Math.sqrt(98.0) );
}
static double sqrt( double a ){
double x=1.0;
do{
x = ( x + a/x ) /2;
System.out.println( x + "," + a/x );
}while( Math.abs(x*x-a)/a > 1e-6 );
return x;
}
}
double x=1.0;
do{
x = ( x + a/x ) /2;
System.out.println( x + "," + a/x );
}while( Math.abs(x*x-a)/a > 1e-6 );
return x;
}
}
迭代基本模式 while() { x=f(x); }
5.递归
调用自身
递归求阶乘
public class Fac
{
public static void main(String args[])
{
System.out.println("Fac of 5 is " + fac( 5) );
}
static long fac( int n ){
if( n==0 ) return 1;
else return fac(n-1) * n;
}
}
{
public static void main(String args[])
{
System.out.println("Fac of 5 is " + fac( 5) );
}
static long fac( int n ){
if( n==0 ) return 1;
else return fac(n-1) * n;
}
}
递归基本模式 f(n) { f(n-1); }
6.回溯
回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
基本模式 x++; if(...) x--;
明天学习内容:
多线程的创建和控制